Compare commits
No commits in common. "c8e297265f2b048c313ef46d903ebfef69e974f6" and "8fdf508054336a29283d54aa33984a884defdbd8" have entirely different histories.
c8e297265f
...
8fdf508054
|
@ -88,10 +88,12 @@ if (NOT EMSCRIPTEN)
|
||||||
if (BUILD_EXTRAS AND NOT RUN_PROFILER)
|
if (BUILD_EXTRAS AND NOT RUN_PROFILER)
|
||||||
add_target_exe(entManager_test)
|
add_target_exe(entManager_test)
|
||||||
add_target_exe(water_test)
|
add_target_exe(water_test)
|
||||||
|
add_target_exe(level_load_test)
|
||||||
add_target_exe(menu_test)
|
add_target_exe(menu_test)
|
||||||
add_target_exe(assets_test)
|
add_target_exe(assets_test)
|
||||||
add_target_exe(particle_test)
|
add_target_exe(particle_test)
|
||||||
add_target_exe(scene_man_test)
|
add_target_exe(scene_man_test)
|
||||||
|
add_target_exe(level_select_test)
|
||||||
endif()
|
endif()
|
||||||
if (BUILD_TESTING)
|
if (BUILD_TESTING)
|
||||||
find_package(cmocka 1.1.0 REQUIRED)
|
find_package(cmocka 1.1.0 REQUIRED)
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
void init_engine(GameEngine_t* engine, Vector2 starting_win_size)
|
void init_engine(GameEngine_t* engine, Vector2 starting_win_size)
|
||||||
{
|
{
|
||||||
InitAudioDevice();
|
InitAudioDevice();
|
||||||
sc_map_init_64(&engine->keybinds, 16, 0);
|
|
||||||
sc_queue_init(&engine->key_buffer);
|
sc_queue_init(&engine->key_buffer);
|
||||||
sc_queue_init(&engine->scene_stack);
|
sc_queue_init(&engine->scene_stack);
|
||||||
sc_heap_init(&engine->scenes_render_order, 0);
|
sc_heap_init(&engine->scenes_render_order, 0);
|
||||||
|
@ -26,27 +25,11 @@ void deinit_engine(GameEngine_t* engine)
|
||||||
sc_queue_term(&engine->key_buffer);
|
sc_queue_term(&engine->key_buffer);
|
||||||
sc_queue_term(&engine->scene_stack);
|
sc_queue_term(&engine->scene_stack);
|
||||||
sc_heap_term(&engine->scenes_render_order);
|
sc_heap_term(&engine->scenes_render_order);
|
||||||
sc_map_term_64(&engine->keybinds);
|
|
||||||
UnloadRenderTexture(engine->base_canvas);
|
UnloadRenderTexture(engine->base_canvas);
|
||||||
CloseAudioDevice();
|
CloseAudioDevice();
|
||||||
CloseWindow();
|
CloseWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
void register_keybind(GameEngine_t* engine, int key, ActionType_t action)
|
|
||||||
{
|
|
||||||
sc_map_put_64(&engine->keybinds, action, key);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_keybind_or_default(GameEngine_t* engine, ActionType_t action, int default_key)
|
|
||||||
{
|
|
||||||
int key = sc_map_get_64(&engine->keybinds, action);
|
|
||||||
if (!sc_map_found(&engine->keybinds))
|
|
||||||
{
|
|
||||||
key = default_key;
|
|
||||||
};
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
void process_inputs(GameEngine_t* engine, Scene_t* scene)
|
void process_inputs(GameEngine_t* engine, Scene_t* scene)
|
||||||
{
|
{
|
||||||
Vector2 raw_mouse_pos = GetMousePosition();
|
Vector2 raw_mouse_pos = GetMousePosition();
|
||||||
|
|
|
@ -31,7 +31,6 @@ typedef struct GameEngine {
|
||||||
SFXList_t sfx_list;
|
SFXList_t sfx_list;
|
||||||
// Maintain own queue to handle key presses
|
// Maintain own queue to handle key presses
|
||||||
Scene_t* focused_scene; // The one scene to receive key inputs
|
Scene_t* focused_scene; // The one scene to receive key inputs
|
||||||
struct sc_map_64 keybinds; // Global action -> key mapping
|
|
||||||
struct sc_queue_32 key_buffer;
|
struct sc_queue_32 key_buffer;
|
||||||
struct sc_queue_ptr scene_stack;
|
struct sc_queue_ptr scene_stack;
|
||||||
struct sc_heap scenes_render_order;
|
struct sc_heap scenes_render_order;
|
||||||
|
@ -86,11 +85,6 @@ void init_engine(GameEngine_t* engine, Vector2 starting_win_size);
|
||||||
void deinit_engine(GameEngine_t* engine);
|
void deinit_engine(GameEngine_t* engine);
|
||||||
void process_inputs(GameEngine_t* engine, Scene_t* scene);
|
void process_inputs(GameEngine_t* engine, Scene_t* scene);
|
||||||
|
|
||||||
// Register a key bind. If already exists, will override.
|
|
||||||
// Does not support multi key to an action
|
|
||||||
void register_keybind(GameEngine_t* engine, int key, ActionType_t action);
|
|
||||||
int get_keybind_or_default(GameEngine_t* engine, ActionType_t action, int default_key);
|
|
||||||
|
|
||||||
void process_active_scene_inputs(GameEngine_t* engine);
|
void process_active_scene_inputs(GameEngine_t* engine);
|
||||||
void update_curr_scene(GameEngine_t* engine);
|
void update_curr_scene(GameEngine_t* engine);
|
||||||
void render_curr_scene(GameEngine_t* engine);
|
void render_curr_scene(GameEngine_t* engine);
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
#include "constants.h"
|
||||||
|
#include "scene_impl.h"
|
||||||
|
#include "ent_impl.h"
|
||||||
|
#include "water_flow.h"
|
||||||
|
#include "game_systems.h"
|
||||||
|
#include "assets_loader.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
Scene_t* scenes[1];
|
||||||
|
static GameEngine_t engine =
|
||||||
|
{
|
||||||
|
.scenes = scenes,
|
||||||
|
.max_scenes = 1,
|
||||||
|
.curr_scene = 0,
|
||||||
|
.assets = {0}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
init_engine(&engine, (Vector2){1280,640});
|
||||||
|
SetTargetFPS(60);
|
||||||
|
|
||||||
|
load_from_infofile("res/test_assets.info", &engine.assets);
|
||||||
|
LevelPack_t* pack = get_level_pack(&engine.assets, "TestLevels");
|
||||||
|
assert(pack != NULL);
|
||||||
|
|
||||||
|
LevelScene_t scene;
|
||||||
|
scene.scene.engine = &engine;
|
||||||
|
scene.data.level_pack = pack;
|
||||||
|
scene.data.current_level = 0;
|
||||||
|
|
||||||
|
init_game_scene(&scene);
|
||||||
|
assert(load_level_tilemap(&scene, 0) == true);
|
||||||
|
|
||||||
|
scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp");
|
||||||
|
scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr");
|
||||||
|
scenes[0] = &scene.scene;
|
||||||
|
change_scene(&engine, 0);
|
||||||
|
|
||||||
|
const float DT = 1.0f/60.0f;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
float frame_time = GetFrameTime();
|
||||||
|
float delta_time = fminf(frame_time, DT);
|
||||||
|
|
||||||
|
process_inputs(&engine, &scene.scene);
|
||||||
|
update_scene(&scene.scene, delta_time);
|
||||||
|
update_entity_manager(&scene.scene.ent_manager);
|
||||||
|
// This is needed to advance time delta
|
||||||
|
render_scene(&scene.scene);
|
||||||
|
if (WindowShouldClose()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int m_id;
|
||||||
|
Entity_t* ent;
|
||||||
|
sc_map_foreach(&scene.scene.ent_manager.entities_map[DYNMEM_ENT_TAG], m_id, ent)
|
||||||
|
{
|
||||||
|
free_water_runner(ent, &scene.scene.ent_manager);
|
||||||
|
}
|
||||||
|
free_scene(&scene.scene);
|
||||||
|
term_level_scene_data(&scene.data);
|
||||||
|
deinit_engine(&engine);
|
||||||
|
}
|
|
@ -0,0 +1,80 @@
|
||||||
|
#include "mempool.h"
|
||||||
|
#include "scene_impl.h"
|
||||||
|
#include "gui.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
// Maintain own queue to handle key presses
|
||||||
|
struct sc_queue_32 key_buffer;
|
||||||
|
|
||||||
|
const float DT = 1.0f/60.0f;
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
sc_queue_init(&key_buffer);
|
||||||
|
InitWindow(1280, 640, "raylib");
|
||||||
|
SetTargetFPS(60);
|
||||||
|
init_memory_pools();
|
||||||
|
init_UI();
|
||||||
|
LevelSelectScene_t scene;
|
||||||
|
init_level_select_scene(&scene);
|
||||||
|
scene.scene.bg_colour = RAYWHITE;
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
|
||||||
|
Vector2 raw_mouse_pos = GetMousePosition();
|
||||||
|
scene.scene.mouse_pos = raw_mouse_pos;
|
||||||
|
// This entire key processing relies on the assumption that a pressed key will
|
||||||
|
// appear in the polling of raylib
|
||||||
|
|
||||||
|
unsigned int sz = sc_queue_size(&key_buffer);
|
||||||
|
// Process any existing pressed key
|
||||||
|
for (size_t i = 0; i < sz; i++)
|
||||||
|
{
|
||||||
|
int button = sc_queue_del_first(&key_buffer);
|
||||||
|
ActionType_t action = sc_map_get_64(&scene.scene.action_map, button);
|
||||||
|
if (IsKeyReleased(button))
|
||||||
|
{
|
||||||
|
do_action(&scene.scene, action, false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
do_action(&scene.scene, action, true);
|
||||||
|
sc_queue_add_last(&key_buffer, button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Detect new key presses
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
int button = GetKeyPressed();
|
||||||
|
if (button == 0) break;
|
||||||
|
ActionType_t action = sc_map_get_64(&scene.scene.action_map, button);
|
||||||
|
if (!sc_map_found(&scene.scene.action_map)) continue;
|
||||||
|
do_action(&scene.scene, action, true);
|
||||||
|
sc_queue_add_last(&key_buffer, button);
|
||||||
|
}
|
||||||
|
ActionType_t action = sc_map_get_64(&scene.scene.action_map, MOUSE_BUTTON_LEFT);
|
||||||
|
if (sc_map_found(&scene.scene.action_map))
|
||||||
|
{
|
||||||
|
if (IsMouseButtonDown(MOUSE_BUTTON_LEFT))
|
||||||
|
{
|
||||||
|
do_action(&scene.scene, action, true);
|
||||||
|
}
|
||||||
|
else if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT))
|
||||||
|
{
|
||||||
|
do_action(&scene.scene, action, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
float frame_time = GetFrameTime();
|
||||||
|
float delta_time = fminf(frame_time, DT);
|
||||||
|
update_scene(&scene.scene, delta_time);
|
||||||
|
// This is needed to advance time delta
|
||||||
|
render_scene(&scene.scene);
|
||||||
|
if (WindowShouldClose()) break;
|
||||||
|
}
|
||||||
|
free_level_select_scene(&scene);
|
||||||
|
sc_queue_term(&key_buffer);
|
||||||
|
CloseWindow();
|
||||||
|
}
|
|
@ -57,10 +57,6 @@ int main(int argc, char** argv)
|
||||||
LevelScene_t level_scene;
|
LevelScene_t level_scene;
|
||||||
level_scene.scene.engine = &engine;
|
level_scene.scene.engine = &engine;
|
||||||
init_game_scene(&level_scene);
|
init_game_scene(&level_scene);
|
||||||
|
|
||||||
sc_map_put_64(&level_scene.scene.action_map, KEY_RIGHT_BRACKET, ACTION_NEXTLEVEL);
|
|
||||||
sc_map_put_64(&level_scene.scene.action_map, KEY_LEFT_BRACKET, ACTION_PREVLEVEL);
|
|
||||||
|
|
||||||
level_scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp");
|
level_scene.data.tile_sprites[ONEWAY_TILE] = get_sprite(&engine.assets, "tl_owp");
|
||||||
level_scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr");
|
level_scene.data.tile_sprites[LADDER] = get_sprite(&engine.assets, "tl_ldr");
|
||||||
level_scene.data.tile_sprites[SPIKES] = get_sprite(&engine.assets, "d_spikes");
|
level_scene.data.tile_sprites[SPIKES] = get_sprite(&engine.assets, "d_spikes");
|
||||||
|
|
7
main.c
7
main.c
|
@ -37,13 +37,6 @@ int main(void)
|
||||||
init_player_creation_rres("res/assets.rres", "player_spr.info", &engine.assets);
|
init_player_creation_rres("res/assets.rres", "player_spr.info", &engine.assets);
|
||||||
#endif
|
#endif
|
||||||
init_item_creation(&engine.assets);
|
init_item_creation(&engine.assets);
|
||||||
register_keybind(&engine, KEY_UP, ACTION_UP);
|
|
||||||
register_keybind(&engine, KEY_DOWN, ACTION_DOWN);
|
|
||||||
register_keybind(&engine, KEY_LEFT, ACTION_LEFT);
|
|
||||||
register_keybind(&engine, KEY_RIGHT, ACTION_RIGHT);
|
|
||||||
register_keybind(&engine, KEY_SPACE, ACTION_JUMP);
|
|
||||||
register_keybind(&engine, KEY_Q, ACTION_EXIT);
|
|
||||||
register_keybind(&engine, KEY_Z, ACTION_LOOKAHEAD);
|
|
||||||
|
|
||||||
load_sfx(&engine, "snd_jump", PLAYER_JMP_SFX);
|
load_sfx(&engine, "snd_jump", PLAYER_JMP_SFX);
|
||||||
load_sfx(&engine, "snd_land", PLAYER_LAND_SFX);
|
load_sfx(&engine, "snd_land", PLAYER_LAND_SFX);
|
||||||
|
|
|
@ -600,15 +600,17 @@ void init_game_scene(LevelScene_t* scene)
|
||||||
// This avoid graphical glitch, not essential
|
// This avoid graphical glitch, not essential
|
||||||
//sc_array_add(&scene->scene.systems, &update_tilemap_system);
|
//sc_array_add(&scene->scene.systems, &update_tilemap_system);
|
||||||
|
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_UP, KEY_UP), ACTION_UP);
|
sc_map_put_64(&scene->scene.action_map, KEY_UP, ACTION_UP);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_DOWN, KEY_DOWN), ACTION_DOWN);
|
sc_map_put_64(&scene->scene.action_map, KEY_DOWN, ACTION_DOWN);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_LEFT, KEY_LEFT), ACTION_LEFT);
|
sc_map_put_64(&scene->scene.action_map, KEY_LEFT, ACTION_LEFT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_RIGHT, KEY_RIGHT), ACTION_RIGHT);
|
sc_map_put_64(&scene->scene.action_map, KEY_RIGHT, ACTION_RIGHT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_JUMP, KEY_ENTER), ACTION_JUMP);
|
sc_map_put_64(&scene->scene.action_map, KEY_SPACE, ACTION_JUMP);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_EXIT, KEY_Q), ACTION_EXIT);
|
sc_map_put_64(&scene->scene.action_map, KEY_Q, ACTION_EXIT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_LOOKAHEAD, KEY_Z), ACTION_LOOKAHEAD);
|
|
||||||
|
|
||||||
sc_map_put_64(&scene->scene.action_map, KEY_R, ACTION_RESTART);
|
sc_map_put_64(&scene->scene.action_map, KEY_R, ACTION_RESTART);
|
||||||
|
sc_map_put_64(&scene->scene.action_map, KEY_RIGHT_BRACKET, ACTION_NEXTLEVEL);
|
||||||
|
sc_map_put_64(&scene->scene.action_map, KEY_LEFT_BRACKET, ACTION_PREVLEVEL);
|
||||||
|
sc_map_put_64(&scene->scene.action_map, KEY_Z, ACTION_LOOKAHEAD);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_game_scene(LevelScene_t* scene)
|
void free_game_scene(LevelScene_t* scene)
|
||||||
|
|
|
@ -297,14 +297,11 @@ void init_level_select_scene(LevelSelectScene_t* scene)
|
||||||
|
|
||||||
sc_array_add(&scene->scene.systems, &level_preview_render_func);
|
sc_array_add(&scene->scene.systems, &level_preview_render_func);
|
||||||
sc_array_add(&scene->scene.systems, &level_select_render_func);
|
sc_array_add(&scene->scene.systems, &level_select_render_func);
|
||||||
|
sc_map_put_64(&scene->scene.action_map, KEY_UP, ACTION_UP);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_UP, KEY_UP), ACTION_UP);
|
sc_map_put_64(&scene->scene.action_map, KEY_DOWN, ACTION_DOWN);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_DOWN, KEY_DOWN), ACTION_DOWN);
|
sc_map_put_64(&scene->scene.action_map, KEY_Q, ACTION_EXIT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_JUMP, KEY_ENTER), ACTION_CONFIRM);
|
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_EXIT, KEY_Q), ACTION_EXIT);
|
|
||||||
|
|
||||||
sc_map_put_64(&scene->scene.action_map, KEY_BACKSPACE, ACTION_EXIT);
|
|
||||||
sc_map_put_64(&scene->scene.action_map, KEY_ENTER, ACTION_CONFIRM);
|
sc_map_put_64(&scene->scene.action_map, KEY_ENTER, ACTION_CONFIRM);
|
||||||
|
sc_map_put_64(&scene->scene.action_map, MOUSE_LEFT_BUTTON, ACTION_NEXT_SPAWN); // Abuse an unused action
|
||||||
}
|
}
|
||||||
void free_level_select_scene(LevelSelectScene_t* scene)
|
void free_level_select_scene(LevelSelectScene_t* scene)
|
||||||
{
|
{
|
||||||
|
|
|
@ -202,13 +202,10 @@ void init_menu_scene(MenuScene_t* scene)
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
sc_map_put_64(&scene->scene.action_map, KEY_UP, ACTION_UP);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_UP, KEY_UP), ACTION_UP);
|
sc_map_put_64(&scene->scene.action_map, KEY_DOWN, ACTION_DOWN);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_DOWN, KEY_DOWN), ACTION_DOWN);
|
sc_map_put_64(&scene->scene.action_map, KEY_LEFT, ACTION_LEFT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_LEFT, KEY_LEFT), ACTION_LEFT);
|
sc_map_put_64(&scene->scene.action_map, KEY_RIGHT, ACTION_RIGHT);
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_RIGHT, KEY_RIGHT), ACTION_RIGHT);
|
|
||||||
sc_map_put_64(&scene->scene.action_map, get_keybind_or_default(scene->scene.engine, ACTION_JUMP, KEY_ENTER), ACTION_CONFIRM);
|
|
||||||
// Guarantee a enter key for selection
|
|
||||||
sc_map_put_64(&scene->scene.action_map, KEY_ENTER, ACTION_CONFIRM);
|
sc_map_put_64(&scene->scene.action_map, KEY_ENTER, ACTION_CONFIRM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue