用C語言開發NES遊戲(CC65)20、再做一個遊戲

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

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

我不打算用分屏了。一旦屏幕中的敵人和硬幣多了以後,遊戲就會變慢,屏幕會來回滾動,結果會很糟糕。

 

不用分屏,不用擔心速度變慢(每幀中增加更多的遊戲邏輯)

 

增加背景音樂和音效,遊戲中我們在增加敵人和硬幣。當和硬幣碰撞的時候使用sfx音效,當和敵人碰撞的時候使用噪聲音效。

 

我用yy-chr畫了一些簡單的敵人,定義了一些metasprite對象。我們使用 nes screen tool這樣做非常簡單,我從另外一個metasprite複製粘貼到tile裏。

 

 

原版使用數組方式定義所有內容應該是個很好的選擇,但是6502太慢了。快的方法是使用大量小於256字節的char數組,就像下面這樣。

 

 


 

 

#define MAX_COINS 16

unsigned char coin_x [MAX_COINS];

unsigned char coin_y [MAX_COINS];

unsigned char coin_active [MAX_COINS];

unsigned char coin_room [MAX_COINS];

unsigned char coin_actual_x [MAX_COINS];

 

 

 

我優化了對象初始化的代碼,每行只放一個數組來讓代碼的執行速度更快。6502每次只能執行一個指針。如果使用單行的數組的賦值會讓執行速度慢5倍。

 

這樣是不推薦的方式

coin_y[index] = pointer[index2];

 

應該這樣做

temp1 = pointer[index2]; //獲取1byte的數據

coin_y[index] = temp1;

 

信不信由你,這樣寫的話代碼的執行效率可以更快。如果我們想要遊戲中有多個移動的物體和屏幕滾動,必須要考慮優化代碼。

 

因此,每幀我會檢查每個對象是否在屏幕的顯示範圍內,並將它們標記爲活動。只在活動狀態時候移動它們,檢查碰撞是否有效,並在活動的時候繪製到屏幕上顯示。

 

check_spr_objects() 這個方法用來檢查每個對象是否顯示再屏幕上,當結果是true標記它們是活動的。

 

現在,跟移動相關的代碼變得簡單了,小怪根據主角的位置改變移動方向。後面我會考慮優化這部分。

 

目前,我使用 y=0xff作爲 “不存在”(TRUN_OFF),因此,不顯示敵人是通過將它們的Y改爲0xff的方式處理的。當然還有其他方式,不過我這麼做的。我們不需要敵人從屏幕下方跳進來,就讓他能正常運行。

 

我做的另一件事是添加遊戲狀態。暫停模式,改變音樂,動作停止,通過修改顏色亮度讓屏幕變暗。如果所有的顏色都設置只會讓顏色變暗一點點。

 

color_emphasis(COL_EMP_NORMAL);

 

 

color_emphasis(COL_EMP_DARK);

 

 

https://github.com/nesdoug/25_Platform5/blob/master/platformer5.c

 

https://github.com/nesdoug/25_Platform5

 

https://nesdoug.com/2018/09/11/21-finished-platformer/

 

好了,現在基本上能工作了,後面要做完整的關卡了。

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