# HG changeset patch # User William Morgan # Date 1389678502 28800 # Node ID b725a715b358c02d3d84ded3c77105c2fa7b3441 # Parent bb7dfb42b320c0ddbe3746ee34f3d020fde487a0 cursor now blinks the current selection diff -r bb7dfb42b320 -r b725a715b358 src/main.c --- a/src/main.c Sun Jan 12 23:53:18 2014 -0800 +++ b/src/main.c Mon Jan 13 21:48:22 2014 -0800 @@ -44,10 +44,13 @@ u16 countdown; -int cursor_x = 0; // tiles -int cursor_y = 0; // tiles -int pixels_per_tile = 8; -const int cursor_width = 2; // tiles +s16 cursor_x = 0; // tiles +s16 cursor_y = 0; // tiles +u16 cursor_selection = WALL; +#define CURSOR_BLINK_RATE 16 +#define CURSOR_WIDTH 2; // tiles + +#define PIXELS_PER_TILE 8 u16 build_order[3] = { @@ -58,19 +61,30 @@ u8 build_order_size = 3; u8 running = 0; +void clear_cursor() { + VDP_setTileMap(VDP_PLAN_A, 0, cursor_x, cursor_y); + VDP_setTileMap(VDP_PLAN_A, 0, cursor_x + 1, cursor_y); + VDP_setTileMap(VDP_PLAN_A, 0, cursor_x, cursor_y + 1); + VDP_setTileMap(VDP_PLAN_A, 0, cursor_x + 1, cursor_y + 1); +} + void joy_event_handler(u16 joy, u16 changed, u16 state) { u16 went_down = changed & state; if (went_down & BUTTON_UP) { - cursor_y -= cursor_width; + clear_cursor(); + cursor_y -= CURSOR_WIDTH; } if (went_down & BUTTON_DOWN) { - cursor_y += cursor_width; + clear_cursor(); + cursor_y += CURSOR_WIDTH; } if (went_down & BUTTON_LEFT) { - cursor_x -= cursor_width; + clear_cursor(); + cursor_x -= CURSOR_WIDTH; } if (went_down & BUTTON_RIGHT) { - cursor_x += cursor_width; + clear_cursor(); + cursor_x += CURSOR_WIDTH; } if (went_down & BUTTON_A && !running) { //u16 type_to_place = EMPTY; @@ -116,11 +130,20 @@ { VDP_waitVSync(); VDP_updateSprites(); + if ((getTick() % CURSOR_BLINK_RATE) == 0) { + VDP_setTileMap(VDP_PLAN_A, tileinfo[cursor_selection][0], cursor_x, cursor_y); + VDP_setTileMap(VDP_PLAN_A, tileinfo[cursor_selection][1], cursor_x + 1, cursor_y); + VDP_setTileMap(VDP_PLAN_A, tileinfo[cursor_selection][2], cursor_x, cursor_y + 1); + VDP_setTileMap(VDP_PLAN_A, tileinfo[cursor_selection][3], cursor_x + 1, cursor_y + 1); + } + if ((getTick() % CURSOR_BLINK_RATE) == CURSOR_BLINK_RATE >> 1) { + clear_cursor(); + } for (i = 0; i < 28; i++) { VDP_setTileMapRectByIndex(VDP_PLAN_B, tilemap + i*40, i*64, 40, 0); } - VDP_setSprite(0, cursor_x * pixels_per_tile, cursor_y * pixels_per_tile, SPRITE_SIZE(2,2), TILE_ATTR_FULL(PAL0, 1, 0, 0, cursor_tile_index), spriteDefCache[0].link); + VDP_setSprite(0, cursor_x * PIXELS_PER_TILE, cursor_y * PIXELS_PER_TILE, SPRITE_SIZE(2,2), TILE_ATTR_FULL(PAL0, 1, 0, 0, cursor_tile_index), spriteDefCache[0].link); if (running) { if (countdown) diff -r bb7dfb42b320 -r b725a715b358 src/map.h --- a/src/map.h Sun Jan 12 23:53:18 2014 -0800 +++ b/src/map.h Mon Jan 13 21:48:22 2014 -0800 @@ -10,7 +10,7 @@ OBJECT_TYPES } object_type; -#define EMPTY_TA 0 +#define EMPTY_TA 0 // make something else later, 0 will be pure alpha #define WALL_UL 'O'-32 + TILE_FONTINDEX #define TOWER_UL TILE_ATTR_FULL(1, 0, 0, 0, 'T'-32 + TILE_FONTINDEX) #define GOAL_UL TILE_ATTR_FULL(1, 0, 0, 0, 'G'-32 + TILE_FONTINDEX) @@ -18,6 +18,7 @@ extern u16 distances[20*14]; extern u16 tilemap[40*28]; +extern u16 tileinfo[OBJECT_TYPES][4]; void gen_distances(u16 x, u16 y); void print_distances(void); void place_object(u16 type, u16 x, u16 y);