我是一个内斯开发的初学者,我创建了一个简单的精灵移动代码。它运行的很好,但不流畅:它只是在像素之间传送。我听说过一些关于亚像素的东西,我能做一个更平滑的代码吗?这里是:
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
谢谢;)
1条答案
按热度按时间1szpjjfi1#
嗯,首先,你的角色没有按照你设计的循环方式持续移动。
由于没有将内存位置
$0005
重置为初始值,因此每次循环的时间不会相同,这可能会影响平滑循环,因为它会导致x和y坐标的增量变化。除此之外,看起来您做得很好(我假设您在NMI期间使用$0200
作为sprite缓存的源来执行sprite DMA)。一般来说,使用vblank wait来更精确地计算角色移动的时间会更好。这样,角色每帧最多只能移动一个像素。最简单的方法是留出一个零页内存位置(例如
$007F
,但它可以在您想要的任何位置),然后执行一个循环以等待NMI触发。只要写入该内存位置的代码段只有您的等待循环和NMI,您已经创建了一个“发令枪”,它可以告诉您的程序何时继续。(虽然您可以使用bit $2002
轮询vblank,但这样做不是一个好主意,除非在启动序列中PPU正在预热。)然后修改NMI以更改值。
完成所有这些操作后,可以如下修改代码: