我正在尝试制作一个简单的Game Boy Advance 游戏,它有一个带有四帧动画的精灵。
我是 C 编程的新手(我是一个汇编爱好者,ARM 汇编对我来说更有意义,但我放弃了,因为它读取数据并将数据移动到其寄存器的能力有限)而且我很难理解如何做事。
下面的代码应该在每一帧增加变量 i,并循环播放玩家精灵的四个可能图形之一。(这就是0x20
、0x28
、0x20
和所0x30
代表的)。但是当游戏运行时,它只显示精灵,就好像我刚刚将精灵属性设置为0x30
并且永远不会改变一样。
基本上我的 if 语句没有效果,我真的不明白为什么。
C代码:
ObjectAttributes *spriteAttribs = &oam_object_backbuffer[0];
spriteAttribs->attr0 = 0x2000;
spriteAttribs->attr1 = 0x4000;
spriteAttribs->attr2 = 0x20;
int i;
i = 0;
while(1)
{
i = i++;
vsync();
if (i & 3 == 0) //this doesn't work, no idea why
{
spriteAttribs->attr2 = 0x20;
}
else if (i & 3 == 1)
{
spriteAttribs->attr2 = 0x28;
}
else if (i & 3 == 2)
{
spriteAttribs->attr2 = 0x20;
}
else
{
spriteAttribs->attr2 = 0x30;
}
MEM_OAM[0] = oam_object_backbuffer[0];
// this is what displays the sprite to the screen
key_poll() // not relevant to this question
} //loop forever
这将产生以下 ARM 代码:
L21:
sub r1, fp, #20
ldr r3, [r1, #0]
mov r2, r3
str r2, [fp, #-20]
add r3, r3, #1
str r3, [r1, #0]
bl vsync
ldr r2, [fp, #-1068]
mov r3, #48
strh r3, [r2, #4] @ movhi
mov r2, #117440512 @ 0x07000000, address of Game Boy Advance's OAM
mvn r3, #1040 @ By the way is there any way to tell GCC to output these values in
@ hexadecimal?
sub r3, r3, #7
sub r0, fp, #12
add r3, r0, r3
ldmia r3, {r0-r1}
stmia r2, {r0-r1}
bl key_poll
b .L21