From 3b186a3d75af1925bf74947abc344a2c4abde154 Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Thu, 9 Jun 2022 15:51:27 +0100 Subject: [PATCH 1/4] define sprite collision boxes in res, use in src/sprite.c --- res/sprites.c | 18 ++++++++++++++++++ res/sprites.h | 2 ++ src/main.c | 1 + src/sprite.c | 36 ++++++++++++++++++------------------ src/sprite.h | 9 ++++++++- 5 files changed, 47 insertions(+), 19 deletions(-) diff --git a/res/sprites.c b/res/sprites.c index 82adceb..5f0a977 100644 --- a/res/sprites.c +++ b/res/sprites.c @@ -22,6 +22,8 @@ */ +#include "../src/sprite.h" + /* Start of tile array. */ unsigned char sprites[] = { @@ -49,4 +51,20 @@ unsigned char sprites[] = 0x7E,0x7E,0x3C,0x3C,0xDB,0xDB,0x43,0xC3 }; + +// define the collision box of each sprite in the tileset +SpriteCorners sprite_offsets[] = { + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, } +}; + /* End of SPRITES.C */ diff --git a/res/sprites.h b/res/sprites.h index 0fba763..54bcfa6 100644 --- a/res/sprites.h +++ b/res/sprites.h @@ -22,10 +22,12 @@ */ +#include "../src/sprite.h" /* Bank of tiles. */ #define spritesBank 0 /* Start of tile array. */ extern unsigned char sprites[]; +extern SpriteCorners sprite_offsets[]; /* End of SPRITES.H */ diff --git a/src/main.c b/src/main.c index b7a8887..e154213 100644 --- a/src/main.c +++ b/src/main.c @@ -36,6 +36,7 @@ void main(void) sprite.vel.y = 0; sprite.acc.x = 0; sprite.acc.y = 0; + sprite.collision_offset = sprite_offsets[0]; move_sprite(0, sprite.pos.x, sprite.pos.y); diff --git a/src/sprite.c b/src/sprite.c index 0397c70..504dd46 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -6,16 +6,6 @@ #include "./map.h" -typedef struct Sprites { - int frames_since_last_dash; - int frames_since_last_jump; - int size; - UVec pos; - Vec vel; - Vec acc; -} Sprite; - - typedef struct SpriteCorners { UVec itl; UVec itr; @@ -24,6 +14,16 @@ typedef struct SpriteCorners { } SpriteCorners; +typedef struct Sprites { + int frames_since_last_dash; + int frames_since_last_jump; + SpriteCorners collision_offset; + UVec pos; + Vec vel; + Vec acc; +} Sprite; + + int get_tile_index_by_coord(unsigned int x, unsigned int y); void getSpriteCorners(Sprite *sprite, SpriteCorners *r); void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc); @@ -39,14 +39,14 @@ int get_tile_index_by_coord(unsigned int x, unsigned int y) void getSpriteCorners(Sprite *sprite, SpriteCorners *sc) { - sc->itl.x = sprite->pos.x-8; - sc->itl.y = sprite->pos.y-16; - sc->itr.x = sprite->pos.x-1; - sc->itr.y = sprite->pos.y-16; - sc->ibl.x = sprite->pos.x-8; - sc->ibl.y = sprite->pos.y-9 ; - sc->ibr.x = sprite->pos.x-1; - sc->ibr.y = sprite->pos.y-9; + sc->itl.x = sprite->pos.x - sprite->collision_offset.itl.x; + sc->itl.y = sprite->pos.y - sprite->collision_offset.itl.y - 8; + sc->itr.x = sprite->pos.x - sprite->collision_offset.itr.x; + sc->itr.y = sprite->pos.y - sprite->collision_offset.itr.y - 8; + sc->ibl.x = sprite->pos.x - sprite->collision_offset.ibl.x; + sc->ibl.y = sprite->pos.y - sprite->collision_offset.ibl.y - 8; + sc->ibr.x = sprite->pos.x - sprite->collision_offset.ibr.x; + sc->ibr.y = sprite->pos.y - sprite->collision_offset.ibr.y - 8; } diff --git a/src/sprite.h b/src/sprite.h index 46fa765..7285059 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -4,10 +4,17 @@ #include "./vec.h" #include "./map.h" +typedef struct SpriteCorners { + UVec itl; + UVec itr; + UVec ibl; + UVec ibr; +} SpriteCorners; + typedef struct Sprites { int frames_since_last_dash; int frames_since_last_jump; - int size; + SpriteCorners collision_offset; UVec pos; Vec vel; Vec acc; -- 2.45.2 From 776cf354f8d5410c279075e0ccf982bd03bfde77 Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Thu, 9 Jun 2022 16:07:21 +0100 Subject: [PATCH 2/4] add arrow sprite --- res/sprites.c | 14 ++++++++------ res/sprites.gbr | Bin 10069 -> 10069 bytes res/sprites.h | 4 ++-- res/tiles.c | 4 ++-- res/tiles.gbr | Bin 10347 -> 10347 bytes src/main.c | 8 +++++--- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/res/sprites.c b/res/sprites.c index 5f0a977..d32c5a4 100644 --- a/res/sprites.c +++ b/res/sprites.c @@ -10,7 +10,7 @@ Compression : None. Counter : None. Tile size : 8 x 8 - Tiles : 0 to 10 + Tiles : 0 to 11 Palette colors : None. SGB Palette : None. @@ -27,8 +27,8 @@ /* Start of tile array. */ unsigned char sprites[] = { - 0xF7,0x08,0xED,0x12,0xFE,0x11,0xFF,0x38, - 0xFE,0x39,0xFE,0x39,0xFF,0x7E,0xFF,0x6E, + 0xFF,0x19,0xEF,0x17,0xFF,0x11,0xFF,0x3B, + 0xFE,0x3F,0xFE,0x3D,0xFF,0x7E,0xFF,0x6E, 0xFF,0x00,0xC3,0x42,0x81,0x00,0x81,0x00, 0x81,0x00,0x81,0x00,0xC3,0x42,0xFF,0x00, 0xC3,0xC3,0xDB,0xDB,0x3C,0x3C,0x7E,0x7E, @@ -48,7 +48,9 @@ unsigned char sprites[] = 0xC3,0xC3,0xDB,0xDB,0x3C,0x3C,0x7E,0x7E, 0x7E,0x7E,0x3C,0x3C,0xDB,0xDB,0x42,0xC3, 0x43,0xC3,0xDB,0xDB,0x3C,0x3C,0x7E,0x7E, - 0x7E,0x7E,0x3C,0x3C,0xDB,0xDB,0x43,0xC3 + 0x7E,0x7E,0x3C,0x3C,0xDB,0xDB,0x43,0xC3, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x43,0x38,0xC6,0x00,0x43 }; @@ -64,7 +66,7 @@ SpriteCorners sprite_offsets[] = { { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, } + { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, + { .itl = { .x = 8, .y = 3}, .itr = { .x = 1, .y = 3}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, } }; - /* End of SPRITES.C */ diff --git a/res/sprites.gbr b/res/sprites.gbr index 368fb5d753a8d6ace8c95d7ce0b5fadd0abc2270..de0a94ff2e2c1019fa37a5e51a6d3d951ac252e0 100644 GIT binary patch delta 119 zcmccWchzr#9_wUAMh1q7#x2^+%#4gc#K^?R3}S-WAR!c+}{KbvTvb@Ydo-j}vXfz|^=7S17Y#bS>$=Oc%6&wISTnl3W(F~!G?c&b(Qc;A7nq;OOuoQu f%*)Kc#30PTz`zJZ%$pA?^ssTvVcY@~$higpb!ZX+ diff --git a/res/sprites.h b/res/sprites.h index 54bcfa6..49f5dda 100644 --- a/res/sprites.h +++ b/res/sprites.h @@ -10,7 +10,7 @@ Compression : None. Counter : None. Tile size : 8 x 8 - Tiles : 0 to 10 + Tiles : 0 to 11 Palette colors : None. SGB Palette : None. @@ -22,7 +22,7 @@ */ -#include "../src/sprite.h" +#include "../src/sprite.h" /* Bank of tiles. */ #define spritesBank 0 diff --git a/res/tiles.c b/res/tiles.c index 0404dab..710abe2 100644 --- a/res/tiles.c +++ b/res/tiles.c @@ -25,8 +25,8 @@ /* Start of tile array. */ unsigned char tiles[] = { - 0x10,0x00,0x00,0x00,0x08,0x00,0x10,0x00, - 0x30,0x00,0x20,0x00,0x60,0x00,0x50,0x20, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF, diff --git a/res/tiles.gbr b/res/tiles.gbr index 8ff20907b11797e0a31f5d18adceb51ba90dc8d0..0876c8527a1673858e415dfb5a0ef55613045da9 100644 GIT binary patch delta 17 ZcmaDI@H$|^_Q^+BZ8v_&SD#qG0RUFC2%7)^ delta 77 vcmaDI@H$|^c1uPEGyoNVQH%_XASRd#WrMg(j2k}`t8+|a44LA}5F!KsPgw|a diff --git a/src/main.c b/src/main.c index e154213..5d03e40 100644 --- a/src/main.c +++ b/src/main.c @@ -8,14 +8,16 @@ #include "./sprite.h" #include "./vec.h" +#define SPRITE_NO 11 + void init_gfx() { // Load Background tiles and then map set_bkg_data(0, 23, tiles); set_bkg_tiles(0, 0, map.width, map.height, map.data); - set_sprite_data(0, 11, sprites); - set_sprite_tile(0, 2); + set_sprite_data(0, 12, sprites); + set_sprite_tile(0, SPRITE_NO); set_sprite_prop(0, 0); // Turn the background map on to make it visible @@ -36,7 +38,7 @@ void main(void) sprite.vel.y = 0; sprite.acc.x = 0; sprite.acc.y = 0; - sprite.collision_offset = sprite_offsets[0]; + sprite.collision_offset = sprite_offsets[SPRITE_NO]; move_sprite(0, sprite.pos.x, sprite.pos.y); -- 2.45.2 From 0615ab5073ec64998b6d0a4dead1ff03206c6bbb Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Fri, 10 Jun 2022 23:07:14 +0100 Subject: [PATCH 3/4] all collision information is stored with sprites, support multiple sprites --- res/sprite_metadata.c | 74 ++++++++++++++++++++++++++++++++++++++++++ res/sprite_metadata.h | 3 ++ res/sprites.c | 26 ++++----------- res/sprites.gbr | Bin 10069 -> 10069 bytes res/sprites.h | 4 +-- src/flags.h | 9 +++++ src/main.c | 46 ++++++++++++++++---------- src/sprite.c | 32 ++++++++++-------- src/sprite.h | 8 ++++- 9 files changed, 147 insertions(+), 55 deletions(-) create mode 100644 res/sprite_metadata.c create mode 100644 res/sprite_metadata.h diff --git a/res/sprite_metadata.c b/res/sprite_metadata.c new file mode 100644 index 0000000..47fecf4 --- /dev/null +++ b/res/sprite_metadata.c @@ -0,0 +1,74 @@ +#include +#include "../src/sprite.h" +#include "../src/flags.h" + +Sprite sprites_info[] = { + { + .frames_since_last_dash = 0, + .frames_since_last_jump = 0, + .name = "arrow", + .has_diag_sprites = 0, + .bitmap_index = SI_LEFT, + .has_joypad = 0, + .pos = { .x = 0, .y = 0}, + .vel = { .x = 0, .y = 0}, + .acc = { .x = 0, .y = 0}, + + .bitmap_indexes[SI_UP] = 12, .bitmap_prop[SI_UP] = 0, + .collision_offset[SI_UP] = { + .itl = { .x = 3, .y = 8}, + .itr = { .x = 1, .y = 8}, + .ibl = { .x = 3, .y = 1}, + .ibr = { .x = 1, .y = 1}, + }, + .bitmap_indexes[SI_DOWN] = 12, .bitmap_prop[SI_DOWN] = S_FLIPY, + .collision_offset[SI_DOWN] = { + .itl = { .x = 8, .y = 8}, + .itr = { .x = 5, .y = 8}, + .ibl = { .x = 8, .y = 1}, + .ibr = { .x = 5, .y = 1}, + }, + .bitmap_indexes[SI_LEFT] = 11, .bitmap_prop[SI_LEFT] = 0, + .collision_offset[SI_LEFT] = { + .itl = { .x = 8, .y = 3}, + .itr = { .x = 1, .y = 3}, + .ibl = { .x = 8, .y = 1}, + .ibr = { .x = 1, .y = 1}, + }, + .bitmap_indexes[SI_RIGHT] = 11, .bitmap_prop[SI_RIGHT] = S_FLIPX, + .collision_offset[SI_RIGHT] = { + .itl = { .x = 8, .y = 3}, + .itr = { .x = 1, .y = 3}, + .ibl = { .x = 8, .y = 1}, + .ibr = { .x = 1, .y = 1}, + }, + .bitmap_indexes[SI_UP_RIGHT] = 13, .bitmap_prop[SI_UP_RIGHT] = 0, + .collision_offset[SI_UP_RIGHT] = { + .itl = { .x = 7, .y = 8}, + .itr = { .x = 1, .y = 8}, + .ibl = { .x = 7, .y = 2}, + .ibr = { .x = 1, .y = 2}, + }, + .bitmap_indexes[SI_UP_LEFT] = 13, .bitmap_prop[SI_UP_LEFT] = S_FLIPX, + .collision_offset[SI_UP_LEFT] = { + .itl = { .x = 8, .y = 8}, + .itr = { .x = 2, .y = 8}, + .ibl = { .x = 8, .y = 2}, + .ibr = { .x = 2, .y = 2}, + }, + .bitmap_indexes[SI_DOWN_LEFT] = 13, .bitmap_prop[SI_DOWN_LEFT] = S_FLIPX | S_FLIPY, + .collision_offset[SI_DOWN_LEFT] = { + .itl = { .x = 8, .y = 7}, + .itr = { .x = 2, .y = 7}, + .ibl = { .x = 8, .y = 1}, + .ibr = { .x = 2, .y = 1}, + }, + .bitmap_indexes[SI_DOWN_RIGHT] = 13, .bitmap_prop[SI_DOWN_RIGHT] = S_FLIPY, + .collision_offset[SI_DOWN_RIGHT] = { + .itl = { .x = 7, .y = 7}, + .itr = { .x = 1, .y = 7}, + .ibl = { .x = 7, .y = 1}, + .ibr = { .x = 1, .y = 1}, + } + } +}; diff --git a/res/sprite_metadata.h b/res/sprite_metadata.h new file mode 100644 index 0000000..84d6d32 --- /dev/null +++ b/res/sprite_metadata.h @@ -0,0 +1,3 @@ +#include "../src/sprite.h" + +extern Sprite sprites_info[]; diff --git a/res/sprites.c b/res/sprites.c index d32c5a4..0b8b68a 100644 --- a/res/sprites.c +++ b/res/sprites.c @@ -10,7 +10,7 @@ Compression : None. Counter : None. Tile size : 8 x 8 - Tiles : 0 to 11 + Tiles : 0 to 13 Palette colors : None. SGB Palette : None. @@ -22,8 +22,6 @@ */ -#include "../src/sprite.h" - /* Start of tile array. */ unsigned char sprites[] = { @@ -50,23 +48,11 @@ unsigned char sprites[] = 0x43,0xC3,0xDB,0xDB,0x3C,0x3C,0x7E,0x7E, 0x7E,0x7E,0x3C,0x3C,0xDB,0xDB,0x43,0xC3, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x43,0x38,0xC6,0x00,0x43 + 0x00,0x00,0x00,0x43,0x38,0xC6,0x00,0x43, + 0x00,0x02,0x00,0x07,0x02,0x00,0x02,0x00, + 0x02,0x00,0x00,0x02,0x00,0x07,0x00,0x05, + 0x00,0x03,0x02,0x01,0x04,0x00,0x08,0x00, + 0x00,0x30,0x00,0x50,0x00,0x20,0x00,0x00 }; - -// define the collision box of each sprite in the tileset -SpriteCorners sprite_offsets[] = { - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 8}, .itr = { .x = 1, .y = 8}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, }, - { .itl = { .x = 8, .y = 3}, .itr = { .x = 1, .y = 3}, .ibl = { .x = 8, .y = 1}, .ibr = { .x = 1, .y = 1}, } -}; /* End of SPRITES.C */ diff --git a/res/sprites.gbr b/res/sprites.gbr index de0a94ff2e2c1019fa37a5e51a6d3d951ac252e0..e6ab671aef6c8b17768518e998847055ec713e6a 100644 GIT binary patch delta 155 zcmccWchzr#9vcHg%xfQbppV1)1)&}lSvObl=Vhz3RoAF2&PLCr*{ e-F%R_SB8%ns8<-M3#f>Zfobz0g>JTq1snj62@LiC delta 55 zcmccWchzr#9@}I_Mg|6kjV5i(o6T8jWhOhY)bcSiFfj-NMS(Iv+0BO(y4g4~Qj@ct H@+&w1hh7Z~ diff --git a/res/sprites.h b/res/sprites.h index 49f5dda..d57e0f0 100644 --- a/res/sprites.h +++ b/res/sprites.h @@ -10,7 +10,7 @@ Compression : None. Counter : None. Tile size : 8 x 8 - Tiles : 0 to 11 + Tiles : 0 to 13 Palette colors : None. SGB Palette : None. @@ -22,12 +22,10 @@ */ -#include "../src/sprite.h" /* Bank of tiles. */ #define spritesBank 0 /* Start of tile array. */ extern unsigned char sprites[]; -extern SpriteCorners sprite_offsets[]; /* End of SPRITES.H */ diff --git a/src/flags.h b/src/flags.h index 585ee16..228b1b0 100644 --- a/src/flags.h +++ b/src/flags.h @@ -24,6 +24,15 @@ #define SC_IBL 0b0010 #define SC_IBR 0b0001 +#define SI_UP 0 +#define SI_DOWN 1 +#define SI_LEFT 2 +#define SI_RIGHT 3 +#define SI_UP_RIGHT 4 +#define SI_DOWN_RIGHT 5 +#define SI_UP_LEFT 6 +#define SI_DOWN_LEFT 7 + /* Sprite Collision point diagram: * x TL LT x * ------------ diff --git a/src/main.c b/src/main.c index 5d03e40..3115be6 100644 --- a/src/main.c +++ b/src/main.c @@ -1,24 +1,25 @@ #include +#include #include +#include +#include #include "../res/tiles.h" #include "../res/map.h" #include"../res/sprites.h" +#include"../res/sprite_metadata.h" #include "./flags.h" #include "./constants.h" #include "./sprite.h" #include "./vec.h" -#define SPRITE_NO 11 +#define NO_SCREEN_SPRITES 2 void init_gfx() { // Load Background tiles and then map set_bkg_data(0, 23, tiles); set_bkg_tiles(0, 0, map.width, map.height, map.data); - - set_sprite_data(0, 12, sprites); - set_sprite_tile(0, SPRITE_NO); - set_sprite_prop(0, 0); + set_sprite_data(0, 14, sprites); // Turn the background map on to make it visible SHOW_BKG; @@ -27,26 +28,35 @@ void init_gfx() void main(void) { - unsigned int fc = 0; - struct Sprites sprite; - init_gfx(); - sprite.pos.x = 72; - sprite.pos.y = 36; - sprite.vel.x = 0; - sprite.vel.y = 0; - sprite.acc.x = 0; - sprite.acc.y = 0; - sprite.collision_offset = sprite_offsets[SPRITE_NO]; - move_sprite(0, sprite.pos.x, sprite.pos.y); + unsigned int i, jp, fc = 0; + struct Sprites screen_sprites[NO_SCREEN_SPRITES]; + + + memcpy(&(screen_sprites[0]), &(sprites_info[0]), sizeof(Sprite)); + memcpy(&(screen_sprites[1]), &(sprites_info[0]), sizeof(Sprite)); + screen_sprites[0].has_joypad = 1; + screen_sprites[1].bitmap_index = SI_UP; + + for (i = 0; i < NO_SCREEN_SPRITES; i++) { + set_sprite_tile(i, screen_sprites[i].bitmap_indexes[screen_sprites[i].bitmap_index]); + set_sprite_prop(i, screen_sprites[i].bitmap_prop[screen_sprites[i].bitmap_index]); + screen_sprites[i].pos.x = 72+(8*i); + screen_sprites[i].pos.y = 36+(8*i); + move_sprite(i, screen_sprites[i].pos.x, screen_sprites[i].pos.y); + } // Loop forever while(1) { fc++; - sprite_iter_frame(&sprite, &map, joypad(), &fc); - move_sprite(0, sprite.pos.x, sprite.pos.y); + jp = joypad(); + for (i = 0; i < NO_SCREEN_SPRITES; i++) { + sprite_iter_frame(&(screen_sprites[i]), &map, screen_sprites[i].has_joypad ? jp : 0, &fc); + move_sprite(i, screen_sprites[i].pos.x, screen_sprites[i].pos.y); + //gprintf("x: %d y: %d\n", sprites[i].pos.x, sprites[i].pos.y); + } // Done processing, yield CPU and wait for start of next frame wait_vbl_done(); diff --git a/src/sprite.c b/src/sprite.c index 504dd46..b0c48b8 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -17,7 +17,13 @@ typedef struct SpriteCorners { typedef struct Sprites { int frames_since_last_dash; int frames_since_last_jump; - SpriteCorners collision_offset; + int bitmap_index; + int bitmap_indexes[8]; + int bitmap_prop[8]; + int has_diag_sprites; + int has_joypad; + char name[20]; + SpriteCorners collision_offset[8]; UVec pos; Vec vel; Vec acc; @@ -25,7 +31,7 @@ typedef struct Sprites { int get_tile_index_by_coord(unsigned int x, unsigned int y); -void getSpriteCorners(Sprite *sprite, SpriteCorners *r); +void get_sprite_corners(Sprite *sprite, SpriteCorners *r); void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc); unsigned int sprite_internal_collision(Map *map, Sprite *sprite); unsigned int sprite_collision(Map *map, Sprite *sprite); @@ -37,16 +43,16 @@ int get_tile_index_by_coord(unsigned int x, unsigned int y) } -void getSpriteCorners(Sprite *sprite, SpriteCorners *sc) +void get_sprite_corners(Sprite *sprite, SpriteCorners *sc) { - sc->itl.x = sprite->pos.x - sprite->collision_offset.itl.x; - sc->itl.y = sprite->pos.y - sprite->collision_offset.itl.y - 8; - sc->itr.x = sprite->pos.x - sprite->collision_offset.itr.x; - sc->itr.y = sprite->pos.y - sprite->collision_offset.itr.y - 8; - sc->ibl.x = sprite->pos.x - sprite->collision_offset.ibl.x; - sc->ibl.y = sprite->pos.y - sprite->collision_offset.ibl.y - 8; - sc->ibr.x = sprite->pos.x - sprite->collision_offset.ibr.x; - sc->ibr.y = sprite->pos.y - sprite->collision_offset.ibr.y - 8; + sc->itl.x = sprite->pos.x - sprite->collision_offset[sprite->bitmap_index].itl.x; + sc->itl.y = sprite->pos.y - sprite->collision_offset[sprite->bitmap_index].itl.y - 8; + sc->itr.x = sprite->pos.x - sprite->collision_offset[sprite->bitmap_index].itr.x; + sc->itr.y = sprite->pos.y - sprite->collision_offset[sprite->bitmap_index].itr.y - 8; + sc->ibl.x = sprite->pos.x - sprite->collision_offset[sprite->bitmap_index].ibl.x; + sc->ibl.y = sprite->pos.y - sprite->collision_offset[sprite->bitmap_index].ibl.y - 8; + sc->ibr.x = sprite->pos.x - sprite->collision_offset[sprite->bitmap_index].ibr.x; + sc->ibr.y = sprite->pos.y - sprite->collision_offset[sprite->bitmap_index].ibr.y - 8; } @@ -149,7 +155,7 @@ unsigned int sprite_internal_collision(Map *map, Sprite *sprite) { unsigned int rv = 0; SpriteCorners sc; - getSpriteCorners(sprite, &sc); + get_sprite_corners(sprite, &sc); if (map->data[get_tile_index_by_coord(sc.itl.x, sc.itl.y)]) rv = rv | SC_ITL; if (map->data[get_tile_index_by_coord(sc.itr.x, sc.itr.y)]) rv = rv | SC_ITR; @@ -165,7 +171,7 @@ unsigned int sprite_collision(Map *map, Sprite *sprite) { unsigned int rv = 0; SpriteCorners sc; - getSpriteCorners(sprite, &sc); + get_sprite_corners(sprite, &sc); // check if corners are in a non 0 tile if (map->data[get_tile_index_by_coord(sc.itl.x, sc.itl.y-1)]) rv = rv | SC_TL; diff --git a/src/sprite.h b/src/sprite.h index 7285059..c37790e 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -14,7 +14,13 @@ typedef struct SpriteCorners { typedef struct Sprites { int frames_since_last_dash; int frames_since_last_jump; - SpriteCorners collision_offset; + int bitmap_index; + int bitmap_indexes[8]; + int bitmap_prop[8]; + int has_diag_sprites; + int has_joypad; + char name[20]; + SpriteCorners collision_offset[8]; UVec pos; Vec vel; Vec acc; -- 2.45.2 From 3eb6cc58efe99dbb5f0756f89e19f244ea90d800 Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Sun, 12 Jun 2022 19:31:27 +0100 Subject: [PATCH 4/4] move screen drawing logic outside of main.c --- src/main.c | 7 +++---- src/sprite.c | 31 +++++++++++++++++++++++++++++++ src/sprite.h | 3 +++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main.c b/src/main.c index 3115be6..023103d 100644 --- a/src/main.c +++ b/src/main.c @@ -40,11 +40,11 @@ void main(void) screen_sprites[1].bitmap_index = SI_UP; for (i = 0; i < NO_SCREEN_SPRITES; i++) { - set_sprite_tile(i, screen_sprites[i].bitmap_indexes[screen_sprites[i].bitmap_index]); - set_sprite_prop(i, screen_sprites[i].bitmap_prop[screen_sprites[i].bitmap_index]); + screen_sprites[i].bitmap_index_prev = -1; + screen_sprites[i].gb_sprite_index = i; screen_sprites[i].pos.x = 72+(8*i); screen_sprites[i].pos.y = 36+(8*i); - move_sprite(i, screen_sprites[i].pos.x, screen_sprites[i].pos.y); + sprite_draw_to_screen(&(screen_sprites[i])); } @@ -54,7 +54,6 @@ void main(void) jp = joypad(); for (i = 0; i < NO_SCREEN_SPRITES; i++) { sprite_iter_frame(&(screen_sprites[i]), &map, screen_sprites[i].has_joypad ? jp : 0, &fc); - move_sprite(i, screen_sprites[i].pos.x, screen_sprites[i].pos.y); //gprintf("x: %d y: %d\n", sprites[i].pos.x, sprites[i].pos.y); } diff --git a/src/sprite.c b/src/sprite.c index b0c48b8..49fb870 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -15,8 +15,10 @@ typedef struct SpriteCorners { typedef struct Sprites { + int gb_sprite_index; int frames_since_last_dash; int frames_since_last_jump; + int bitmap_index_prev; int bitmap_index; int bitmap_indexes[8]; int bitmap_prop[8]; @@ -35,6 +37,8 @@ void get_sprite_corners(Sprite *sprite, SpriteCorners *r); void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc); unsigned int sprite_internal_collision(Map *map, Sprite *sprite); unsigned int sprite_collision(Map *map, Sprite *sprite); +void sprite_draw_to_screen(Sprite *sprite); +void sprite_update_bitmap(Sprite *sprite); int get_tile_index_by_coord(unsigned int x, unsigned int y) @@ -147,6 +151,9 @@ void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc) if (!sprite_internal_collision(map, sprite)) break; } + + sprite_update_bitmap(sprite); + sprite_draw_to_screen(sprite); } @@ -185,3 +192,27 @@ unsigned int sprite_collision(Map *map, Sprite *sprite) return rv; } + +void sprite_update_bitmap(Sprite *sprite) +{ + sprite->bitmap_index_prev = sprite->bitmap_index; + + if ((sprite->vel.y > 0) && (sprite->vel.x > 0)) sprite->bitmap_index = SI_DOWN_RIGHT; + else if ((sprite->vel.y < 0) && (sprite->vel.x > 0)) sprite->bitmap_index = SI_UP_RIGHT; + else if ((sprite->vel.y > 0) && (sprite->vel.x < 0)) sprite->bitmap_index = SI_DOWN_LEFT; + else if ((sprite->vel.y < 0) && (sprite->vel.x < 0)) sprite->bitmap_index = SI_UP_LEFT; + + else if ( sprite->vel.y < 0) sprite->bitmap_index = SI_UP; + else if ( sprite->vel.y > 0) sprite->bitmap_index = SI_DOWN; + else if ( sprite->vel.x > 0) sprite->bitmap_index = SI_RIGHT; + else if ( sprite->vel.x < 0) sprite->bitmap_index = SI_LEFT; +} + +void sprite_draw_to_screen(Sprite *sprite) +{ + if (sprite->bitmap_index_prev != sprite->bitmap_index) { + set_sprite_tile(sprite->gb_sprite_index, sprite->bitmap_indexes[sprite->bitmap_index]); + set_sprite_prop(sprite->gb_sprite_index, sprite->bitmap_prop[sprite->bitmap_index]); + } + move_sprite(sprite->gb_sprite_index, sprite->pos.x, sprite->pos.y); +} diff --git a/src/sprite.h b/src/sprite.h index c37790e..9f94382 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -12,8 +12,10 @@ typedef struct SpriteCorners { } SpriteCorners; typedef struct Sprites { + int gb_sprite_index; int frames_since_last_dash; int frames_since_last_jump; + int bitmap_index_prev; int bitmap_index; int bitmap_indexes[8]; int bitmap_prop[8]; @@ -29,5 +31,6 @@ typedef struct Sprites { void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc); unsigned int sprite_internal_collision(Map *map, Sprite *sprite); unsigned int sprite_collision(Map *map, Sprite *sprite); +void sprite_draw_to_screen(Sprite *sprite); #endif -- 2.45.2