A retro platform game
git clone git://soophie.de/freezo
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 1509
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
};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
};26
game_t *game_create(void);
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
// defeat19
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
// victory28
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
}47
void game_draw(game_t *game) {48
- BeginDrawing();49
+ // render overlay50
+ 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 sceen64
+ 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 overlay81
+ DrawTexture(overlay_texture.texture, 0, 0, WHITE);82
EndMode2D();83
// draw interface84
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
}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
}
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;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
#endif25
+ CloseAudioDevice();26
CloseWindow();27
game_free(game);28
return 0;
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 + tolerance3
) {4
if (door_unlock(door, game)) {5
+ game->door = door;6
game->victory = true;7
}8
}