assembly 平滑精灵移动

k2fxgqgv  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(86)

我是一个内斯开发的初学者,我创建了一个简单的精灵移动代码。它运行的很好,但不流畅:它只是在像素之间传送。我听说过一些关于亚像素的东西,我能做一个更平滑的代码吗?这里是:

ldy #$00

loop:
iny

cpy #$ff
bne loop

inc $0005
ldy $0005
cpy #$30
bne loop

inc $0200
inc $0203
inc $0204
inc $0207
inc $0208
inc $020b
inc $020c
inc $020f

ldy #$00
    JMP loop

谢谢;)

1szpjjfi

1szpjjfi1#

嗯,首先,你的角色没有按照你设计的循环方式持续移动。

loop:
iny
cpy #$ff ;you don't need this line, nearly all operations on 6502 auto compare to 0 anyway
bne loop

inc $05
ldy $05
cpy #$30
bne loop

; inc x and y coords of each sprite

LDY #0
;$05 was never reset to zero so it will be #$31 next time we inc $05
JMP loop

由于没有将内存位置$0005重置为初始值,因此每次循环的时间不会相同,这可能会影响平滑循环,因为它会导致x和y坐标的增量变化。除此之外,看起来您做得很好(我假设您在NMI期间使用$0200作为sprite缓存的源来执行sprite DMA)。
一般来说,使用vblank wait来更精确地计算角色移动的时间会更好。这样,角色每帧最多只能移动一个像素。最简单的方法是留出一个零页内存位置(例如$007F,但它可以在您想要的任何位置),然后执行一个循环以等待NMI触发。只要写入该内存位置的代码段只有您的等待循环和NMI,您已经创建了一个“发令枪”,它可以告诉您的程序何时继续。(虽然您可以使用bit $2002轮询vblank,但这样做不是一个好主意,除非在启动序列中PPU正在预热。)

VBlankWait:
pha
LDA #0
STA $7F
Again:
LDA $7F
BEQ Again  ;loop until next NMI
PLA
RTS

然后修改NMI以更改值。

NMI:
PHA
TXA
PHA
TYA
PHA

;nmi code goes here

LDA #1
STA $7F ;this will cause the "Again" loop to exit when we return to it.
PLA
TAY
PLA
TAX
PLA
RTI

完成所有这些操作后,可以如下修改代码:

loop:

jsr VBlankWait

; modify sprite x and y here

jmp loop

相关问题