#include #include "common.h" #include "gba-buttons.c" #include "background-tiles.c" #include "sprites.h" // // Main functions. // // TODO: Cleanup OBJ/OAM memory copying and access. // #define CBB_0 0 #define SBB_0 28 #define CROSS_TX 15 #define CROSS_TY 10 u16 *bg0_map = SCREENBLOCK_MEM[SBB_0]; void init_map() { // initialize a background BG_CTRL_0 = BG_CHARBLOCK(CBB_0) | BG_SCREENBLOCK(SBB_0) | BG_SIZE(3); BG_H_SCROLL_0 = 0; BG_V_SCROLL_0 = 0; // (1) create the tiles: basic tile and a cross const Tile tiles[2] = { {{0x11111111, 0x01111111, 0x01111111, 0x01111111, 0x01111111, 0x01111111, 0x01111111, 0x00000001}}, {{0x00000000, 0x00100100, 0x01100110, 0x00011000, 0x00011000, 0x01100110, 0x00100100, 0x00000000}}, }; TILE_MEM[CBB_0][0] = tiles[0]; TILE_MEM[CBB_0][1] = tiles[1]; // (2) create a palette PAL_BANK_BG[0][1] = rgb15(31, 0, 0); PAL_BANK_BG[1][1] = rgb15( 0, 31, 0); PAL_BANK_BG[2][1] = rgb15( 0, 0, 31); PAL_BANK_BG[3][1] = rgb15(16, 16, 16); // (3) Create a map: four contingent blocks of // 0x0000, 0x1000, 0x2000, 0x3000. u16 *pse = bg0_map; for(int i = 0; i < 4; i++) { for(int j = 0; j < 32 * 32; j++) { *pse++ = SCREENBLOCK_ENTRY_PAL(i) | 0; } } } int main(void) { init_map(); // Configure the display in mode 0 to show OBJs, where tile memory is // sequential. DISP_CTRL = DISP_ENABLE_SPRITES | DISP_MODE_0 | DISP_BG_0; u32 tx, ty, se_curr, se_prev= CROSS_TY * 32 + CROSS_TX; bg0_map[se_prev]++; // initial position of cross // Initialize sprite button overlay. init_sprite_pal(0, COLOR_WHITE); init_sprites(0); init_button_sprites(); int frame_counter = 0; int x = 0; int y = 0; while(true) { wait_vsync(); poll_keys(); if (key_hold(KEY_DOWN)) { y += 3; } if (key_hold(KEY_UP)) { y -= 3; } if (key_hold(KEY_LEFT)) { x -= 3; } if (key_hold(KEY_RIGHT)) { x += 3; } tx = ((x >> 3) + CROSS_TX) & 0x3F; ty = ((y >> 3) + CROSS_TY) & 0x3F; se_curr = se_index(tx, ty, 64); if(se_curr != se_prev) { bg0_map[se_prev]--; bg0_map[se_curr]++; se_prev= se_curr; } frame_counter++; BG_H_SCROLL_0 = x; BG_V_SCROLL_0 = y; update_button_sprites(); }; return 0; }