so://phie

freezo

A retro platform game
git clone git://soophie.de/freezo

feat: Added overlay animation & added soundtrack


commit: 3238b96f9db02ed03b8d51c7d017157fe1d62eaa
parent: b20f2032d2e15cd3c64fbf5a98492b7b12d7ea36
author: Sophie <info@soophie.de>
time: 2024-12-16 19:03

diff --git a/assets/tiles.png b/assets/tiles.png

index c4b6692..b8babe3 100644

Binary files a/assets/tiles.png and b/assets/tiles.png differ

diff --git a/assets/track.wav b/assets/track.wav

new file mode 100644

index 0000000..4074728

Binary files /dev/null and b/assets/track.wav differ

diff --git a/include/game.h b/include/game.h

index 60db194..7b1385d 100644

--- a/include/game.h

+++ b/include/game.h

1@@ -9,6 +9,9 @@ typedef struct Game game_t;

2 #include "menu.h"

3 #include "level.h"

4 #include "effect.h"

5+#include "door.h"

6+

7+#define GAME_SCEEN_TIMER 150

8

9 typedef enum {

10 STATE_MENU,

11@@ -21,6 +24,7 @@ struct Assets {

12 Texture2D font;

13 Texture2D images;

14 Texture2D background;

15+ Sound track;

16 };

17

18 struct Game {

19@@ -41,6 +45,7 @@ struct Game {

20 Camera2D camera;

21 int xp;

22 int sceen_timer;

23+ door_t *door;

24 };

25

26 game_t *game_create(void);

27

28

diff --git a/src/game.c b/src/game.c

index f5675f0..e65d798 100644

--- a/src/game.c

+++ b/src/game.c

1@@ -32,12 +32,14 @@ game_t *game_create(void) {

2 .assets.font = texture_load("assets/font.png", SCALE - 1),

3 .assets.images = texture_load("assets/images.png", SCALE),

4 .assets.background = texture_load("assets/background.png", SCALE),

5+ .assets.track = LoadSound("assets/track.wav"),

6 .camera = (Camera2D) {

7 .offset = (pos_t) { 0.0, 0.0 },

8 .zoom = 1,

9 },

10 .xp = 0,

11 .sceen_timer = 0,

12+ .door = NULL,

13 };

14 level_load(game, LEVEL_1);

15 return game;

16@@ -57,7 +59,7 @@ void game_update(game_t *game) {

17 if (game->level != NULL) {

18 // defeat

19 if (game->defeat) {

20- if (game->sceen_timer == 100) {

21+ if (game->sceen_timer == GAME_SCEEN_TIMER) {

22 level_e level = game->level->type;

23 level_unload(game);

24 level_load(game, level);

25@@ -71,7 +73,7 @@ void game_update(game_t *game) {

26 }

27 // victory

28 if (game->victory) {

29- if (game->sceen_timer == 100) {

30+ if (game->sceen_timer == GAME_SCEEN_TIMER) {

31 if (game->level->type < LEVELS) {

32 level_e level = game->level->type;

33 level++;

34@@ -82,6 +84,9 @@ void game_update(game_t *game) {

35 game->sceen_timer = 0;

36 }

37 else {

38+ if (game->sceen_timer == 125) {

39+ game->door->is_locked = true;

40+ }

41 game->sceen_timer++;

42 }

43 }

44@@ -131,8 +136,23 @@ void game_update(game_t *game) {

45 }

46

47 void game_draw(game_t *game) {

48- BeginDrawing();

49+ // render overlay

50+ RenderTexture2D overlay_texture = LoadRenderTexture(WINDOW_WIDTH, WINDOW_HEIGHT);

51+ BeginTextureMode(overlay_texture);

52 ClearBackground(BLACK);

53+ DrawRectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, BLACK);

54+ BeginBlendMode(BLEND_SUBTRACT_COLORS);

55+ int radius = WINDOW_WIDTH;

56+ radius -= radius / 80.0 * game->sceen_timer;

57+ if (radius < PLAYER_HEIGHT) {

58+ radius = PLAYER_HEIGHT;

59+ }

60+ DrawCircle(game->player->pos.x + PLAYER_WIDTH / 2.0, WINDOW_HEIGHT - (game->player->pos.y + PLAYER_HEIGHT / 2.0), radius, WHITE);

61+ EndBlendMode();

62+ EndTextureMode();

63+ // render sceen

64+ BeginDrawing();

65+ ClearBackground((Color) { 5, 5, 5, 1 });

66 if (game->level != LEVEL_NULL) {

67 BeginMode2D(game->camera);

68 for (int i = 0; i < game->tiles_len; i++) {

69@@ -141,10 +161,14 @@ void game_draw(game_t *game) {

70 for (int i = 0; i < game->entities_len; i++) {

71 entity_draw(&game->entities[i], game);

72 }

73- player_draw(game->player, game);

74+ if (game->sceen_timer < 100) {

75+ player_draw(game->player, game);

76+ }

77 for (int i = 0; i < game->effects_len; i++) {

78 effect_draw(game->effects[i], game);

79 }

80+ // draw overlay

81+ DrawTexture(overlay_texture.texture, 0, 0, WHITE);

82 EndMode2D();

83 // draw interface

84 int i = 0;

85@@ -172,14 +196,12 @@ void game_draw(game_t *game) {

86 .y = TILE_WIDTH / 1.5 + 25,

87 };

88 text_draw(level_pos, level_text, TEXT_ALIGNMENT_RIGHT, game);

89- if (game->defeat || game->victory) {

90- DrawRectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, (Color) { 0, 0, 0, 255 / 100 * game->sceen_timer });

91- }

92 }

93 if (game->state == STATE_MENU) {

94 menu_draw(game->menu, game);

95 }

96 EndDrawing();

97+ UnloadRenderTexture(overlay_texture);

98 }

99

100 void game_free(game_t *game) {

101@@ -192,5 +214,6 @@ void game_free(game_t *game) {

102 UnloadTexture(game->assets.font);

103 UnloadTexture(game->assets.images);

104 UnloadTexture(game->assets.background);

105+ UnloadSound(game->assets.track);

106 free(game);

107 }

108

109

diff --git a/src/main.c b/src/main.c

index 6f0d221..acc22a7 100644

--- a/src/main.c

+++ b/src/main.c

1@@ -25,6 +25,9 @@ void handle_segfault(int signal) {

2 game_t *game = NULL;

3

4 void do_update(void) {

5+ if (!IsSoundPlaying(game->assets.track)) {

6+ PlaySound(game->assets.track);

7+ }

8 game_update(game);

9 game_draw(game);

10 }

11@@ -34,7 +37,9 @@ int main(void) {

12 time_t t;

13 srand((unsigned) time(&t));

14 InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Freezo");

15+ InitAudioDevice();

16 game = game_create();

17+ SetSoundVolume(game->assets.track, 0.5);

18 SetTargetFPS(60);

19 SetExitKey(0);

20 #if defined(PLATFORM_WEB)

21@@ -49,6 +54,7 @@ int main(void) {

22 do_update();

23 }

24 #endif

25+ CloseAudioDevice();

26 CloseWindow();

27 game_free(game);

28 return 0;

29

30

diff --git a/src/player.c b/src/player.c

index d983ed4..352073f 100644

--- a/src/player.c

+++ b/src/player.c

1@@ -356,6 +356,7 @@ void player_update(player_t *player, game_t *game) {

2 player->pos.y + PLAYER_HEIGHT >= door->pos.y + tolerance

3 ) {

4 if (door_unlock(door, game)) {

5+ game->door = door;

6 game->victory = true;

7 }

8 }

9

10