2

我正在尝试制作一个简单的Game Boy Advance 游戏,它有一个带有四帧动画的精灵。
我是 C 编程的新手(我是一个汇编爱好者,ARM 汇编对我来说更有意义,但我放弃了,因为它读取数据并将数据移动到其寄存器的能力有限)而且我很难理解如何做事。
下面的代码应该在每一帧增加变量 i,并循环播放玩家精灵的四个可能图形之一。(这就是0x200x280x20和所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
4

0 回答 0