From eebf8f326e2f456d1473f497d0fb36cc63a163ac Mon Sep 17 00:00:00 2001 From: tangstad Date: Tue, 22 Nov 2005 23:25:24 +0000 Subject: [PATCH] Added movement and sprite rotation.. you can now actually drive the car along. --- gba/cartest/src/cartest.c | 98 ++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 16 deletions(-) diff --git a/gba/cartest/src/cartest.c b/gba/cartest/src/cartest.c index 28aefc4..aa6194d 100644 --- a/gba/cartest/src/cartest.c +++ b/gba/cartest/src/cartest.c @@ -23,7 +23,10 @@ // storage space for palette data //--------------------------------------------------------------------------------- u16 PaletteBuffer[256]; -OBJATTR car; + +// 4 sprites and one +OBJATTR oe_buffer[4]; +OBJAFFINE *const oa_buffer = (OBJAFFINE*)oe_buffer; unsigned int frame; @@ -41,6 +44,9 @@ void VblankInterrupt() int main(void) //--------------------------------------------------------------------------------- { + OBJATTR*car = &oe_buffer[0]; + OBJAFFINE*car_aff = &oa_buffer[0]; + // Set up the interrupt handlers InitInterrupt(); @@ -55,36 +61,96 @@ int main(void) // screen mode, background and objects to display SetMode( MODE_4 | BG2_ON | OBJ_ON | OBJ_1D_MAP ); - u32 white = 0x10101010; CpuFastSet(&white, (void*)VRAM, FILL | 240*160/4); + u32 white = 0x10101010; + CpuFastSet(&white, (void*)VRAM, FILL | 240*160/4); FadeToPalette((void*)car_pal_bin, 1); CpuFastSet(car_bin, BITMAP_OBJ_BASE_ADR, COPY32 | car_bin_size/4); CpuFastSet(car_pal_bin, OBJ_COLORS, COPY32 | car_pal_bin_size/4); - memset(&car, 0, sizeof(car)); - car.attr2 = OBJ_CHAR(512); - car.attr1 = OBJ_SIZE(1) | OBJ_X(100); - car.attr0 = OBJ_256_COLOR | OBJ_Y(49); + // u32 nothing = 0; + // CpuFastSet(¬hing, (void*)oe_buffer, FILL | sizeof(oe_buffer)/4); + // memset(oe_buffer, 0, sizeof(oe_buffer)); + car->attr2 = OBJ_CHAR(512); + // car->attr1 = OBJ_SIZE(1) | OBJ_X(100); + // car->attr0 = OBJ_256_COLOR | OBJ_ROT_SCALE_ON | OBJ_Y(49); + + s32 base = (s32)(0.707106781 * 256); + s32 one = 1 << 8; + + car_aff->pa = 1 << 8; + car_aff->pb = 0; + car_aff->pc = 0;; + car_aff->pd = 1 << 8; + + int x = 112; + int y = 72; while (1) { + int xadjust = 0; + int yadjust = 0; + + // This isn't very tidy, but a cleanup is always + // imminent... + + if ((KeysHeld() & KEY_RIGHT) && (KeysHeld() & KEY_UP)) { + car_aff->pa = base; + car_aff->pb = base; + car_aff->pc = -base; + car_aff->pd = base; + } else if ((KeysHeld() & KEY_RIGHT) && (KeysHeld() & KEY_DOWN)) { + car_aff->pa = -base; + car_aff->pb = base; + car_aff->pc = -base; + car_aff->pd = -base; + } else if ((KeysHeld() & KEY_LEFT) && (KeysHeld() & KEY_DOWN)) { + car_aff->pa = -base; + car_aff->pb = -base; + car_aff->pc = base; + car_aff->pd = -base; + } else if ((KeysHeld() & KEY_LEFT) && (KeysHeld() & KEY_UP)) { + car_aff->pa = base; + car_aff->pb = -base; + car_aff->pc = base; + car_aff->pd = base; + } else if (KeysHeld() & KEY_UP) { + car_aff->pa = 1 << 8; + car_aff->pb = 0; + car_aff->pc = 0;; + car_aff->pd = 1 << 8; + } else if (KeysHeld() & KEY_RIGHT) { + car_aff->pa = 0; + car_aff->pb = one; + car_aff->pc = -one; + car_aff->pd = 0; + } else if (KeysHeld() & KEY_DOWN) { + car_aff->pa = -one; + car_aff->pb = 0; + car_aff->pc = 0; + car_aff->pd = -one; + } else if (KeysHeld() & KEY_LEFT) { + car_aff->pa = 0; + car_aff->pb = -one; + car_aff->pc = one; + car_aff->pd = 0; + } + if (KeysHeld() & KEY_RIGHT) - car.attr1 = OBJ_SIZE(1) | OBJ_X(172); + x += 1; else if (KeysHeld() & KEY_LEFT) - car.attr1 = OBJ_SIZE(1) | OBJ_X(52); - else - car.attr1 = OBJ_SIZE(1) | OBJ_X(112); + x -= 1; if (KeysHeld() & KEY_UP) - car.attr0 = OBJ_256_COLOR | OBJ_Y(32); + y -= 1; else if (KeysHeld() & KEY_DOWN) - car.attr0 = OBJ_256_COLOR | OBJ_Y(112); - else - car.attr0 = OBJ_256_COLOR | OBJ_Y(72); + y += 1; + + car->attr1 = OBJ_SIZE(1) | OBJ_X(x+xadjust); + car->attr0 = OBJ_256_COLOR | OBJ_DOUBLE | OBJ_ROT_SCALE_ON | OBJ_Y(y+yadjust); VBlankIntrWait(); - CpuFastSet(&car, OAM, COPY32 | sizeof(car)/4); + CpuFastSet(oa_buffer, OAM, COPY32 | sizeof(OBJAFFINE)/4); } - }