#include #include #include "Runner.hpp" #include #include #include #include "Component/Music/MusicComponent.hpp" #include "Component/Sound/SoundComponent.hpp" #include "Component/Controllable/ControllableComponent.hpp" #include "Component/Position/PositionComponent.hpp" #include "Component/Keyboard/KeyboardComponent.hpp" #include "Component/Renderer/Drawable2DComponent.hpp" #include "Component/Button/ButtonComponent.hpp" #include "Drawables/2D/Text.hpp" namespace RAY2D = RAY::Drawables::Drawables2D; namespace BBM { std::shared_ptr Runner::loadMainMenuScene() { static const std::map sounds = { {SoundComponent::BOMB, "assets/sounds/click.ogg"} }; auto scene = std::make_shared(); addMenuControl(*scene, sounds); scene->addEntity("Control entity") .addComponent("assets/musics/music_title.ogg") .addComponent(sounds); scene->addEntity("background") .addComponent() .addComponent("assets/backgrounds/menu.png"); scene->addEntity("logo") .addComponent(1920 / 3, 180, 0) .addComponent("assets/logo_small.png"); auto &play = scene->addEntity("play button") .addComponent(1920 / 2.5, 1080 - 650, 0) .addComponent("assets/buttons/button_new_game.png") .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_new_game.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_new_game_hovered.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { gameState.nextScene = BBM::GameState::SceneID::LobbyScene; }); auto &resume = scene->addEntity("resume button") .addComponent(1920 / 2.5, 1080 - 540, 0) .addComponent("assets/buttons/button_resume_game.png") .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_resume_game.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_resume_game_hovered.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { gameState.nextScene = BBM::GameState::SceneID::ResumeLobbyScene; auto gameScene = Runner::loadGameScene(); try { ParserYAML::load(gameScene); } catch (std::exception const &err) { std::cout << err.what() << std::endl; Runner::gameState.loadedScenes[GameState::SceneID::MainMenuScene]->addEntity("Error message parser") .addComponent(1920 / 5, 2 * 1080 / 4.25, 0) .addComponent(3s, [](WAL::Entity &myEntity, WAL::Wal &) { myEntity.scheduleDeletion(); }) .addComponent("Could not load file: " + std::string(err.what()), 50, RAY::Vector2(), RED); gameState.nextScene = BBM::GameState::SceneID::MainMenuScene; return; } Runner::gameState.loadedScenes[GameState::SceneID::GameScene] = gameScene; }); auto &settings = scene->addEntity("settings button") .addComponent(1920 / 2.5, 1080 - 430, 0) .addComponent("assets/buttons/button_settings.png") .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_settings.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_settings_hovered.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { gameState.nextScene = BBM::GameState::SceneID::SettingsScene; }); auto &exit = scene->addEntity("exit button") .addComponent(1920 / 2.5, 1080 - 320, 0) .addComponent("assets/buttons/button_exit.png") .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_exit.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY::Texture *texture = dynamic_cast(entity.getComponent().drawable.get()); texture->use("assets/buttons/button_exit_hovered.png"); }) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { wal.shouldClose = true; }); auto &credits = scene->addEntity("credit button") .addComponent(1920 - 100, 1080 - 30, 0) .addComponent("Credits", 20, RAY::Vector2(), BLACK) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY2D::Text *text = dynamic_cast(entity.getComponent().drawable.get()); text->setColor(BLACK); }) .addComponent([](WAL::Entity &entity, WAL::Wal &) { RAY2D::Text *text = dynamic_cast(entity.getComponent().drawable.get()); text->setColor(ORANGE); }) .addComponent([](WAL::Entity &entity, WAL::Wal &wal) { gameState.nextScene = BBM::GameState::SceneID::CreditScene; }); play.getComponent().setButtonLinks(nullptr, &resume); resume.getComponent().setButtonLinks(&play, &settings); settings.getComponent().setButtonLinks(&resume, &exit); exit.getComponent().setButtonLinks(&settings, &credits, nullptr, &credits); credits.getComponent().setButtonLinks(&exit, nullptr, &exit); return scene; } }