summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorarngo <[email protected]>2023-05-30 23:31:01 -0400
committerarngo <[email protected]>2023-05-30 23:31:01 -0400
commit8ff42715e5971f0257c70a639af0106b0199c7c6 (patch)
tree800684fcc1ab26416622f308b35f724f57159677
parent5d1931537edb60b48538b714944eca7ce5db2739 (diff)
downloadrodeo_sample_game-8ff42715e5971f0257c70a639af0106b0199c7c6.tar.gz
rodeo_sample_game-8ff42715e5971f0257c70a639af0106b0199c7c6.zip
implement menu system
-rw-r--r--CMakeLists.txt1
-rw-r--r--assets/gameover.pngbin0 -> 44182 bytes
-rw-r--r--assets/mainmenu.pngbin0 -> 14967 bytes
-rw-r--r--assets/splash.pngbin0 -> 16709 bytes
-rw-r--r--src/bullet.c9
-rw-r--r--src/bullet.h3
-rw-r--r--src/enemies.c13
-rw-r--r--src/enemies.h3
-rw-r--r--src/init.c11
-rw-r--r--src/init.h3
-rw-r--r--src/input.c41
-rw-r--r--src/input.h11
-rw-r--r--src/main.c45
-rw-r--r--src/menu.c102
-rw-r--r--src/menu.h30
-rw-r--r--src/player.c34
-rw-r--r--src/player.h6
17 files changed, 281 insertions, 31 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 578f80e..a6fb109 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -14,6 +14,7 @@ add_executable(${PROJECT_NAME}
"src/wall.c"
"src/debug.c"
"src/init.c"
+ "src/menu.c"
)
set_property(TARGET ${PROJECT_NAME} PROPERTY C_STANDARD 99)
diff --git a/assets/gameover.png b/assets/gameover.png
new file mode 100644
index 0000000..8a3483c
--- /dev/null
+++ b/assets/gameover.png
Binary files differ
diff --git a/assets/mainmenu.png b/assets/mainmenu.png
new file mode 100644
index 0000000..2a9dde0
--- /dev/null
+++ b/assets/mainmenu.png
Binary files differ
diff --git a/assets/splash.png b/assets/splash.png
new file mode 100644
index 0000000..ba386ac
--- /dev/null
+++ b/assets/splash.png
Binary files differ
diff --git a/src/bullet.c b/src/bullet.c
index 64b4a9c..5bdd8f2 100644
--- a/src/bullet.c
+++ b/src/bullet.c
@@ -29,6 +29,15 @@ deinit_bullets(void)
cvec_bullet_t_drop(&bullets);
}
+void
+reset_bullets(void)
+{
+ c_foreach_rv(i, cvec_bullet_t, bullets)
+ {
+ bullet_destroy(i.ref);
+ }
+}
+
bullet_t *
spawn_bullet(
float x,
diff --git a/src/bullet.h b/src/bullet.h
index 7bb8d6c..027dd0c 100644
--- a/src/bullet.h
+++ b/src/bullet.h
@@ -27,6 +27,9 @@ deinit_bullets(void);
deinit_bullets() \
)
+void
+reset_bullets(void);
+
bullet_t *
spawn_bullet(
float x,
diff --git a/src/enemies.c b/src/enemies.c
index 10378da..da89ea0 100644
--- a/src/enemies.c
+++ b/src/enemies.c
@@ -41,6 +41,19 @@ deinit_enemies(void)
rodeo_texture_2d_destroy(&enemy_texture);
}
+void
+reset_enemies(void)
+{
+ c_foreach_rv(i, cvec_enemy_t, enemies)
+ {
+ enemy_destroy(i.ref);
+ }
+ c_foreach_rv(i, cvec_enemy_t, ghosts)
+ {
+ enemy_destroy(i.ref);
+ }
+}
+
uint32_t
get_enemy_count(void)
{
diff --git a/src/enemies.h b/src/enemies.h
index a67cc13..4e7a5ef 100644
--- a/src/enemies.h
+++ b/src/enemies.h
@@ -55,6 +55,9 @@ deinit_enemies(void);
deinit_enemies() \
)
+void
+reset_enemies(void);
+
uint32_t
get_enemy_count(void);
diff --git a/src/init.c b/src/init.c
index f168a33..5bf50f6 100644
--- a/src/init.c
+++ b/src/init.c
@@ -3,10 +3,12 @@
#include "player.h"
#include "enemies.h"
#include "wall.h"
+#include "menu.h"
void
init_game_systems(void)
{
+ init_menu();
init_bullets();
init_player();
init_enemies();
@@ -16,8 +18,17 @@ init_game_systems(void)
void
deinit_game_systems(void)
{
+ deinit_menu();
deinit_bullets();
deinit_player();
deinit_enemies();
deinit_wall();
}
+
+void
+reset_game_systems(void)
+{
+ reset_bullets();
+ reset_player();
+ reset_enemies();
+}
diff --git a/src/init.h b/src/init.h
index bcc53d6..39560b7 100644
--- a/src/init.h
+++ b/src/init.h
@@ -11,3 +11,6 @@ deinit_game_systems(void);
init_game_systems(), \
deinit_game_systems() \
)
+
+void
+reset_game_systems(void);
diff --git a/src/input.c b/src/input.c
index ba355fa..19bd004 100644
--- a/src/input.c
+++ b/src/input.c
@@ -238,6 +238,25 @@ play_sound_input3(rodeo_input_any_state_t *input_state, void *data)
return &down;
}
+void*
+menu_accept_input(rodeo_input_any_state_t *input_state, void *data)
+{
+ static bool down = false;
+
+ if(NULL != input_state)
+ {
+ down = input_state->data.binary_state;
+ }
+
+ return &down;
+}
+
+scenes_and_commands_t *
+get_command_inputs(void)
+{
+ return &inputs;
+}
+
#ifdef __clang__
#pragma clang diagnostic pop
#endif
@@ -250,9 +269,10 @@ register_inputs(void)
{
// make scene
inputs.scene = rodeo_input_scene_create();
+ inputs.menu_scene = rodeo_input_scene_create();
// - make commands -
- inputs.create = rodeo_input_command_create(rodeo_input_type_Binary);
+ inputs.menu_accept = rodeo_input_command_create(rodeo_input_type_Binary);
inputs.up = rodeo_input_command_create(
rodeo_input_type_Binary | rodeo_input_type_UnboundedRange | rodeo_input_type_BoundedRange
@@ -279,9 +299,9 @@ register_inputs(void)
// --
// - register inputs -
- rodeo_input_command_register_binary_scancode(inputs.create, rodeo_input_binary_scancode_SPACE);
- rodeo_input_command_register_binary_controllerButton(inputs.create, rodeo_input_binary_controllerButton_A);
- rodeo_input_command_register_binary_mouseButton(inputs.create, rodeo_input_binary_mouseButton_LEFT);
+ rodeo_input_command_register_binary_scancode(inputs.menu_accept, rodeo_input_binary_scancode_SPACE);
+ rodeo_input_command_register_binary_controllerButton(inputs.menu_accept, rodeo_input_binary_controllerButton_A);
+ rodeo_input_command_register_binary_mouseButton(inputs.menu_accept, rodeo_input_binary_mouseButton_LEFT);
rodeo_input_command_register_binary_scancode(inputs.up, rodeo_input_binary_scancode_W);
rodeo_input_command_register_binary_scancode(inputs.down, rodeo_input_binary_scancode_S);
@@ -302,7 +322,7 @@ register_inputs(void)
// --
// - register callbacks -
- rodeo_input_command_register_callback(inputs.create, *summon_units_input);
+ //rodeo_input_command_register_callback(inputs.create, *summon_units_input);
rodeo_input_command_register_callback(inputs.up, *units_move_up_input);
rodeo_input_command_register_callback(inputs.down, *units_move_down_input);
rodeo_input_command_register_callback(inputs.left, *units_move_left_input);
@@ -311,10 +331,12 @@ register_inputs(void)
rodeo_input_command_register_callback(inputs.play_sound, *play_sound_input);
rodeo_input_command_register_callback(inputs.play_sound2, *play_sound_input2);
rodeo_input_command_register_callback(inputs.play_sound3, *play_sound_input3);
+
+ rodeo_input_command_register_callback(inputs.menu_accept, *menu_accept_input);
// --
// - register commands -
- rodeo_input_scene_register_command(inputs.scene, inputs.create);
+ //rodeo_input_scene_register_command(inputs.scene, inputs.create);
rodeo_input_scene_register_command(inputs.scene, inputs.up);
rodeo_input_scene_register_command(inputs.scene, inputs.down);
rodeo_input_scene_register_command(inputs.scene, inputs.left);
@@ -323,6 +345,8 @@ register_inputs(void)
rodeo_input_scene_register_command(inputs.scene, inputs.play_sound);
rodeo_input_scene_register_command(inputs.scene, inputs.play_sound2);
rodeo_input_scene_register_command(inputs.scene, inputs.play_sound3);
+
+ rodeo_input_scene_register_command(inputs.menu_scene, inputs.menu_accept);
// --
// activate scene
@@ -332,7 +356,8 @@ register_inputs(void)
void
unregister_inputs(void)
{
- rodeo_input_scene_unregister_command(inputs.scene, inputs.create);
- rodeo_input_command_destroy(inputs.create);
+ //rodeo_input_scene_unregister_command(inputs.scene, inputs.create);
+ //rodeo_input_command_destroy(inputs.create);
rodeo_input_scene_destroy(inputs.scene);
+ rodeo_input_scene_destroy(inputs.menu_scene);
}
diff --git a/src/input.h b/src/input.h
index c73e59a..4624d88 100644
--- a/src/input.h
+++ b/src/input.h
@@ -5,6 +5,8 @@ typedef
struct
{
rodeo_input_scene_t *scene;
+ rodeo_input_scene_t *menu_scene;
+ rodeo_input_command_t *menu_accept;
rodeo_input_command_t *create;
rodeo_input_command_t *left;
rodeo_input_command_t *right;
@@ -72,6 +74,15 @@ play_sound_input3(
void *data
);
+void*
+menu_accept_input(
+ rodeo_input_any_state_t *input_state,
+ void *data
+);
+
+scenes_and_commands_t *
+get_command_inputs(void);
+
void
register_inputs(void);
diff --git a/src/main.c b/src/main.c
index ba2c6b7..6dda3dc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,6 +8,7 @@
#include "wall.h"
#include "debug.h"
#include "init.h"
+#include "menu.h"
const uint16_t window_width = 1600;
const uint16_t window_height = 900;
@@ -27,15 +28,26 @@ main_loop(void)
mrodeo_frame_do()
{
- // retrieve and apply player input
- parse_player_input();
+ if (get_player_hp() > 0 && get_menu_state() == menu_state_inactive)
+ {
+ // retrieve and apply player input
+ parse_player_input();
- player_shoot(get_player_bullet_world());
- enemies_attempt_weapon_fire();
+ player_shoot(get_player_bullet_world());
+ enemies_attempt_weapon_fire();
+
+ // spawn enemies
+ attempt_random_enemy_spawn((rodeo_rectangle_t){ 0, 0, window_width, window_height });
+ }
+ else
+ {
+ parse_menu_input();
+ if (get_player_hp() <= 0)
+ {
+ set_menu_state(menu_state_gameover);
+ }
+ }
- // spawn enemies
- attempt_random_enemy_spawn((rodeo_rectangle_t){ 0, 0, window_width, window_height });
-
// run enemy movement ai
group_follow_target(get_player_position());
@@ -51,15 +63,22 @@ main_loop(void)
move_player();
draw_level();
- draw_bullets();
- draw_player();
- draw_enemies();
- draw_hp_bar();
+ if (get_menu_state() == menu_state_inactive || get_menu_state() == menu_state_gameover)
+ {
+ draw_bullets();
+ if (get_menu_state() != menu_state_gameover)
+ {
+ draw_player();
+ }
+ draw_enemies();
+ draw_hp_bar();
+ }
+ draw_menu();
- draw_debug_text(
+ /*draw_debug_text(
renderer_name,
fps_display
- );
+ );*/
}
}
diff --git a/src/menu.c b/src/menu.c
new file mode 100644
index 0000000..35f92b2
--- /dev/null
+++ b/src/menu.c
@@ -0,0 +1,102 @@
+#include "input.h"
+#include "init.h"
+#include "menu.h"
+#include "player.h"
+#include "rodeo.h"
+
+rodeo_texture_2d_t splash_texture;
+rodeo_texture_2d_t main_menu_texture;
+rodeo_texture_2d_t gameover_texture;
+menu_state_t menu_state;
+float splash_timer;
+rodeo_rectangle_t screen_dimensions = (rodeo_rectangle_t){.x = 0, .y = 0, .width = 1600, .height = 900};
+
+void
+init_menu(void)
+{
+ splash_texture = rodeo_texture_2d_create_from_path(cstr_lit("assets/splash.png"));
+ main_menu_texture = rodeo_texture_2d_create_from_path(cstr_lit("assets/mainmenu.png"));
+ gameover_texture = rodeo_texture_2d_create_from_path(cstr_lit("assets/gameover.png"));
+
+ menu_state = menu_state_splash;
+ splash_timer = 3000.0f;
+ rodeo_input_scene_activate(get_command_inputs()->menu_scene);
+}
+
+void
+deinit_menu(void)
+{
+ rodeo_texture_2d_destroy(&splash_texture);
+ rodeo_texture_2d_destroy(&main_menu_texture);
+ rodeo_texture_2d_destroy(&gameover_texture);
+}
+
+void
+draw_menu(void)
+{
+ if (splash_timer > 0 && menu_state == menu_state_splash)
+ {
+ splash_timer -= rodeo_frame_time_get();
+ rodeo_texture_2d_draw(
+ &screen_dimensions,
+ &screen_dimensions,
+ NULL,
+ &splash_texture
+ );
+ if (splash_timer <= 0) {
+ menu_state = menu_state_main;
+ }
+ }
+ else if (menu_state == menu_state_main)
+ {
+ rodeo_texture_2d_draw(
+ &screen_dimensions,
+ &screen_dimensions,
+ NULL,
+ &main_menu_texture
+ );
+ }
+ else if (menu_state == menu_state_gameover)
+ {
+ rodeo_texture_2d_draw(
+ &screen_dimensions,
+ &screen_dimensions,
+ NULL,
+ &gameover_texture
+ );
+ }
+}
+
+void
+parse_menu_input(void)
+{
+ int32_t hp = get_player_hp();
+ bool input = *(bool*)menu_accept_input(NULL, NULL);
+
+ if (input)
+ {
+ rodeo_input_scene_activate(get_command_inputs()->scene);
+ if (menu_state == menu_state_gameover && hp <= 0)
+ {
+ reset_game_systems();
+ menu_state = menu_state_inactive;
+ }
+ else if (menu_state == menu_state_main)
+ {
+ init_game_systems();
+ menu_state = menu_state_inactive;
+ }
+ }
+}
+
+menu_state_t
+get_menu_state(void)
+{
+ return menu_state;
+}
+
+void
+set_menu_state(menu_state_t state)
+{
+ menu_state = state;
+}
diff --git a/src/menu.h b/src/menu.h
new file mode 100644
index 0000000..a37a4c8
--- /dev/null
+++ b/src/menu.h
@@ -0,0 +1,30 @@
+#pragma once
+#include "rodeo.h"
+
+typedef
+enum
+{
+ menu_state_splash,
+ menu_state_main,
+ menu_state_inactive,
+ menu_state_gameover
+}
+menu_state_t;
+
+void
+init_menu(void);
+
+void
+deinit_menu(void);
+
+void
+draw_menu(void);
+
+void
+parse_menu_input(void);
+
+menu_state_t
+get_menu_state(void);
+
+void
+set_menu_state(menu_state_t);
diff --git a/src/player.c b/src/player.c
index 56fdb98..681d6b0 100644
--- a/src/player.c
+++ b/src/player.c
@@ -39,7 +39,7 @@ static rodeo_audio_sound_t *bubbles_sound;
// 61 standing
// 20-60 mid iar
-static rodeo_collision_2d_world_t player_collision_world;
+static rodeo_collision_2d_world_t player_collision_world = {0};
static aim_position_t aim_position;
static float orc_size[] = {13.0f * 2.0f, 19.0f * 2.0f};
@@ -53,18 +53,16 @@ init_player(void)
player.aim_texture = rodeo_texture_2d_create_from_path(cstr_lit("assets/aim.png"));
player.heart_texture = rodeo_texture_2d_create_from_path(cstr_lit("assets/heart.png"));
player.sprite.config.texture = &player.texture;
- player_collision_world = rodeo_collision_2d_world_create();
+ //player_collision_world = rodeo_collision_2d_world_create();
+ //player_collision_world = (rodeo_collision_2d_world_t){0};
player.collision_id = rodeo_collision_2d_world_item_create(
&player_collision_world,
(rodeo_collision_2d_world_item_t){
- .x = 1600/2,
- .y = 900/2,
.width = orc_size[0],
.height = orc_size[1]
}
)->id;
player.sprite = (sprite_t){
- .iter = 60,
.config = {
.texture = &player.texture,
.width = 128,
@@ -72,12 +70,9 @@ init_player(void)
.count = 61
}
};
- player.hp = 100;
- player.weapon.cooldown = 0;
+ reset_player();
player.weapon.firerate = 0.1f;
player.weapon.spread = 0.425f;
- aim_position.x = 101;
- aim_position.y = 100;
player.damage_cooldown_rate = 1000.0f;
}
@@ -86,10 +81,26 @@ deinit_player(void)
{
rodeo_texture_2d_destroy(&player.texture);
rodeo_collision_2d_world_destroy(&player_collision_world);
+ //player_collision_world = (rodeo_collision_2d_world_t){0};
rodeo_audio_sound_destroy(bubbles_sound);
}
void
+reset_player(void)
+{
+ player.sprite.iter = 60;
+ player.hp = 100;
+ aim_position.x = 101;
+ aim_position.y = 100;
+ cvec_collision_2d_world_item_value *player_position = get_player_position();
+ player_position->dx = 0;
+ player_position->dy = 0;
+ player_position->x = 200;
+ player_position->y = 200;
+ player.weapon.cooldown = 0;
+}
+
+void
draw_player(void)
{
float transparency = 1.0f;
@@ -361,3 +372,8 @@ draw_aim(float player_x, float player_y, float scale)
);
}
+int32_t
+get_player_hp(void)
+{
+ return player.hp;
+}
diff --git a/src/player.h b/src/player.h
index 6603554..a69b25f 100644
--- a/src/player.h
+++ b/src/player.h
@@ -35,6 +35,9 @@ deinit_player(void);
)
void
+reset_player(void);
+
+void
draw_player(void);
void
@@ -64,4 +67,5 @@ update_aim_position(void);
void
draw_aim(float player_x, float player_y, float scale);
-
+int32_t
+get_player_hp(void);