我目前正在大学项目的 6502 组件中进行平台游戏演示,我不明白如何在该项目中实现平滑的水平/垂直运动和加速。基本上,每个动作都包含以下代码的略有不同的版本:
READ_RIGHT:
LDA JOYPAD1
AND #%00000001
BNE DO_RIGHT
JMP READ_RIGHT_DONE
DO_RIGHT:
JSR HandleAcceleration
JSR UpdatePlayerPosition
READ_RIGHT_DONE:
RTI
HandleAcceleration:
LDA ACCEL + 1
CLC
ADC #$01
STA ACCEL + 1
BCC @ON_CARRY
LDA ACCEL + 0
CMP MAX_ACCEL
BCC @NOT_MAX_ACCEL
LDA MAX_ACCEL
STA ACCEL
@ON_CARRY:
INC ACCEL
INC MOV_FLAG
@NOT_MAX_ACCEL:
RTS
UpdatePlayerPosition:
LDA PLAYER_X
STA $0203
STA $020B
TAX
CLC
ADC #$08
STA $0207
STA $020F
ADC SPEED
STA PLAYER_X
RTS
我认为我应该为此使用定点算术,但每次我尝试时,程序都无法按预期运行。 如果有人知道我应该做什么或我做错了什么,请帮助。
我尝试将以下逻辑应用于代码:
READ_RIGHT:
LDA JOYPAD1
AND #%00000001
BNE DO_RIGHT
JMP READ_RIGHT_DONE
DO_RIGHT:
JSR HandleAcceleration
JSR UpdatePlayerPosition
READ_RIGHT_DONE:
RTI
HandleAcceleration:
LDA ACCEL + 1
CLC
ADC #$01
STA ACCEL + 1
BCC @ON_CARRY
LDA ACCEL + 0
CMP MAX_ACCEL
BCC @NOT_MAX_ACCEL
LDA MAX_ACCEL
STA ACCEL
@ON_CARRY:
INC ACCEL
INC MOV_FLAG
@NOT_MAX_ACCEL:
RTS
UpdatePlayerPosition:
LDA PLAYER_X
STA $0203
STA $020B
TAX
CLC
ADC #$08
STA $0207
STA $020F
ADC SPEED
STA PLAYER_X
RTS
它并没有平滑地向精灵应用加速,只是让它立即变得更快,没有其他任何作用。
您的问题是由于没有捕获垂直回扫造成的。当您没有捕获光束或没有正确设置 IRQ 时,CPU 会连续运行您的代码。您需要的是以恒定的速度/FPS 运行代码。我不是 NES 硬件方面的专家,但从文档来看,$2002 地址似乎是主循环结构的答案。尝试添加;
Main:
// Wait for vertical retrace here
lda $2002
bit 7
bne Main
// Do your stuff here
jmp Main
或者通过使用 IRQ,尝试正确设置 IRQ 输入参数,同时考虑垂直回扫。每个基于 6502 的 8 位机器都有一种捕获屏幕顶部光束的方法。你只需要研究一下 NES 的“垂直回扫”、“吸引光束”主题即可。