【啥?】

今天不是教程,更像是前天留的作业的解决方案,即用手柄控制主角运动。我相信我们实际上已经掌握了所有必要的技能。下面给出完整代码。

【代码】

;;--- 代码开始 ---;;

.inesprg 1

.inesmap 0

.inesmir 1

.ineschr 1

.bank 1

.org $FFFA

.dw 0 ;

.dw Start ; 复位向量

.dw 0 ;

.bank 0

.org $0000

X_Pos .db 20 ; 主角X坐标

Y_Pos .db 20 ; 主角Y坐标

.org $8000 ;

Start:

lda #%00001000 ;

sta $2000 ;

lda #%00011110 ; 典型的PPU设置代码

sta $2001 ;

ldx #$00 ; 清零X ;; 开始载入调色板

lda #$3F ;

sta $2006 ;

lda #$00 ;

sta $2006

loadpal: ;

lda tilepal, x ;

sta $2007 ;

inx ;

cpx #32 ;

bne loadpal ;

;; 载入调色板结束

infinite: ; 死循环

waitblank:

lda $2002 ;

bpl waitblank ; 等待VBlank

lda #$00 ; 开始写SPR-RAM

sta $2003 ;

lda #$00 ;

sta $2003 ;

lda Y_Pos ;

sta $2004 ; 纵坐标

lda #$00 ;

sta $2004 ; tile编号0

lda #$00 ;

sta $2004 ;

lda X_Pos ;

sta $2004 ; 横坐标

; 务必注意顺序

lda #$01 ;

sta $4016 ;

lda #$00 ;

sta $4016 ; 设置/选通手柄

lda $4016 ; A

lda $4016 ; B

lda $4016 ; Select

lda $4016 ; Start

lda $4016 ; UP

and #1 ;

bne UPKEYdown ;

;如果按下“UP”,跳转到UPKEYdown

lda $4016 ; DOWN

and #1 ;

bne DOWNKEYdown

lda $4016 ; LEFT

and #1 ;

bne LEFTKEYdown

lda $4016 ; RIGHT

and #1 ;

bne RIGHTKEYdown

jmp NOTHINGdown ; 没有按键按下,跳到NOTHINGdown

UPKEYdown:

lda Y_Pos ; 将Y坐标载入A

sbc #1 ; 减1

sta Y_Pos ; 保存

jmp NOTHINGdown ; 处理结束

DOWNKEYdown:

lda Y_Pos

adc #1 ; Y坐标加1

sta Y_Pos

jmp NOTHINGdown ;

LEFTKEYdown:

lda X_Pos

sbc #1

sta X_Pos

jmp NOTHINGdown

;左键按下,X坐标减1

RIGHTKEYdown:

lda X_Pos

adc #1

sta X_Pos

; 右键按下,X坐标加1

NOTHINGdown:

jmp infinite

tilepal: .incbin "our.pal" ;

.bank 2

.org $0000

.incbin "our.bkg"

.incbin "our.spr"

;;--- 代码结束 ---;;

希望你还保存着第五天的our.pal, our.bkg, our.spr文件。你应该理解所有这些必要的内容。

注意:在一些模拟器上你可能得按下好几次按钮,主角才出现。我不知道为啥。

【今日回顾】

感谢那些发给我运动主角代码的人,至少我知道有人读了我的教程。