From 32c2d32e6a19e452a7328a78215364eea198bde8 Mon Sep 17 00:00:00 2001 From: Alvie Rahman Date: Thu, 9 Jun 2022 14:05:02 +0100 Subject: [PATCH] maps are now structs --- res/map.c | 83 ++++++++++++++++++++++++++----------------------- res/map.h | 4 ++- src/main.c | 4 +-- src/map.h | 11 +++++++ src/sprite.c | 87 +++++++++++++++++++++++++++------------------------- src/sprite.h | 10 +++--- 6 files changed, 111 insertions(+), 88 deletions(-) create mode 100644 src/map.h diff --git a/res/map.c b/res/map.c index f4bbfbd..77a0549 100644 --- a/res/map.c +++ b/res/map.c @@ -15,51 +15,58 @@ Split data : No This file was generated by GBMB v1.8 + and modfied */ +#include "../src/map.h" + #define mapWidth 20 #define mapHeight 18 #define mapBank 0 -unsigned char map[] = -{ - 0x09,0x02,0x02,0x02,0x02,0x02,0x02,0x08,0x00,0x00, - 0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x0A, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x03,0x0F,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x11,0x00,0x00,0x0E,0x12,0x12,0x12, - 0x12,0x12,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x0E,0x12,0x12,0x0F,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x0B, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x13,0x13, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0B,0x13,0x13, - 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x00,0x00,0x00,0x00,0x00,0x05,0x0B,0x13,0x13,0x13, - 0x0C,0x01,0x01,0x01,0x01,0x01,0x01,0x06,0x00,0x00, - 0x00,0x05,0x01,0x01,0x01,0x0B,0x13,0x13,0x13,0x13 +Map map = { + .width = mapWidth, + .height = mapHeight, + .bank = mapBank, + .data = { + 0x09,0x02,0x02,0x02,0x02,0x02,0x02,0x08,0x00,0x00, + 0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x0A, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x0D,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x03,0x0F,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x11,0x00,0x00,0x0E,0x12,0x12,0x12, + 0x12,0x12,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x0E,0x12,0x12,0x0F,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x01,0x0B, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x13,0x13, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x0B,0x13,0x13, + 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x05,0x0B,0x13,0x13,0x13, + 0x0C,0x01,0x01,0x01,0x01,0x01,0x01,0x06,0x00,0x00, + 0x00,0x05,0x01,0x01,0x01,0x0B,0x13,0x13,0x13,0x13 + } }; /* End of MAP.C */ diff --git a/res/map.h b/res/map.h index 16f1362..14da8f1 100644 --- a/res/map.h +++ b/res/map.h @@ -22,6 +22,8 @@ #define mapHeight 18 #define mapBank 0 -extern unsigned char map[]; +#include "../src/map.h" + +extern Map map; /* End of MAP.H */ diff --git a/src/main.c b/src/main.c index ac2969e..b7a8887 100644 --- a/src/main.c +++ b/src/main.c @@ -12,7 +12,7 @@ void init_gfx() { // Load Background tiles and then map set_bkg_data(0, 23, tiles); - set_bkg_tiles(0, 0, mapWidth, mapHeight, map); + set_bkg_tiles(0, 0, map.width, map.height, map.data); set_sprite_data(0, 11, sprites); set_sprite_tile(0, 2); @@ -42,7 +42,7 @@ void main(void) // Loop forever while(1) { fc++; - sprite_iter_frame(&sprite, map, joypad(), &fc); + sprite_iter_frame(&sprite, &map, joypad(), &fc); move_sprite(0, sprite.pos.x, sprite.pos.y); // Done processing, yield CPU and wait for start of next frame diff --git a/src/map.h b/src/map.h new file mode 100644 index 0000000..0f4ebe4 --- /dev/null +++ b/src/map.h @@ -0,0 +1,11 @@ +#ifndef MAP_H_ +#define MAP_H_ + +typedef struct Map { + unsigned int width; + unsigned int height; + unsigned int bank; + unsigned char data[]; +} Map; + +#endif diff --git a/src/sprite.c b/src/sprite.c index db6deca..0397c70 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -3,6 +3,8 @@ #include "./vec.h" #include "./constants.h" #include "./flags.h" +#include "./map.h" + typedef struct Sprites { int frames_since_last_dash; @@ -22,14 +24,34 @@ typedef struct SpriteCorners { } SpriteCorners; -void sprite_iter_frame(Sprite *sprite, unsigned char map[], int joypad, unsigned int *fc); -int getTileIndexByCoord(unsigned int x, unsigned int y); -unsigned int sprite_internal_collision(unsigned char map[], Sprite *sprite); -unsigned int sprite_collision(unsigned char map[], Sprite *sprite); -void sprite_decollide(unsigned char map[], Sprite *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); +unsigned int sprite_internal_collision(Map *map, Sprite *sprite); +unsigned int sprite_collision(Map *map, Sprite *sprite); + + +int get_tile_index_by_coord(unsigned int x, unsigned int y) +{ + return ((y / PIXELS_PER_TILE) * 20) + (x / PIXELS_PER_TILE); +} + + +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; +} + // update a sprite for stuff that changes every frame -void sprite_iter_frame(Sprite *sprite, unsigned char map[], int joypad, unsigned int *fc) +void sprite_iter_frame(Sprite *sprite, Map *map, int joypad, unsigned int *fc) { int c, collision_check_steps; @@ -122,55 +144,38 @@ void sprite_iter_frame(Sprite *sprite, unsigned char map[], int joypad, unsigned } -int getTileIndexByCoord(unsigned int x, unsigned int y) -{ - return ((y / PIXELS_PER_TILE) * 20) + (x / PIXELS_PER_TILE); -} - - -SpriteCorners *getSpriteCorners(Sprite *sprite) -{ - SpriteCorners r = { - .itl = { .x = sprite->pos.x-8, .y = sprite->pos.y-16 }, - .itr = { .x = sprite->pos.x-1, .y = sprite->pos.y-16 }, - .ibl = { .x = sprite->pos.x-8, .y = sprite->pos.y-9 }, - .ibr = { .x = sprite->pos.x-1, .y = sprite->pos.y-9 } - }; - return &r; -} - - - // calculate internal collisions -unsigned int sprite_internal_collision(unsigned char map[], Sprite *sprite) +unsigned int sprite_internal_collision(Map *map, Sprite *sprite) { unsigned int rv = 0; - SpriteCorners *sc = getSpriteCorners(sprite); + SpriteCorners sc; + getSpriteCorners(sprite, &sc); - if (map[getTileIndexByCoord(sc->itl.x, sc->itl.y)]) rv = rv | SC_ITL; - if (map[getTileIndexByCoord(sc->itr.x, sc->itr.y)]) rv = rv | SC_ITR; - if (map[getTileIndexByCoord(sc->ibl.x, sc->ibl.y)]) rv = rv | SC_IBL; - if (map[getTileIndexByCoord(sc->ibr.x, sc->ibr.y)]) rv = rv | SC_IBR; + 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; + if (map->data[get_tile_index_by_coord(sc.ibl.x, sc.ibl.y)]) rv = rv | SC_IBL; + if (map->data[get_tile_index_by_coord(sc.ibr.x, sc.ibr.y)]) rv = rv | SC_IBR; return rv; } // check for external collisions (if rectangle is at least touchign something) -unsigned int sprite_collision(unsigned char map[], Sprite *sprite) +unsigned int sprite_collision(Map *map, Sprite *sprite) { unsigned int rv = 0; - SpriteCorners *sc = getSpriteCorners(sprite); + SpriteCorners sc; + getSpriteCorners(sprite, &sc); // check if corners are in a non 0 tile - if (map[getTileIndexByCoord(sc->itl.x, sc->itl.y-1)]) rv = rv | SC_TL; - if (map[getTileIndexByCoord(sc->itr.x, sc->itr.y-1)]) rv = rv | SC_TR; - if (map[getTileIndexByCoord(sc->ibl.x, sc->ibl.y+1)]) rv = rv | SC_BL; - if (map[getTileIndexByCoord(sc->ibr.x, sc->ibr.y+1)]) rv = rv | SC_BR; - if (map[getTileIndexByCoord(sc->itl.x-1, sc->itl.y)]) rv = rv | SC_LT; - if (map[getTileIndexByCoord(sc->ibl.x-1, sc->ibl.y)]) rv = rv | SC_LB; - if (map[getTileIndexByCoord(sc->itr.x+1, sc->itr.y)]) rv = rv | SC_RT; - if (map[getTileIndexByCoord(sc->ibr.x+1, sc->ibr.y)]) rv = rv | SC_RB; + if (map->data[get_tile_index_by_coord(sc.itl.x, sc.itl.y-1)]) rv = rv | SC_TL; + if (map->data[get_tile_index_by_coord(sc.itr.x, sc.itr.y-1)]) rv = rv | SC_TR; + if (map->data[get_tile_index_by_coord(sc.ibl.x, sc.ibl.y+1)]) rv = rv | SC_BL; + if (map->data[get_tile_index_by_coord(sc.ibr.x, sc.ibr.y+1)]) rv = rv | SC_BR; + if (map->data[get_tile_index_by_coord(sc.itl.x-1, sc.itl.y )]) rv = rv | SC_LT; + if (map->data[get_tile_index_by_coord(sc.ibl.x-1, sc.ibl.y )]) rv = rv | SC_LB; + if (map->data[get_tile_index_by_coord(sc.itr.x+1, sc.itr.y )]) rv = rv | SC_RT; + if (map->data[get_tile_index_by_coord(sc.ibr.x+1, sc.ibr.y )]) rv = rv | SC_RB; return rv; } diff --git a/src/sprite.h b/src/sprite.h index 423dcc8..46fa765 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -2,6 +2,7 @@ #define SPRITE_H_ #include "./vec.h" +#include "./map.h" typedef struct Sprites { int frames_since_last_dash; @@ -12,11 +13,8 @@ typedef struct Sprites { Vec acc; } Sprite; -void sprite_iter_frame(Sprite *sprite, unsigned char map[], int joypad, unsigned int *fc); -int getTileIndexByCoord(unsigned int x, unsigned int y); -unsigned int sprite_internal_collision(unsigned char map[], Sprite *sprite); -unsigned int sprite_collision(unsigned char map[], Sprite *sprite); -void sprite_decollide(unsigned char map[], Sprite *sprite); - +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); #endif