git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

commit 6aa2c03742ab3f983ac4d3583c66a92759db85c8
parent c66e15671a8c12f3cef5dfdb31d07a69510652f2
Author: Toxa <untoxa@mail.ru>
Date:   Tue, 26 Jan 2021 19:45:16 +0300

simplify metasprite_t struct

Diffstat:
Mgbdk-lib/examples/gb/metasprites/metasprites.c85+++++++++++++++++++++++++++++++++----------------------------------------------
Mgbdk-lib/include/gb/metasprites.h20++++++--------------
Mgbdk-lib/libc/gb/metasprites.s13++++++-------
Mgbdk-lib/libc/gb/metasprites_flip.s36++++++++++++++++++------------------
4 files changed, 65 insertions(+), 89 deletions(-)

diff --git a/gbdk-lib/examples/gb/metasprites/metasprites.c b/gbdk-lib/examples/gb/metasprites/metasprites.c @@ -33,52 +33,37 @@ UINT8 sprite_data[] = { 0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x03,0x03,0x02,0x07,0x04,0x0b,0x0c,0x0f,0x08,0x1f,0x11,0x1e,0x12,0x2a,0x36,0x3c,0x24,0x24,0x3c,0x28,0x38,0x38,0x38,0x00,0x00, }; -const metasprite_t metasprite0 = { - 19, - { - { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, - {16, -40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, - {16, -48, 22, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, - {metasprite_end} - } +const metasprite_t metasprite0[] = { + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16, -40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, + {16, -48, 22, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, + {metasprite_end} }; -const metasprite_t metasprite1 = { - 20, - { - { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, - {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, - {16,-56, 36, 0}, { 0, 8, 38, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, - {metasprite_end} - } +const metasprite_t metasprite1[] = { + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, + {16,-56, 36, 0}, { 0, 8, 38, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, + {metasprite_end} }; -const metasprite_t metasprite2 = { - 20, - { - { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, - {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 42, 0}, - {16,-56, 44, 0}, { 0, 8, 46, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 48, 0}, - {metasprite_end} - } +const metasprite_t metasprite2[] = { + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 42, 0}, + {16,-56, 44, 0}, { 0, 8, 46, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 48, 0}, + {metasprite_end} }; -const metasprite_t metasprite3 = { - 20, - { - { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, - {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, - {16,-56, 50, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, - {metasprite_end} - } +const metasprite_t metasprite3[] = { + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 34, 0}, + {16,-56, 50, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 40, 0}, + {metasprite_end} }; -const metasprite_t metasprite4 = { - 20, - { - { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, - {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, - {16,-56, 54, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, - {metasprite_end} - } +const metasprite_t metasprite4[] = { + { 0, 8, 0, 0}, { 0, 8, 2, 0}, { 0, 8, 4, 0}, { 0, 8, 6, 0}, { 0, 8, 8, 0}, { 0, 8, 0, 32}, + {16,-40, 10, 0}, { 0, 8, 12, 0}, { 0, 8, 14, 0}, { 0, 8, 16, 0}, { 0, 8, 16, 32}, { 0, 8, 18, 0}, { 0, 8, 20, 0}, + {16,-56, 54, 0}, { 0, 8, 52, 0}, { 0, 16, 24, 0}, { 0, 8, 26, 0}, { 0, 8, 28, 0}, { 0, 8, 30, 0}, { 0, 8, 32, 0}, + {metasprite_end} }; -const metasprite_t * const metasprites[] = { &metasprite0, &metasprite1, &metasprite2, &metasprite3, &metasprite4, &metasprite3, &metasprite2, &metasprite1 }; +const metasprite_t * const metasprites[] = { metasprite0, metasprite1, metasprite2, metasprite3, metasprite4, metasprite3, metasprite2, metasprite1 }; const unsigned char pattern[] = {0x80,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x01,0x01}; @@ -105,7 +90,6 @@ void main(void) { // load tile data into VRAM set_sprite_data(0, sizeof(sprite_data) >> 4, sprite_data); -// set_sprite_data(0, sizeof(coin_data) >> 4, coin_data); // set sprite tile set_sprite_tile(0, 0); @@ -163,21 +147,22 @@ void main(void) { PosX += SpdX, PosY += SpdY; -// move_metasprite(coins[0], 0, 0, PosX >> 4, PosY >> 4); + UBYTE hiwater = 0; // hide or move sprite - if (hide) - hide_metasprite(metasprites[idx], 0); + if (hide) + hide_metasprite(metasprites[idx], 0); else switch (rot) { - case 0: move_metasprite(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; - case 1: move_metasprite_hflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; - case 2: move_metasprite_hvflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; - case 3: move_metasprite_vflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 0: hiwater = move_metasprite(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 1: hiwater = move_metasprite_hflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 2: hiwater = move_metasprite_hvflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; + case 3: hiwater = move_metasprite_vflip(metasprites[idx], 0, 0, PosX >> 4, PosY >> 4); break; }; // hide rest of the hardware sprites, because amount of sprites differ between animation frames - for (UBYTE i = metasprites[idx]->count; i < 40; i++) hide_sprite(i); + for (UBYTE i = hiwater; i < 40; i++) shadow_OAM[i].y = 0; + if (!(PosF & ACC_Y)) { if (SpdY >= 0) { diff --git a/gbdk-lib/include/gb/metasprites.h b/gbdk-lib/include/gb/metasprites.h @@ -4,18 +4,10 @@ /** * metasprite item description */ -typedef struct metasprite_item_t { +typedef struct metasprite_t { INT8 dy, dx; UINT8 dtile; UINT8 props; -} metasprite_item_t; - -/** - * Metasprite description - */ -typedef struct metasprite_t { - UINT8 count; - metasprite_item_t items[]; } metasprite_t; #define metasprite_end -128 @@ -38,25 +30,25 @@ static void __hide_metasprite(UINT8 id); * @param x absolute x coordinate of the sprite * @param y absolute y coordinate of the sprite **/ -inline UBYTE move_metasprite(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { +inline UBYTE move_metasprite(const metasprite_t * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { __current_metasprite = metasprite; __current_base_tile = base_tile; return __move_metasprite(base_sprite, x, y); } -inline UBYTE move_metasprite_vflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { +inline UBYTE move_metasprite_vflip(const metasprite_t * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { __current_metasprite = metasprite; __current_base_tile = base_tile; return __move_metasprite_vflip(base_sprite, x, y); } -inline UBYTE move_metasprite_hflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { +inline UBYTE move_metasprite_hflip(const metasprite_t * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { __current_metasprite = metasprite; __current_base_tile = base_tile; return __move_metasprite_hflip(base_sprite, x, y); } -inline UBYTE move_metasprite_hvflip(const void * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { +inline UBYTE move_metasprite_hvflip(const metasprite_t * metasprite, UINT8 base_tile, UINT8 base_sprite, UINT8 x, UINT8 y) { __current_metasprite = metasprite; __current_base_tile = base_tile; return __move_metasprite_hvflip(base_sprite, x, y); @@ -67,7 +59,7 @@ inline UBYTE move_metasprite_hvflip(const void * metasprite, UINT8 base_tile, UI * @param metasprite metasprite description * @param base_sprite start hardware sprite **/ -inline void hide_metasprite(const void * metasprite, UINT8 base_sprite) { +inline void hide_metasprite(const metasprite_t * metasprite, UINT8 base_sprite) { __current_metasprite = metasprite; __hide_metasprite(base_sprite); } diff --git a/gbdk-lib/libc/gb/metasprites.s b/gbdk-lib/libc/gb/metasprites.s @@ -36,9 +36,6 @@ ___move_metasprite:: ld a, (hl+) ld h, (hl) ld l, a - push hl - - inc hl ld a, (___render_shadow_OAM) ld d, a @@ -68,10 +65,13 @@ ___move_metasprite:: inc e jr 1$ - 2$: - pop hl - ld e,(hl) + ldhl sp, #2 + ld a, e + srl a + srl a + sub (hl) + ld e, a ret @@ -88,7 +88,6 @@ ___hide_metasprite:: ld a, (hl+) ld h, (hl) ld l, a - inc hl ld bc, #3 diff --git a/gbdk-lib/libc/gb/metasprites_flip.s b/gbdk-lib/libc/gb/metasprites_flip.s @@ -26,9 +26,6 @@ ___move_metasprite_hflip:: ld a, (hl+) ld h, (hl) ld l, a - push hl - - inc hl ld a, (___render_shadow_OAM) ld d, a @@ -61,10 +58,13 @@ ___move_metasprite_hflip:: inc e jr 1$ - 2$: - pop hl - ld e,(hl) + ldhl sp, #2 + ld a, e + srl a + srl a + sub (hl) + ld e, a ret @@ -83,9 +83,6 @@ ___move_metasprite_vflip:: ld a, (hl+) ld h, (hl) ld l, a - push hl - - inc hl ld a, (___render_shadow_OAM) ld d, a @@ -118,10 +115,13 @@ ___move_metasprite_vflip:: inc e jr 1$ - 2$: - pop hl - ld e,(hl) + ldhl sp, #2 + ld a, e + srl a + srl a + sub (hl) + ld e, a ret @@ -140,9 +140,6 @@ ___move_metasprite_hvflip:: ld a, (hl+) ld h, (hl) ld l, a - push hl - - inc hl ld a, (___render_shadow_OAM) ld d, a @@ -177,9 +174,12 @@ ___move_metasprite_hvflip:: inc e jr 1$ - 2$: - pop hl - ld e,(hl) + ldhl sp, #2 + ld a, e + srl a + srl a + sub (hl) + ld e, a ret

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.