NESASM教程——第五天——主角出場

【主角】

主角和背景比起來,你肯定覺得背景會更簡單。錯!主角才簡單得要命。

製造主角只需要向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,這些東西都會乖乖聽你的。明天我們也許會講背景。睡個好覺~

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