diff --git a/mario/global_vars.cpp b/mario/global_vars.cpp index 815bd04..1e5c235 100644 --- a/mario/global_vars.cpp +++ b/mario/global_vars.cpp @@ -11,3 +11,4 @@ std::shared_ptr g_translucent_enemies_texture; std::shared_ptr g_playground{}; std::shared_ptr g_text_config{}; bool g_quit = false; +bool g_death = false; diff --git a/mario/global_vars.hpp b/mario/global_vars.hpp index ba83672..e555b08 100644 --- a/mario/global_vars.hpp +++ b/mario/global_vars.hpp @@ -13,5 +13,6 @@ extern std::shared_ptr g_translucent_enemies_texture; extern std::shared_ptr g_playground; extern std::shared_ptr g_text_config; extern bool g_quit; +extern bool g_death; #endif diff --git a/mario/main.cpp b/mario/main.cpp index c56686f..7ad2877 100644 --- a/mario/main.cpp +++ b/mario/main.cpp @@ -24,6 +24,7 @@ #include "scenes/game_scenes.hpp" bool update = false; +int update_count = 0; bool newLoaded = false; std::shared_ptr mario = nullptr; std::shared_ptr leftStop = nullptr; @@ -32,6 +33,7 @@ std::shared_ptr fps = nullptr; std::shared_ptr coins = nullptr; int coin_count = 0; int global_frames = 0; +std::string last_load_level = ""; std::vector> moving_objects = {}; std::vector game_scenes{}; @@ -71,7 +73,7 @@ void handleKeyUp(SDL_Keycode key) { case SDLK_ESCAPE: { std::lock_guard lock(render_mutex); - game_scenes.push_back(createGameMainMenuScene(renderer)); + game_scenes.push_back(createGameMainMenuScene(renderer, false, true, true)); } break; case SDLK_a: @@ -136,6 +138,7 @@ void pollEvents(SDLPP::Scene &scene) { scene.updateSizeAndPosition(); moveToMarioPosition(scene, prev_mario_pos); update = true; + update_count = 2; } default: break; @@ -144,6 +147,18 @@ void pollEvents(SDLPP::Scene &scene) { } void doInputMainGame(std::shared_ptr scene) { + if(newLoaded) { + auto prev_mario_pos = mario->getAbsolutePos(); + scene->updateSizeAndPosition(); + moveToMarioPosition(*scene, prev_mario_pos); + update = true; + update_count = 2; + newLoaded = false; + } + if(g_death) { + game_scenes.push_back(createGameMainMenuScene(renderer, true, false, true)); + g_death = false; + } pollEvents(*scene); std::lock_guard lock(render_mutex); scene->updateScene(); @@ -154,7 +169,7 @@ void doInputMainGame(std::shared_ptr scene) { if (!moving_objects[i]->wasVisible()) { continue; } - auto visitor = getVisitor(*moving_objects[i], *scene, g_quit, + auto visitor = getVisitor(*moving_objects[i], *scene, g_death, coin_count, moving_objects); scene->visitCollisions(*moving_objects[i], *visitor); moving_objects[i]->handleVisitor(*visitor); @@ -178,6 +193,8 @@ void doInputMainGame(std::shared_ptr scene) { if (coin_count != prev_coin_count) { coins->changeText(std::to_string(coin_count) + " COINS"); + update = true; + update_count = 2; } // if player is > 0.7 of playground, move everything left auto playerX = mario->getRect().x; @@ -230,6 +247,7 @@ SceneStruct mainGameScene(const std::string &level_path) { bg->setId(1); scene->addObject(bg); + mario.reset(); mario = std::make_shared(renderer); scene->addObject(mario); @@ -311,11 +329,23 @@ void loadLevel(const std::string &level) { //std::lock_guard lock(render_mutex); coin_count = 0; std::lock_guard lock(gamescene_mutex); + for(auto &scene : game_scenes) { + scene.scene->resetScene(); + } game_scenes.clear(); game_scenes.push_back(mainGameScene("levels/" + level)); game_scenes.back().scene->updateSizeAndPosition(); update = true; newLoaded = true; + update_count = 2; + last_load_level = level; + g_death = false; +} + +void loadLastLevel() { + if(last_load_level != "") { + loadLevel(last_load_level); + } } #ifdef _WIN32 @@ -350,15 +380,10 @@ int main() { auto font = std::make_shared("testfont.ttf", 36); g_text_config = std::make_shared(font, "#FFFFFF", "#000000", 0.15); - game_scenes.push_back(createGameMainMenuScene(renderer, false)); + game_scenes.push_back(createGameMainMenuScene(renderer, false, false, false)); std::thread inputThread(doInput); SDL_PumpEvents(); - // TODO main menu -/* game_scenes.push_back(mainGameScene("levels/test.marmap")); - game_scenes.back().scene->updateSizeAndPosition(); - game_scenes.back().scene->renderScene(); - renderer->presentRenderer();*/ game_scenes.back().scene->updateSizeAndPosition(); game_scenes.back().scene->renderScene(); renderer->presentRenderer(); @@ -368,12 +393,12 @@ int main() { SDL_framerateDelay(&gFPS); SDL_PumpEvents(); std::lock_guard lock(render_mutex); - if (update || newLoaded) { + if (update) { for(auto &scene : game_scenes) { scene.scene->updateSizeAndPosition(); } - if(newLoaded) { - newLoaded = false; + if(update_count > 0) { + update_count--; } else { update = false; } diff --git a/mario/scenes/game_main_menu.cpp b/mario/scenes/game_main_menu.cpp index 50dbf6a..da9619f 100644 --- a/mario/scenes/game_main_menu.cpp +++ b/mario/scenes/game_main_menu.cpp @@ -5,16 +5,20 @@ #include "../objectids.hpp" #include "../editor_visitor.hpp" #include +#include "../sprites.hpp" bool __update_scenes_main_menu = false; bool __quit_scenes_main_menu = false; +bool __restart_scenes_main_menu = false; bool __started_main_menu = false; +bool __include_resume = false; uint64_t __cur_button_index_main_menu = -1; uint64_t __cur_button_index_main_menu_down = -1; std::vector> __buttons_main_menu{}; std::shared_ptr __mouse_main_menu{}; extern void loadLevel(const std::string &level); +extern void loadLastLevel(); void quitMainMenu() { g_quit = true; @@ -24,6 +28,11 @@ void resumeMainMenu() { __quit_scenes_main_menu = true; } +void restartMainMenu() { + __quit_scenes_main_menu = true; + __restart_scenes_main_menu = true; +} + void quitMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { quitMainMenu(); } @@ -32,9 +41,14 @@ void resumeMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { resumeMainMenu(); } +void restartMainMenuCallback(void * /*UNUSED*/, Button * /*UNUSED*/) { + restartMainMenu(); +} + void resetGlobals() { __update_scenes_main_menu = false; __quit_scenes_main_menu = false; + __restart_scenes_main_menu = false; __started_main_menu = false; __cur_button_index_main_menu_down = -1; __mouse_main_menu.reset(); @@ -42,7 +56,7 @@ void resetGlobals() { } void showLoadMenu(void */*UNUSED*/, Button */*UNUSED*/) { - auto loadMenu = createLoadScene(__buttons_main_menu.back()->getRenderer(), "levels", loadLevel, false); + auto loadMenu = createLoadScene(__buttons_main_menu.back()->getRenderer(), "levels", loadLevel, false, false); std::lock_guard lock(render_mutex); game_scenes.pop_back(); resetGlobals(); @@ -50,11 +64,10 @@ void showLoadMenu(void */*UNUSED*/, Button */*UNUSED*/) { } void __updateSelectedButton_MainMenu(uint64_t new_index) { - if (new_index != __cur_button_index_main_menu && - new_index != (uint64_t)-1) { + if (new_index != (uint64_t)-1) { __buttons_main_menu[new_index]->setHighlight(); - if (__cur_button_index_main_menu != (uint64_t)-1) { + if (__cur_button_index_main_menu != (uint64_t)-1 && new_index != __cur_button_index_main_menu) { __buttons_main_menu[__cur_button_index_main_menu] ->unsetHighlight(); } @@ -65,7 +78,11 @@ void __updateSelectedButton_MainMenu(uint64_t new_index) { void handleKeyUpMainMenu(SDL_Keycode key, SDLPP::Scene & /*UNUSED*/) { switch (key) { case SDLK_ESCAPE: - resumeMainMenu(); + if(__include_resume) { + resumeMainMenu(); + } else { + quitMainMenu(); + } break; case SDLK_DOWN: case SDLK_s: @@ -95,10 +112,10 @@ void handleKeyUpMainMenu(SDL_Keycode key, SDLPP::Scene & /*UNUSED*/) { } std::shared_ptr -createSceneMainMenu(std::shared_ptr &renderer, bool include_resume) { +createSceneMainMenu(std::shared_ptr &renderer, bool include_restart, bool include_resume, bool transparent_bg) { auto scene = std::make_shared(renderer); auto bg = std::make_shared(0, 0, 10, 10, renderer, - "#00000088", true); + transparent_bg ? "#00000088" : MARIO_OVERWORLD_COLORKEY, true); bg->setPermanent(); bg->setId(1); scene->addObject(bg); @@ -133,15 +150,24 @@ createSceneMainMenu(std::shared_ptr &renderer, bool include_res __buttons_main_menu.back()->setPermanent(); __buttons_main_menu.back()->setButtonIndex(__buttons_main_menu.size() - 1); } + if(include_restart || include_resume) { + __buttons_main_menu.emplace_back(std::make_shared