Tried using a more generic way of controlling animation in a sprite.
No longer shows animated tetris-piece sprite though, but working on a nice way of adding motion paths to sprites.
This commit is contained in:
parent
abd3ed414f
commit
d7bb1f2ecc
|
@ -26,10 +26,20 @@
|
|||
// storage space for palette data
|
||||
//---------------------------------------------------------------------------------
|
||||
u16 PaletteBuffer[256];
|
||||
OBJATTR s_sprite, frog_sprite, turret_sprite;
|
||||
OBJATTR s_sprite, frog_sprite;
|
||||
|
||||
unsigned int frame;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
OBJATTR oam;
|
||||
u8 frames;
|
||||
u8 direction;
|
||||
s8 frame;
|
||||
} AnimSprite;
|
||||
|
||||
AnimSprite turret;
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
void VblankInterrupt()
|
||||
//---------------------------------------------------------------------------------
|
||||
|
@ -47,25 +57,11 @@ void move_show_and_wait(u16 x, u16 y, u16 wait_ticks) {
|
|||
for (i=0; i<wait_ticks; i++) VBlankIntrWait();
|
||||
}
|
||||
|
||||
void move_turret(u16 frame_delay) {
|
||||
// assume we are in vblank
|
||||
s8 pos;
|
||||
u16 i;
|
||||
|
||||
for (pos=0; pos<5; pos++) {
|
||||
turret_sprite.attr2 = OBJ_CHAR(522 + pos*8);
|
||||
CpuFastSet(&turret_sprite, OAM + sizeof(s_sprite) + sizeof(frog_sprite),
|
||||
COPY32 | sizeof(turret_sprite)/4);
|
||||
for (i=0; i<frame_delay; i++) VBlankIntrWait();
|
||||
}
|
||||
|
||||
for (pos=4; pos>=0; pos--) {
|
||||
turret_sprite.attr2 = OBJ_CHAR(522 + pos*8);
|
||||
CpuFastSet(&turret_sprite, OAM + sizeof(s_sprite) + sizeof(frog_sprite),
|
||||
COPY32 | sizeof(turret_sprite)/4);
|
||||
for (i=0; i<frame_delay; i++) VBlankIntrWait();
|
||||
}
|
||||
|
||||
void update_sprite(AnimSprite* sprite, u16 char_base, u16 oam_index) {
|
||||
sprite->oam.attr2 = OBJ_CHAR(char_base + sprite->frame*8);
|
||||
VBlankIntrWait();
|
||||
CpuFastSet(&sprite->oam, OAM + oam_index*sizeof(OBJATTR),
|
||||
COPY32 | sizeof(OBJATTR)/4);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------------
|
||||
|
@ -101,36 +97,41 @@ int main(void)
|
|||
|
||||
memset(&s_sprite, 0, sizeof(s_sprite));
|
||||
memset(&frog_sprite, 0, sizeof(frog_sprite));
|
||||
memset(&turret_sprite, 0, sizeof(turret_sprite));
|
||||
memset(&turret, 0, sizeof(turret));
|
||||
s_sprite.attr2 = OBJ_CHAR(512);
|
||||
|
||||
frog_sprite.attr2 = OBJ_CHAR(514);
|
||||
frog_sprite.attr1 = OBJ_SIZE(1) | OBJ_X(175);
|
||||
frog_sprite.attr0 = OBJ_256_COLOR | OBJ_Y(49);
|
||||
|
||||
turret_sprite.attr2 = OBJ_CHAR(516);
|
||||
turret_sprite.attr1 = OBJ_SIZE(1) | OBJ_X(43);
|
||||
turret_sprite.attr0 = OBJ_256_COLOR | OBJ_Y(73);
|
||||
// each frame is 16x16=256 bytes
|
||||
turret.frames = 5;
|
||||
turret.oam.attr2 = OBJ_CHAR(516);
|
||||
turret.oam.attr1 = OBJ_SIZE(1) | OBJ_X(43);
|
||||
turret.oam.attr0 = OBJ_256_COLOR | OBJ_Y(73);
|
||||
|
||||
VBlankIntrWait();
|
||||
CpuFastSet(&frog_sprite, OAM + sizeof(s_sprite), COPY32 | sizeof(frog_sprite)/4);
|
||||
|
||||
u16 i;
|
||||
|
||||
while (1)
|
||||
{
|
||||
move_turret(3);
|
||||
move_turret(3);
|
||||
move_turret(3);
|
||||
move_turret(3);
|
||||
for (i=0; i<3; i++) VBlankIntrWait();
|
||||
|
||||
move_show_and_wait(147, 74, 30);
|
||||
move_show_and_wait(147, 76, 30);
|
||||
move_show_and_wait(147, 78, 15);
|
||||
move_show_and_wait(145, 78, 15);
|
||||
move_show_and_wait(145, 80, 30);
|
||||
move_show_and_wait(145, 82, 30);
|
||||
move_show_and_wait(145, 84, 30);
|
||||
move_show_and_wait(145, 86, 30);
|
||||
move_show_and_wait(145, 88, 30);
|
||||
if (turret.direction)
|
||||
turret.frame += 1;
|
||||
else
|
||||
turret.frame -= 1;
|
||||
|
||||
if (turret.frame >= turret.frames) {
|
||||
turret.frame = turret.frames - 1;
|
||||
turret.direction = 0;
|
||||
} else if (turret.frame < 0) {
|
||||
turret.frame = 0;
|
||||
turret.direction = 1;
|
||||
}
|
||||
update_sprite(&turret, 522, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue