粘貼到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/
好了,現在基本上能工作了,後面要做完整的關卡了。