From a40ea78e8bd2fc5ba01906fd19bedf074203a24a Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 24 Oct 2022 04:33:54 +0300 Subject: [PATCH] UI sprites --- Makefile | 3 +++ src/data.h | 15 +++++++++++ src/gamescr.c | 77 +++++++++++++++++++++++++++++++++++++++++++----------- src/gba/sprite.c | 2 +- 4 files changed, 81 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 2789830..e3a9446 100644 --- a/Makefile +++ b/Makefile @@ -64,6 +64,9 @@ tools/vistab: tools/vistab.c tools/mmutil/mmutil: $(MAKE) -C tools/mmutil +#data/spr_game.raw: data/spr_ui.png data/spr_hud.png +# tools/pngdump/pngdump -o $@ -n $^ + %.sraw: %.png tools/pngdump/pngdump tools/pngdump/pngdump -o $@ -oc $(subst .sraw,.spal,$@) -os $(subst .sraw,.shade,$@) -s 8 $< diff --git a/src/data.h b/src/data.h index 08dfa70..06e7123 100644 --- a/src/data.h +++ b/src/data.h @@ -9,6 +9,21 @@ #define VOX_SZ 512 +enum { + SPRID_BASE = 512, + SPRID_UILEFT = SPRID_BASE + 0, + SPRID_UIMID = SPRID_BASE + 4, + SPRID_UIRIGHT = SPRID_BASE + 8, + SPRID_UINUM = SPRID_BASE + 12, + SPRID_UISLASH = SPRID_BASE + 94, + SPRID_CROSS = SPRID_BASE + 64, + SPRID_UITGT = SPRID_BASE + 68, + SPRID_LEDOFF = SPRID_BASE + 72, + SPRID_LEDRED = SPRID_BASE + 74, + SPRID_LEDBLU = SPRID_BASE + 76, + SPRID_LEDGRN = SPRID_BASE + 78 +}; + extern unsigned char color_pixels[]; extern unsigned char color_cmap[]; extern unsigned char height_pixels[]; diff --git a/src/gamescr.c b/src/gamescr.c index cf3b916..b923a73 100644 --- a/src/gamescr.c +++ b/src/gamescr.c @@ -45,9 +45,13 @@ static struct voxscape *vox; #define COLOR_HORIZON 192 #define COLOR_ZENITH 255 -#define MAX_SPR 8 +#define MAX_SPR 32 static uint16_t oam[4 * MAX_SPR]; +static int dynspr_base, dynspr_count; +static int num_tur, total_tur; +static int energy; +#define MAX_ENERGY 5 struct screen *init_game_screen(void) { @@ -56,7 +60,7 @@ struct screen *init_game_screen(void) static int gamescr_start(void) { - int i; + int i, sidx; gba_setmode(4, DISPCNT_BG2 | DISPCNT_OBJ | DISPCNT_FB1); @@ -85,20 +89,29 @@ static int gamescr_start(void) intr_enable(); */ - spr_setup(16, 2, spr_game_pixels, spr_game_cmap); - + spr_setup(16, 8, spr_game_pixels, spr_game_cmap); wait_vblank(); spr_clear(); - spr_oam(oam, 0, 516, 0, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 1, 516, 16, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 2, 516, 32, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 3, 520, 48, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 4, 512, 176, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 5, 516, 192, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 6, 516, 208, 144, SPR_SZ16 | SPR_256COL); - spr_oam(oam, 7, 516, 224, 144, SPR_SZ16 | SPR_256COL); - dma_copy16(3, (void*)OAM_ADDR, oam, sizeof oam / 2, 0); + for(i=0; i 2 ? SPRID_LEDGRN : SPRID_LEDRED; + } + for(i=0; i<5; i++) { + spr_oam(oam, dynspr_base + i + 4, i >= energy ? SPRID_LEDOFF : ledspr, + 8 + (i << 3), 144, SPR_VRECT | SPR_256COL); + } + dynspr_count = 9; } static void draw(void) { - dma_fill16(3, framebuf, 0, 240 * 160 / 2); - //fillblock_16byte(framebuf, 0, 240 * 160 / 16); + //dma_fill16(3, framebuf, 0, 240 * 160 / 2); + fillblock_16byte(framebuf, 0, 240 * 160 / 16); vox_render(vox); //vox_sky_grad(vox, COLOR_HORIZON, COLOR_ZENITH); @@ -207,6 +250,10 @@ static void gamescr_vblank(void) static int bank, bankdir, theta, s; int32_t sa, ca; + if(!nframes) return; + + dma_copy32(3, (void*)(OAM_ADDR + dynspr_base * 8), oam + dynspr_base * 4, dynspr_count * 2, 0); + theta = -(bank << 3); #if 0 s = 0x100000 / (MAXBANK + (abs(bank) >> 3)); diff --git a/src/gba/sprite.c b/src/gba/sprite.c index fdb0318..e2849d7 100644 --- a/src/gba/sprite.c +++ b/src/gba/sprite.c @@ -26,7 +26,7 @@ void spr_setup(int xtiles, int ytiles, unsigned char *pixels, unsigned char *cma } cptr = (uint16_t*)CRAM_OBJ_ADDR; - for(i=0; i<128; i++) { + for(i=0; i<256; i++) { unsigned char r = *cmap++ >> 3; unsigned char g = *cmap++ >> 3; unsigned char b = *cmap++ >> 3; -- 1.7.10.4