用C語言開發NES遊戲(CC65)19、更多的事情

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

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

 

隨機數。

 

NES沒有很好的方法來生成隨機數。

 

neslib裏面有rand8() 和 rand16(),但是他生成方式有問題。他在啓動時使用常量,這就意味着每次重啓後的隨機數都會是相同的。

 

我編寫了一個將幀數統計放入到隨機數計算的方法。

 

seed_rng()

 

使用幀數作爲隨機數種子。所以啓動的時候他而不是隨機的,而是通過用戶的輸入指令觸發他。

 

比如 “PRESS START”

 

 

https://github.com/nesdoug/23_Random/blob/master/Random.c

 

https://github.com/nesdoug/23_Random

 

注意:seed_rng() 僅設置種子的低字節,這樣就有了256個結果。如果要設置兩個種子字節,請使用1個用戶輸入來觸發第一個seed_rng() ,然後調用rand8() 3-4次,然後獲取用戶輸入以觸發第二個seed_rng()

 

 

 

Mappers

到目前爲止,我們一直在使用最基本的映射器NROM。我們在crt0.s文件中定義了ines header頭信息。

在“HEADER”段中這是一個重要的配置信息在 .cfg文件中。如果想要改變Mapper我們只需要改變配置文件中的Mapper配置,NES_MAPPER,value =#。

 

爲什麼要修改Mapper呢?如果我們想要更多的PRG或者CHR或者更多的RAM,我們需要具有這些功能的特殊遊戲卡帶。

 

擁有了更大的ROM文件,將一部分重新映射到CPU的$8000地址來實現(8000是舉例)

 

用C編程的話,使用Mapper功能很費勁。一個函數可能會調用另外一個函數,如果調用不到,就會導致遊戲崩潰。

 

你可能需要將數據放到幾個小的塊中,並在遊戲進行的過程中交換位置。你還可以做的是將音樂數據放到備用的庫中。

這個有些高級,暫時先跳過了。

 

說些簡單的。

 

CNROM,允許切換整個圖形(下面有例子)

 

AxROM和UxROM沒有CHR ROM。圖形都位於PRG ROM中存放(PRG的體積也會比較大),使用的時候需要將他們加載到 CHR的RAM中才能使用。AxROM允許您更改整個$8000-$FFFF bank。UNROM固定了$C000-$FFFF,並允許您更改$8000-BFFF bank。比起AxROM我更喜歡UNROM,因爲你可以將你的C代碼放在固定的存儲區中方便數據的使用,用C開發AxROM非常困難,很多地方只有ASM彙編才能實現。

 

在UNROM上有一個自制軟件版本,mapper 30,UNROM 256,比任何商業遊戲都要大得多。NESmaker使用它。用C開發的話會很有用。

 

Mojon twins 用標準的UNROM開發出了至少1個完整的遊戲。

http://forums.nesdev.com/viewtopic.php?p=169438#p169438

 

對於任何Mapper,你都可以在頭信息配置$6000-7fff是RAM地址。byte 10, bit 4

如果你在啓動的時候讀寫此區域,很多模擬器都會認爲遊戲擁有PRG RAM芯片。

如果你希望你的遊戲有記錄功能(電池記錄RAM),你需要在頭信息配置 byte 6, bit 1

 

GNROM,Mapper編號66(或Wisdom Tree / Color Dreams,mapper 11)可以交換整個PRG和CHR。

當然這與AxROM一樣的問題,一個數據塊中的方法調用另一個數據塊中的方法,而且還要確保整個CRT庫一直可用。

 

 

更高級的Mapper,比如MMC1

cppchriscpp 在他的C項目中使用了MMC1 (SxROM)

https://github.com/cppchriscpp/nes-starter-kit

 

一些bank塊轉換的代碼

https://github.com/cppchriscpp/nes-starter-kit/tree/master/source/library

 

您可以更改$8000-bfff區域。你可以改變tileset(ppu 0-fff或ppu 1000-1fff)。

並且您可以將鏡像從H更改爲V。這個功能非常牛X

 

更高級,MMC3(TxROM)。您可以更改$8000-9fff和/或$a000-bfff bank。

你可以更改部分CHR ROM。小到只有$800 大小。可以用在動畫背景(瀑布)

您可以使用掃描線計數器IRQ進行多次背景分割。但是 IRQ需要ASM彙編寫。

 

我做了一個簡單的CNROM示例。有4個CHR文件,我只是在它們之間切換,並更改調色板。

 

CNROM有個技術問題,叫做總線衝突。Mapper通過寫rom來工作

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