粘貼到CSDN格式沒調,想看格式好的點下面
https://happysoul.github.io/nes/nesdoug/
我們要做的是向右滾動顯示。
遊戲吸引人的地方在哪裏呢?重力。
我們需要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