14、游戏平台

我们要做的是向右滚动显示。

游戏吸引人的地方在哪里呢?重力。

我们需要16bit来记录 X和Y 的速度和位置。低字节表示像素的位置。

我使用了有符号的 int值 (signed int 他的长度是2)

重力,每一帧给Y加一点速度,但不要太快,否则我们可能会落到地板以下,所以我们有一个最大的加速度。

我在.h文件中定义了这些物理变量。这样微调操作也会比较容易,这些都是 16bit的数值,低字节是子像素。最大加速度是2.25

#define ACCEL 0x20

#define GRAVITY 0x50

#define MAX_SPEED 0x240

#define JUMP_VEL -0x600

#define MAX_RIGHT 0xb000

我不希望所有的平台都是砖头,四面碰壁。我希望的是可以跳过平台,然后落在平台上,所以我定义了一个碰撞数组,并且定义了每个元数据的行为方式。

#define COL_DOWN 0x80

#define COL_ALL 0x40

const unsigned char is_solid[]={

0,

COL_DOWN,

COL_ALL+COL_DOWN,

COL_DOWN,

COL_DOWN,

COL_DOWN,

0,

0,

0,

0,

0,

0

};

我不得不手动编辑这些,有点尴尬。。。

背景碰撞代码解析碰撞位,并根据方向传送碰撞信号。如果Y速度为负值(往上跳),则忽略脚部的碰撞

if(BoxGuy1.vel_y > 0) {

BoxGuy1.vel_y = 0;

}

And only sets feet collisions if the feet are just barely inside the block.

(看不懂,自求多福了)

if((temp3 & 0x0f) > 3) collision_D = 0;

这就是为什么Y的速度不能大于每帧3个像素的原因。如果更快的速度,就会错过碰撞直接传过去了。

我用NES Screen Tool制作了一些新的图块,截图保存为metatiles.png,作为tileset导入到 Tiled Map地图编辑器中。

制作一些关卡,导出成csv文件,然后转换为C的数组,导入到代码中。

现在看起来像是个游戏了

https://github.com/nesdoug/17_Platformer