用C語言開發NES遊戲(CC65)21、完成一個遊戲

粘貼到CSDN格式沒調,想看格式好的點下面

https://happysoul.github.io/nes/nesdoug/

我要做的第一件事是標題屏幕。這部分快速搞定,畢竟只是爲了展示一下。我用 NES screen tool創建了一個圖,並保存壓縮成 RLE.h文件 “title.h”。標題只是等待用戶按下 START按鈕,循環顏色讓其顯示不那麼無聊。

 

 

 


 

 

temp1 = get_frame_count();

temp1 = (temp1 >> 3) & 3;

pal_col(3,title_color_rotate[temp1]);

 

 

 

title_color_rotate 是4種配色數組。

 

我不想一次創建一個room,所以我做了一個很長的 Tiled文件,並導出csv,然後用 CSV2C_BIG.py將其轉變爲數組。

 

 

(我原本在底部自動生成一個指針數組,但我最終沒用他,刪了以後做了一個更大的指針數組,包含了所有的關卡)

 

 


 

 

const unsigned char * const Levels_list[]={

Level1_0,Level1_1,Level1_2,Level1_3,Level1_4,Level1_5,Level1_6,Level1_7,

Level2_0,Level2_1,Level2_2,Level2_3,Level2_4,Level2_5,Level2_6,Level2_7,

Level3_0,Level3_1,Level3_2,Level3_3,Level3_4,Level3_5,Level3_6,Level3_7

};

 

 

 

我使用了2中敵人和2中硬幣。

 

然後我在其上創建了一個包含所有sprite精靈對象的圖片(背景透明),在Tiled中將其作爲單獨的tileset導入,添加了另一個層放置Sprite精靈對象。我將敵人放在第二層(作爲圖塊),並導出另一個csv文件,然後我寫了另一個.py文件 “CSV2C_SP.py” 來將他們轉爲數組。

 

 

我最終沒有向這樣使用。混合了硬幣和敵人,我希望他們在不同的數組中。因此我將不同類型的對象剪切並粘貼到了2個不同的數組中。這時候.py文件的用途體現出來了。

 

這些數組可能需要再稍微編輯下

 

我做了2中敵人,怪物也會跟牆壁發生碰撞。最初我想用跟主角一樣的代碼,但我覺得這樣的檢查方式會太慢,所以我寫了一個更簡單的代碼。

 

bg_collision_fast() 這個只會檢查2個點,而不是4個點。

 

寫的怪物的AI不是很好,他們只會X軸移動,Y方向不會動,如果放在一個平面上他們會像鬼一樣飄在上面,以後我可能會優化一下這個邏輯。

 

另外一個敵人只是來回跳。下火時候會檢查下面的地面,停到地面上,使用和主角相同的判斷代碼。

 

bg_check_low();

 

第二種硬幣只是一種結束標記。我想我們可以添加一些到達關卡最後時候的音樂,不過目前只會讓屏幕淡化成黑色。

 

添加不少模式,狀態了。標題,遊戲,暫停,結束,切換(一關結束到另一關)。

 

調試效果也挺好。我開始還擔心跑過頭了。

我用了gray_line() 來檢查我們在屏幕上的距離。

 

 

我不想讓敵人AI太複雜,也不想在一個屏幕上放置太多物體,這樣會讓我們的遊戲變慢,所以我們需要測試,看我們的屏幕能夠放多少個敵人。結果大概是7-8個,這比我想的要好很多。

 

最後,我將硬幣數量作爲精靈放到左上角顯示,我沒有放的太高,因爲一些老電視可能看不到,距離頂端16個像素剛好。

 

最後差點忘了精靈shuffing代碼。

重點!!sprite精靈頁面中,每條水平線只能有8個精靈。我們必須在OAM緩衝區內對每個對象的位置做修改,這樣就不會讓敵人完全消失。

 

最簡單的辦法是每幀修改初始位置。而不是sprid=0,你可能會用sprid=rand8()*4,或者類似的方法,但這不是很好的方法。

 

我決定每幀以不同的順序瀏覽敵人列表(並在精靈繪圖代碼的頂部保持sprid = 0)。

 

 


 

 

const unsigned char shuffle_array[]={

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,

15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,

0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15,

15,13,11,9,7,5,3,1,14,12,10,8,6,4,2,0

};

 

 

 

第一遍,他會向前走0-15,然後是返回來。。。

我媽們要保證同一水平線上沒有太多硬幣。

 

我們的遊戲有3個關卡,每關8屏。本來還可以更大一點。每個關卡需要2000個字節。我們剩下大概16000個字節,所以我們還能增加7-8個關卡,總共10個關卡。如果我們想要更多關卡,就要考慮不同的mapper或者使用壓縮算法。

 

 

https://github.com/nesdoug/26_Full_Game/blob/master/full_game.c

 

https://github.com/nesdoug/26_Full_Game

 

差不多就這些了,去搞遊戲吧。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章