From 3c98e0168e24ef347f2c0fcd2152c6891e207799 Mon Sep 17 00:00:00 2001 From: Shadow15510 Date: Sat, 17 Jul 2021 15:32:47 +0200 Subject: [PATCH] Add animated player and animated water --- project/assets-fx/converters.py | 2 +- project/assets-fx/map/world.csv | 2 +- project/assets-fx/player.png | Bin 897 -> 21868 bytes project/assets-fx/tileset.png | Bin 1657 -> 14910 bytes project/src/core.c | 52 +++++++++++++++++++++++--------- project/src/core.h | 12 +++++--- project/src/display_engine.c | 18 ++++++----- project/src/display_engine.h | 4 +-- project/src/main.c | 11 +++---- 9 files changed, 63 insertions(+), 38 deletions(-) diff --git a/project/assets-fx/converters.py b/project/assets-fx/converters.py index 315f68a..2f274f7 100644 --- a/project/assets-fx/converters.py +++ b/project/assets-fx/converters.py @@ -23,7 +23,7 @@ def convert_map(input_name, output, params, target): for value in line.split(","): value = int(value) tiles += fxconv.u32(value) - collision += fxconv.u8(int(value in walkable)) + collision += fxconv.u8(value in walkable) data = fxconv.ObjectData() data += tiles + collision diff --git a/project/assets-fx/map/world.csv b/project/assets-fx/map/world.csv index dd902c8..95126fb 100644 --- a/project/assets-fx/map/world.csv +++ b/project/assets-fx/map/world.csv @@ -29,4 +29,4 @@ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,63,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,63,-1,-1,-1,-1,-1,-1,-1,-1,-1,25,-1,-1,-1,57,20,58,59,-1,-1,-1,-1,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,25,-1,-1,-1,-1,-1,-1,-1,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 --1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 +-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 \ No newline at end of file diff --git a/project/assets-fx/player.png b/project/assets-fx/player.png index 4e1a81c4ce494c94916c5148fd5971fddb20f48f..32a0bc2074cb0d005aa3652203a89b6ef486f71a 100644 GIT binary patch literal 21868 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 delta 1641 zcmV-v2A280bomUBBYyw^b5ch_0Itp)=>Px*Gf6~2RA_+yCl7HDs*z7u=G`TZtaIC5ANH~Q39NRro!{kD6l`uDZ@iXS`X^f6WPeQCcp zu5vy}E1fI8aeo5ftY(NWB#2|pZx`B)Y}?0i>iY)IrRbLTxo^!VH)9+fEoMx9jtD)& z$hPjqE3KR}HqF2j_37i7Xwv;0ANr%wcssic+fU42pn6xAY7JbLc$zs0*U)FqP~!IKg{;-6;3o1s}8#JC;~~pdaVY{v46*SRL02>i*n9>zt?H2?c=B`~1_wlWL zRy&{9B`4NzTibk{-=$N2_US+0k{uys`OAFZ-XQXQ;nb*e0nkl-H}@8_o7c&3*NE{+ zL@VBeg@0D+lM7uJk6YV<-YXnb(ZseT@0-OzUZ_6VYlJ;{atXs_tdPZ8NuS~2p9KFZq zZ0LH1p9_ur3m!(A-zdA7%u7^Kaok+X3}5nGaeqvPbJ>46sgY$ZRzJJy`ur_V%@(EY z4_xp-!9>%daTqc3_HaTXrk6K@-N-D^aAM)HWyax+op@@DPt+JaNR=Be>D&)YcK zR$tP{Xw5s?%93*VNnck#@4jqNWqSYgp6b1p4P6oJk9n$3V*#|+e*}@&=CmsFY0e`! zaes}`d|#%>YXB@5EA9t(&qrzVRR8j=J=wk^!>lbL2KKQGj=2b2e>ax)8fRO_(W!4C zV1QI(^0CIZj;d5X!;TPXB*jMFT=urUo&(}~&UWUXahQHE_m5Cp=%`Wve|5@T+MyO_ zv9I{Lo)+KglApBjky#3DUv~Uqm1F1cx_?qleT}%UuYPOIUTGRs%ptMz&V50nEH~F| zZmqM?sXoW=2D}olcf3v_i(J+r+Cl^Z$XL~=IvXfg4Q_;ey1LeD8#mE%A$Fl~T)#N~ z0Y*oQ%!#q$=OXRz=T;na2(`(s;=E$orTXc)^XxdK6lo_~n&ZwUHpCrL^bT)=kAjzEK)_Es9 zP=I!|s9^#YWU&RQe10D@{Gu&{euk${G@?{MB^lEnhFQ|y*)fd1=k$*g`T&J2R z`B5?QTC>Jt+ZxA9Is&!-pvEDZK}P4;aJ`pil4#|5BbP6k^l0X+bn39DR}U@lQI1v? z_tOP+V-zLk-&O$$2;l!sC$3i7gCv@`n|B}0@Q2!G;Pm4!R=g}ij5SSP;XD>KoSH#i zk3#pC2p8edDim|ZWwh6edw<7^sST%Uykw}WcdwoNZjzVHq?Cc}G5kIT{eu7hfKKmL zz>`MH3)Z74rzA(B^Sc#@)RTpW;qb9!WBc(;dJs?Lgj4Xq6SjmWm>`(Z3w3PBwater_frame = (game->water_frame + 1) % 2; + game->total_tick += ENGINE_TICK; + + if (!(game->total_tick % 200)) game->water_frame = (game->water_frame + 1) % 8; + if (!(game->total_tick % 500)) + { + switch (game->player->animation_frame) + { + case 2: + game->player->animation_frame = 0; + break; + + case 3: + game->player->animation_frame = 1; + break; + + default: + game->player->animation_frame = (game->player->animation_frame + 1) % 2; + break; + } + } } void analyze_input(struct game *game, const int last_key) { - game->total_tick += ENGINE_TICK; switch (last_key) { case KEY_UP: - if (is_walkable(*game, UP)) game->world_y -= 1; - game->player.direction = UP; + if (is_walkable(game, UP)) game->world_y -= 1; + game->player->direction = UP; + game->player->animation_frame = 2 + (game->player->animation_frame + 1) % 2; break; case KEY_RIGHT: - if (is_walkable(*game, RIGHT)) game->world_x += 1; - game->player.direction = RIGHT; + if (is_walkable(game, RIGHT)) game->world_x += 1; + game->player->direction = RIGHT; + game->player->animation_frame = 2 + (game->player->animation_frame + 1) % 2; break; case KEY_DOWN: - if (is_walkable(*game, DOWN)) game->world_y += 1; - game->player.direction = DOWN; + if (is_walkable(game, DOWN)) game->world_y += 1; + game->player->direction = DOWN; + game->player->animation_frame = 2 + (game->player->animation_frame + 1) % 2; break; case KEY_LEFT: - if (is_walkable(*game, LEFT)) game->world_x -= 1; - game->player.direction = LEFT; + if (is_walkable(game, LEFT)) game->world_x -= 1; + game->player->direction = LEFT; + game->player->animation_frame = 2 + (game->player->animation_frame + 1) % 2; break; } } -int is_walkable(const struct game game, const int direction) +uint8_t is_walkable(const struct game *game, const int direction) { switch (direction) { case UP: - return game.map.collision[game.world_y + 4][game.world_x + 7]; + if (game->world_y + 4 >= 0) return game->map->collision[game->world_y + 4][game->world_x + 7]; break; case RIGHT: - return game.map.collision[game.world_y + 5][game.world_x + 8]; + if (game->world_x + 8 < MAP_WIDTH) return game->map->collision[game->world_y + 5][game->world_x + 8]; break; case DOWN: - return game.map.collision[game.world_y + 6][game.world_x + 7]; + if (game->world_y + 6 < MAP_HEIGHT) return game->map->collision[game->world_y + 6][game->world_x + 7]; break; case LEFT: - return game.map.collision[game.world_y + 5][game.world_x + 6]; + if (game->world_x + 5 >= 0) return game->map->collision[game->world_y + 5][game->world_x + 6]; break; } return 0; diff --git a/project/src/core.h b/project/src/core.h index d985f51..25fffbb 100644 --- a/project/src/core.h +++ b/project/src/core.h @@ -7,11 +7,12 @@ #define TILESET_WIDTH 19 #define TILE_SIZE 8 -#define MAP_WIDTH 64 -#define MAP_HEIGHT 32 #define SCREEN_WIDTH 16 #define SCREEN_HEIGHT 8 +#define MAP_WIDTH 64 +#define MAP_HEIGHT 32 + #define UP 0 #define RIGHT 1 #define DOWN 2 @@ -20,6 +21,7 @@ struct player { int direction; + int animation_frame; }; struct map @@ -33,10 +35,10 @@ struct map struct game { // Current map and coord's map in the world - struct map map; + const struct map *map; int world_x, world_y; - struct player player; + struct player *player; int total_tick; int water_frame; @@ -49,7 +51,7 @@ void next_frame(struct game *game); void analyze_input(struct game *game, const int last_key); // is_walkable : check if the player can go on the targeted case -int is_walkable(const struct game game, const int direction); +uint8_t is_walkable(const struct game *game, const int direction); // rtc_key : returns the key code with RTC system int rtc_key(void); diff --git a/project/src/display_engine.c b/project/src/display_engine.c index cfbf6be..6c882f7 100644 --- a/project/src/display_engine.c +++ b/project/src/display_engine.c @@ -4,7 +4,7 @@ #include "display_engine.h" -void draw_map(const struct game game) +void draw_map(const struct game *game) { extern const bopti_image_t img_tileset; extern const bopti_image_t img_water; @@ -13,11 +13,13 @@ void draw_map(const struct game game) { for (int j = 0; j < SCREEN_WIDTH; j++) { - if (game.map.data[game.world_y + i][game.world_x + j] != -1 && game.world_y + i < (MAP_HEIGHT) && game.world_y + i >= 0 && game.world_x + j < (MAP_WIDTH) && game.world_x + j >= 0) - { - int tile_x = (TILE_SIZE + 1) * (game.map.data[game.world_y + i][game.world_x + j] % TILESET_WIDTH), tile_y = (TILE_SIZE + 1) * (game.map.data[game.world_y + i][game.world_x + j] / TILESET_WIDTH); - if (game.map.data[game.world_y + i][game.world_x + j] != 56) dsubimage(j * TILE_SIZE, i * TILE_SIZE, &img_tileset, tile_x, tile_y, 8, 8, DIMAGE_NONE); - else dsubimage(j * TILE_SIZE, i * TILE_SIZE, &img_water, 9 * game.water_frame, 0, 8, 8, DIMAGE_NONE); + if ((game->world_y + i < MAP_HEIGHT && game->world_y + i >= 0 && game->world_x + j < MAP_WIDTH && game->world_x + j >= 0) && (game->map->data[game->world_y + i][game->world_x + j] != -1)) + { + unsigned int tile_x = (TILE_SIZE + 1) * (game->map->data[game->world_y + i][game->world_x + j] % TILESET_WIDTH); + unsigned int tile_y = (TILE_SIZE + 1) * (game->map->data[game->world_y + i][game->world_x + j] / TILESET_WIDTH); + + if (game->map->data[game->world_y + i][game->world_x + j] != 56) dsubimage(j * TILE_SIZE, i * TILE_SIZE, &img_tileset, tile_x, tile_y, 8, 8, DIMAGE_NONE); + else dsubimage(j * TILE_SIZE, i * TILE_SIZE, &img_water, 9 * game->water_frame, 0, 8, 8, DIMAGE_NONE); } } @@ -25,9 +27,9 @@ void draw_map(const struct game game) } -void draw_player(const struct game game) +void draw_player(const struct game *game) { extern const bopti_image_t img_player; - dsubimage(56, 35, &img_player, 0, 13 * game.player.direction, 8, 12, DIMAGE_NONE); + dsubimage(56, 35, &img_player, 9 * game->player->animation_frame, 13 * game->player->direction, 8, 12, DIMAGE_NONE); } diff --git a/project/src/display_engine.h b/project/src/display_engine.h index 6f8b7fe..7928b70 100644 --- a/project/src/display_engine.h +++ b/project/src/display_engine.h @@ -4,10 +4,10 @@ #include "core.h" // draw_map : display a map on the screen -void draw_map(const struct game game); +void draw_map(const struct game *game); //draw_player : display the player with animation -void draw_player(const struct game game); +void draw_player(const struct game *game); #endif /* _DISPLAY_ENGINE_H */ diff --git a/project/src/main.c b/project/src/main.c index 24ab675..f71b850 100644 --- a/project/src/main.c +++ b/project/src/main.c @@ -57,24 +57,23 @@ void main_loop(void) extern const struct map map_world; int key = 0; - struct player player = {DOWN}; - struct game game = {map_world, 0, 0, player, 0, 0}; + struct player player = {DOWN, 0}; + struct game game = {&map_world, 0, 0, &player, 0, 0}; static volatile int tick = 0; int t = timer_configure(TIMER_ANY, ENGINE_TICK*1000, GINT_CALL(callback_tick, &tick)); - if (t >= 0) timer_start(t); + if (t >= 0) timer_start(t); while (key != KEY_EXIT) { while (!tick) sleep(); tick = 0; - dclear(C_WHITE); next_frame(&game); - draw_map(game); - draw_player(game); + draw_map(&game); + draw_player(&game); dupdate();