用C語言開發NES遊戲(CC65)18、Sprite Zero 零號精靈

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

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

這個不是很好解釋,超級瑪麗1用了這個功能,後來很多人都把這個作爲一個遊戲的標準來對待。

屏幕頂端固定,底屏滾動,就可能是sprite zero的分割效果。

 

sprite zero指的是OAM中的第一個sprite,地址是 0-3.PPU第一次在背景的非透明像素上看到sprite zero的非透明像素時候,標記了一個標誌(寄存器$2002).我們可以查找此標誌,並用他來計算中間屏幕的時間,如x的滾動。

 

等待這個標誌非常消耗CPU,最好使用mapper映射器生成IRQ,如MMC3/MMC5的掃描線計數器,Konami VRC 2,4或6掃描線計數器。卡帶可以幫我們計數,而不需要輪詢2002,並且可以每幀多次拆分。

 

但是,我決定不在本教程中介紹IRQ。您需要學習ASM才能使用它們,因爲IRQ代碼需要用ASM編寫。

 

無論如何。一旦它命中,你知道PPU在屏幕上的特定行上,你可以改變滾動位置。

 

寫2005兩次,只能改變X滾動。

 

我們在每個幀上做的第一件事是立即輪詢sprite zero,如果錯過了很有可能讓遊戲崩潰,發送實際X.它將調整滾動中間屏幕。

 

split(scroll_x);

 

我們必須調整屏幕繪圖代碼,不要覆蓋屏幕頂部。現在我們有一個穩定的HUD,我們可以繪製我們的統計數據。

 

 

https://github.com/nesdoug/21_Sprite_Zero/blob/master/sprite_zero.c

 

https://github.com/nesdoug/21_Sprite_Zero

 

而且,爲了與自己發生衝突,我們實際上可以通過複雜的2006 2005 2005 2006技巧改變Y卷中畫面。我最後這個(屏幕的底部),這更危險,因爲在運行此功能之前跑過幀的末尾,整個遊戲可能會崩潰,如果它從未發現Sprite零命中。

 

但是,我想證明這是可能的,即使你永遠不應該使用它。也許對於比我更勇敢的人。也許是在垂直滾動遊戲中的屏幕頂部。

 

無論如何,我做了這個功能......

 

xy_split(X,Y);

 

我不得不對平臺遊戲進行一些更改,因爲整個屏幕現在對齊得更高,所以我不得不調整bg碰撞的y值。這可能不是理想的設置,但我只想展示它。我把屏幕的頂部放在屏幕的底部。

 

這是一個例子。我想我應該使用垂直滾動代碼來更好地展示這一點。這可以通過常規拆分代碼完成。

 

 

https://github.com/nesdoug/22_XY_Split/blob/master/xy_split.c

 

https://github.com/nesdoug/22_XY_Split

 

而且我非常擔心在遊戲中導致滾動錯誤的減速,我最終沒有在最終遊戲中使用精靈零點擊,最後出現。這些示例工作正常,因爲沒有太多的遊戲邏輯,但只要我們添加一些敵人並移動它們並且必須檢查碰撞,邏輯就會超過1幀,而減速會導致每個第2幀出現晃動錯誤。

 

值得注意的是,Mojon Twins(na_th_an)在他的許多遊戲中都使用了相同的sprite零分割,並告訴我如果滾動問題發生就重構。將長任務拆分爲2個不同的框架。例如,僅檢查一幀的一半碰撞。

 

 

我依舊很懶。。。就前幾行湊合翻譯了下,後面的以後再改了,實在看不懂這個作者的鳥語,寫的太精簡了

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