diff options
| author | arngo <[email protected]> | 2023-05-30 23:31:01 -0400 |
|---|---|---|
| committer | arngo <[email protected]> | 2023-05-30 23:31:01 -0400 |
| commit | 8ff42715e5971f0257c70a639af0106b0199c7c6 (patch) | |
| tree | 800684fcc1ab26416622f308b35f724f57159677 | |
| parent | 5d1931537edb60b48538b714944eca7ce5db2739 (diff) | |
| download | TOJam2023-8ff42715e5971f0257c70a639af0106b0199c7c6.tar.gz TOJam2023-8ff42715e5971f0257c70a639af0106b0199c7c6.zip | |
implement menu system
| -rw-r--r-- | CMakeLists.txt | 1 | ||||
| -rw-r--r-- | assets/gameover.png | bin | 0 -> 44182 bytes | |||
| -rw-r--r-- | assets/mainmenu.png | bin | 0 -> 14967 bytes | |||
| -rw-r--r-- | assets/splash.png | bin | 0 -> 16709 bytes | |||
| -rw-r--r-- | src/bullet.c | 9 | ||||
| -rw-r--r-- | src/bullet.h | 3 | ||||
| -rw-r--r-- | src/enemies.c | 13 | ||||
| -rw-r--r-- | src/enemies.h | 3 | ||||
| -rw-r--r-- | src/init.c | 11 | ||||
| -rw-r--r-- | src/init.h | 3 | ||||
| -rw-r--r-- | src/input.c | 41 | ||||
| -rw-r--r-- | src/input.h | 11 | ||||
| -rw-r--r-- | src/main.c | 45 | ||||
| -rw-r--r-- | src/menu.c | 102 | ||||
| -rw-r--r-- | src/menu.h | 30 | ||||
| -rw-r--r-- | src/player.c | 34 | ||||
| -rw-r--r-- | src/player.h | 6 |
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 Binary files differnew file mode 100644 index 0000000..8a3483c --- /dev/null +++ b/assets/gameover.png diff --git a/assets/mainmenu.png b/assets/mainmenu.png Binary files differnew file mode 100644 index 0000000..2a9dde0 --- /dev/null +++ b/assets/mainmenu.png diff --git a/assets/splash.png b/assets/splash.png Binary files differnew file mode 100644 index 0000000..ba386ac --- /dev/null +++ b/assets/splash.png 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); @@ -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(); +} @@ -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); @@ -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); |
