世嘉MD游戏开发【七】:绘制图片,drawImage
這一期講繪制圖片。
上一期講的是繪制tile,還要用那個不怎么好用的工具導出數組數據,很繁瑣,這次就不用那個蹩腳的工具了,隨便一個圖片用photoshop處理一下就可以了,對于圖片的要求有這么幾點:
1.圖片分辨率必須是8的整數倍,像8,16,32這樣的都可以,9,10,12,31這樣的就不行了,編譯會報錯。
2.圖片的顏色數不能超過16,超過16也會編譯報錯,一個普通圖片怎么用ps處理成16種顏色呢,看下圖:
還有一個很重要的細節說一下:
SGDK一共有4組調色板,每組有16種顏色,看過前面一期的應該都知道了,如果圖片用ps索引顏色后不足16種顏色,可以手動把剩下的空顏色設置成別的顏色補齊16種,要不然可能會出現不可預知的問題,比如文字不會顯示出來,因為文字用到的顏色默認是最后一個顏色,所以下圖中的情況應該是盡量避免的:
不讓有空顏色我們怎么弄透明度呢,默認第一個顏色是背景色,所以只要用第一個顏色畫過的地方都會是透明的。
圖片處理完之后保存為pic.png格式,放到工程目錄下的res文件夾備用。
我的圖片和調色板如下圖所示:
在res文件夾里空白地方鼠標右鍵新建一個txt文檔,重命名為picture.res,名字大家自己隨便寫,后綴是.res就可以,當然不能有中文出現,用記事本打開res文件,里面寫如下代碼:
IMAGE pic "pic.png" 0寫完保存。
這個文件就相當于聲明了一些變量,IMAGE代表變量的類型,還有其他類型,比如SPRITE,WAV等等,pic是變量的名字,在代碼中用到這個資源的時候就可以寫pic,"pic.png"是路徑,res文件夾就是根目錄(不是工程根目錄,只是資源根目錄),如果這個圖片在res/picture文件夾里,那么這個路徑應該寫作:"picture/pic.png",最后這個0意思就是壓縮級別,0是不壓縮,詳情見SGDK/bin目錄下的rescomp.txt文檔或者SGDK自帶的范例。
然后用vscode打開工程,在src文件夾里新建main.c,代碼如下:
#include <genesis.h> #include <vdp.h> #include "picture.h" //res目錄中的picture.res會自動生成picture.h文件int main() {//在屏幕上2,0位置繪制文字VDP_drawText("Draw Image", 2, 0);/*聲明一個unsigned short類型的變量index,TILE_USERINDEX是一個系統常量,它的值是16,意思是VRAM(顯存)中的第16個tile塊這個位置。一般都從第16個開始用,前面15個或許有其他用途,但是暫時我沒發現前15個位置不能用,我看好多代碼里都是空出前15個位置,貌似是把前15個tile留著給背景用,我覺得這都是游戲制作者自己的設計,哪幾個位置給背景哪幾個位置給精靈都是設計好的,我們自己也可以設計自己的位置,如果你要從1開始用也可以,目前我沒發現有啥不妥,但是0這個位置盡量不要用。*/u16 index = TILE_USERINDEX;//設置調色板,把圖片的調色板數據賦值給PAL0VDP_setPalette(PAL0, pic.palette->data);/*先來解釋一下TILE_ATTR_FULL這個函數,這個函數的意思是編碼tile的屬性給tilemap數據,第一個參數PAL0是第一個調色板,第二個參數0是優先級是0,優先級高的則會顯示在上面,優先級低的就顯示在優先級高的下面,也就是顯示層級,第三個參數FALSE是垂直軸鏡像,這里就不鏡像了,所以是FALSE,第四個參數FALSE是水平軸鏡像第五個參數上面已經解釋過了,就是顯存中tile塊的位置VDP_drawImageEx:第一個參數是卷軸,世嘉MD有兩層卷軸,一個PLAN_A,一個PLAN_B,這倆卷軸喜歡哪個用哪個第二個參數是const Image*,是一個圖片類型的指針,那么很自然的就要傳一個地址進去第三個參數略第四五個參數是網格坐標,8x8為一個單位第六個參數是要不要加載調色板,這里一般都是不加載調色板的,因為調色板我們前面都手工設置過了第七個參數是CPU繪制還是DMA繪制VDP_drawImageEx有一個返回值,是unsigned short類型的,也就是u16類型,當內存不足夠加載圖片的時候就會返回FALSE,也就是0,返回值不是0那就是加載成功了*/VDP_drawImageEx(PLAN_A, &pic, TILE_ATTR_FULL(PAL0, 0, FALSE, FALSE, index), 0, 1, FALSE, CPU);//每次用了index這個值的時候得知道用了多少個tile,不然下次用的時候你也不知道用到哪個位置了,亂寫可不行,寫的那個位置要是已經有了tile,//那么已經有的那個tile就會被覆蓋,這就不行了,全亂套了,numTile這個值的意思是:這個圖片有幾個不重復的tile塊組成,不一定是按分辨率算出來的tile塊,注意是不重復的tile塊index += pic.tileset->numTile;while (1){VDP_waitVSync();}return 0; }編譯,得到rom.bin,用模擬器運行效果如下:
這個圖是街機游戲街頭霸王Alpha3里面的科迪,科迪的調色板是20色,MD只支持16色,索引后就丟失了4種顏色,所以有些失真,但總體效果還可以。
未完待續。。。
復古游戲開發群:879063892
總結
以上是生活随笔為你收集整理的世嘉MD游戏开发【七】:绘制图片,drawImage的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 属鸡人一生运势
- 下一篇: 【安卓大作业】Android Studi