夢開始的地方——FC游戲開發(fā)指南(5)導(dǎo)入并顯示圖片
上期鏈接:https://www.bilibili.com/read/cv13580523
上一次我們學(xué)習(xí)了FC像素畫的繪制方法,理解了Tile、調(diào)色板的概念,以及制作流程。
這次我們試著引入chr文件與調(diào)色板,讓它們在游戲中實(shí)際顯示出來。主要涉及三個問題:導(dǎo)入chr,導(dǎo)入調(diào)色板,使用它們。
1、保存CHR和調(diào)色板
在YY-CHR中,選擇 文件 -> 保存就可以保存CHR文件,后綴為chr。
然后保存調(diào)色板,調(diào)色板文件格式不統(tǒng)一,非常亂,給初學(xué)者帶來很多困擾。這里我找到最簡單的辦法是保存“自定義調(diào)色板”。

自定義調(diào)色板是一個非常短小的二進(jìn)制數(shù)據(jù)文件,里面只有顏色編號,別的什么都沒有。
2、導(dǎo)入繪制好的CHR到游戲中
首先說明:FC游戲rom(卡帶)作為一個整體,它的代碼、圖形、調(diào)色板都是要整體保存在一塊兒的。咱們開發(fā)者要指定清楚具體怎么擺放,具體包括四類數(shù)據(jù):代碼、chr、調(diào)色板和地圖(map)。
只要寫清楚配置,編譯器會自動幫我們擺好。具體做法:
1、修改匯編文件crt0.s
用任意編輯器打開crt0.s文件,它的內(nèi)容像這樣:

它是最主要的匯編文件,起到匯總所有資源的作用。未來我們經(jīng)常需要修改它。
現(xiàn)在是導(dǎo)入我們新建的chr文件,建議大家在修改《移動》的crt0.s文件時,參考《迷宮不迷》的crt0.s文件,對比學(xué)習(xí)。修改時?細(xì)心?一點(diǎn)。
具體步驟:
1、在開頭第9行后面加一行,加上自己的調(diào)色板符號,該符號是導(dǎo)出給C語言用的:
2、在140行左右,在rti和“hardware vectors”之間,插入具體的調(diào)色板數(shù)據(jù)。
3、在文件最后,替換掉原來的chr。刪除或者注釋原來的,寫上新的:
編譯測試,看看chr是不是已經(jīng)被替換掉了。以前是“維京”的字符,現(xiàn)在已經(jīng)變成其它字符了。
3、用代碼顯示指定的tile
比如說,在上一節(jié)我改完的chr是下圖這樣:

我現(xiàn)在想要用cprintf函數(shù)畫出小飛機(jī),怎么做呢?
把鼠標(biāo)停在飛機(jī)左上角的tile上,看編輯器下方是不是有個ADF[80] = 80的提示?它說明該tile的編號是16進(jìn)制的80,記作0x80。以此類推,飛機(jī)占9個tile,分別是0x80、0x81、0x82,0x90、0x91、0x92,0xA0、0xA1、0xA2。
在上次程序的基礎(chǔ)略作修改,就得到了一架可以上下左右運(yùn)動的飛機(jī):

代碼:
4、加載調(diào)色板
飛機(jī)倒是出來了,但是顏色不太對。
我們畫的飛機(jī)是藍(lán)白色,怎樣使用自定義調(diào)色板my_chr.dat呢?
其實(shí)我們在匯編文件crt0.s里已經(jīng)設(shè)置好了調(diào)色板_my_chr_dat,現(xiàn)在只要在C語言里導(dǎo)入它就行了。
在C語言開頭加上外部變量定義:
這個變量名必須是my_chr_dat,為什么呢?因?yàn)槲覀冊赾rt0.s里寫的是_my_chr_dat,二者必須完全對應(yīng),注意一個開頭有下劃線另一個沒有。編譯器就是這么規(guī)定的。
改一下代碼:
#include "mylib.c"extern u8 my_chr_dat;// 手柄輸入變量,變量名不要改,與mylib.c保持一致u8 key, okey; // 當(dāng)前輸入值,上一幀輸入值u8 x, y;// 程序入口void main(){ int t = 0; // 初始化 key = 0; okey = 0; x = 10; y = 10; // 加載背景調(diào)色板 // 如果不先關(guān)閉顯示,會導(dǎo)致時序混亂而加載錯誤 disable_graphics(); // 關(guān)閉顯示 load_BG_palette((u8*)(&my_chr_dat)); enable_graphics(); // 打開顯示 // ★ 主游戲循環(huán) while (1)…………后略………………
之后飛機(jī)顏色就正常啦

總結(jié)
chr圖形最終以二進(jìn)制方式直接被包含在匯編文件中。
調(diào)色板以二進(jìn)制方式直接被包含在匯編文件中,且暴露出一個鏈接符號給C語言,C語言就可以引用調(diào)色板的地址。
加載背景時需要關(guān)閉顯示、開啟顯示。必須寫這一步驟,是硬件設(shè)計(jì)決定的。
★預(yù)告:精靈(sprite)
實(shí)際上,將圖片顯示到背景中意義不是很大。FC游戲開發(fā)真正的重點(diǎn)在于“精靈”。精靈是PPU最核心的功能,下一期我們開始重點(diǎn)介紹精靈的原理與使用方法。
(本文作者 @goodorc_gamedev。歡迎加入游戲開發(fā)群歡樂攪基:1082025059
對游戲開發(fā)感興趣的童鞋可戳這里進(jìn)一步了解:http://www.levelpp.com/)