【主角】
主角和背景比起來,你肯定覺得背景會更簡單。錯!主角才簡單得要命。
製造主角只需要向SPR-RAM寫入一點點內容(主角的x,y座標,tile編號,等等)。
等等,我覺得咱們得先繪製主角的圖片才行,走起~:)
【Tile Layer Pro】
存儲主角像素塊的表格稱爲Pattern Table,大小4KB,位於PPU $0000~$0FFF或$1000~1FFF(由PPU 控制寄存器設置,見第三天內容)。
繪製像素塊的工具可以用Tile Layer Pro,我們從一個空白的像素塊開始。
運行TLP.exe,打開MT.spr。點擊View菜單,設置Format爲NES。
點擊大的網格窗口的左上角第一個小方塊,看到右邊有個Pallete Editor窗口,這就對了,我們只能用4種顏色。現在在Tile Editor窗口中畫一個小笑臉或者其他什麼東東。保存文件爲our.spr。很好,我們擁有了一個主角!你要是實在做不來,那就下載我做的這個。
之後,重新下載MT.spr,重命名爲our.bkg。顧名思義,這個是用於背景的。今天我們不討論背景的製作,但爲了讓今天程序運行,我們必須有這個文件。
將our.spr和our.bkg放到同一個文件夾下,你的源代碼也放在這裏。
【段2變得更重要了】
前一天,我們告訴PPU,我們將使用段2的$0000作爲背景圖片數據區,$1000作爲主角圖片數據區。這樣一來段2就擁有8KB,即$2000字節。4KB就是4096B或十六進制下的$1000B。代碼中我們這樣實現:
.bank 2
.org $0000
.incbin "our.bkg"
.incbin "our.spr"
.incbin包含一個二進制文件。
【寫SPR-RAM】
SPR-RAM也稱“主角信息區”,寫入通過兩個寄存器:$2003和$2004。類似前面載入調色板時寫$2006和$2007,我們同樣需要先寫兩次$2003,告訴PPU地址,然後將數據寫入$2004。
lda #$00
sta $2003
sta $2003
這樣設置SPR-RAM地址爲$0000。
寫$2004的內容包括4字節,具體如下:
Y —— 屏幕上的垂直位置
N —— 8x8 tile編號,我們包含的二進制.spr文件裏面有256個不同tile,編號0~255
C —— 一些特殊信息,我還沒細看
X —— 屏幕上的水平位置
PPU可以放置64個主角信息。如果我們想讓主角在座標(20,50)出場,tile編號爲0,C不知是啥也寫0,程序如下:
lda #50 ;
sta $2004 ; 設置縱座標爲50
lda #00 ;
sta $2004 ; tile編號爲0
sta $2004 ; C = 0.
lda #20
sta $2004 ; 設置橫座標爲20
咣噹!主角出現(希望如此)!
【VBlank】
理論上我們應該在場消隱期間寫入SPR-RAM。這段時間稱爲VBlank。只給代碼,不解釋。我們重點是主角。
waitblank:
lda $2002 ;
bpl waitblank ;
不用擔心,我們馬上就把代碼組合到一起。
【第一個完整代碼】
新建一個our.asm文件,用記事本或其他編輯器打開,拷貝以下代碼:
;;--- 程序開始 ---;;
; INES 文件頭
.inesprg 1 ; 1 段代碼
.ineschr 1 ; 1 段數據
.inesmir 1 ; 總是1
.inesmap 0 ; 使用mapper 0
.bank 1 ;
.org $FFFA ;
.dw 0 ; dw 表示定義字,NMI中斷向量 = 0(禁止)
.dw Start ; 復位向量,代碼從Start標籤處開始
.dw 0 ; VBlank 中斷向量,0表示禁止
;
.bank 0 ; bank 0 - 代碼段
.org $8000 ; 代碼從 $8000開始
Start: ;還記得大明湖畔的復位向量嗎?
lda #%00001000 ; 就像那天說的一樣設置PPU
sta $2000 ;
lda #%00011110 ;
sta $2001 ;
ldx #$00 ; 準備載入調色板
lda #$3F ;
sta $2006 ;
lda #$00 ;
sta $2006
loadpal: ;
lda tilepal, x ;
sta $2007 ;
inx ;
cpx #32 ;
bne loadpal ;
waitblank: ; 等待 VBlank
lda $2002 ; 讀取 $2002的值
bpl waitblank ; 如果bit7 == 0,那就接着waitblank
lda #$00 ; 寫入SPR-RAM
sta $2003 ;
lda #$00 ;
sta $2003 ;
lda #50 ;
sta $2004 ;
lda #$00 ;
sta $2004 ;
lda #$00 ;
sta $2004 ;
lda #20 ;
sta $2004 ;
; 注意順序呀!
infin:
jmp infin ; 死循環
tilepal: .incbin "our.pal" ; 包含調色板,貼標籤
.bank 2 ; 數據段
.org $0000 ;
.incbin "our.bkg" ; 空白背景數據
.incbin "our.spr" ; 我們繪製的主角數據
; 注意順序呀!
;;--- 代碼結束 ---;;
上面代碼如果有不懂的,再看看前面幾天的教程。
【彙編】
把所有原材料準備好(our.pal, our.bkg, our.spr, nesasm.exe, our.asm),放到同一個文件夾,打開DOS,CD到這個文件夾,輸入:
nesasm our.asm
命令結束後,在當前文件夾下產生our.nes文件。用模擬器運行這個nes文件試試。
【今日回顧】
哇,這麼多!別擔心,看上去很多,一旦你懂了NES,這些東西都會乖乖聽你的。明天我們也許會講背景。睡個好覺~