diff options
Diffstat (limited to 'game/menus')
25 files changed, 927 insertions, 8 deletions
diff --git a/game/menus/ButtonNextMainMenuSubScript.cpp b/game/menus/ButtonNextMainMenuSubScript.cpp index e03a34a..63a2777 100644 --- a/game/menus/ButtonNextMainMenuSubScript.cpp +++ b/game/menus/ButtonNextMainMenuSubScript.cpp @@ -1,4 +1,5 @@ #include "ButtonNextMainMenuSubScript.h" +#include "ButtonReplaySubScript.h" #include "MenusConfig.h" #include "ValueBroker.h" @@ -27,6 +28,7 @@ bool ButtonNextMainMenuSubScript::on_button_press(const ButtonPressEvent & e) { audio.stop(); } + this->trigger_event<DeleteRecordingEvent>(); SaveManager & savemgr = this->get_save_manager(); ValueBroker<int> coins = savemgr.get<int>(TOTAL_COINS_RUN, 0); diff --git a/game/menus/ButtonReplaySubScript.cpp b/game/menus/ButtonReplaySubScript.cpp new file mode 100644 index 0000000..01cccbf --- /dev/null +++ b/game/menus/ButtonReplaySubScript.cpp @@ -0,0 +1,43 @@ +#include "ButtonReplaySubScript.h" +#include "Config.h" +#include "MenusConfig.h" + +#include "../Events.h" +#include <crepe/api/AudioSource.h> +#include <crepe/types.h> + +using namespace crepe; +using namespace std; + +void ButtonReplaySubScript::init() { + IButtonScript::init(); + this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) { + return this->on_button_press(e); + }); + this->subscribe<EndGameEvent>([this](const EndGameEvent & e) { + return this->set_recording(); + }); + this->subscribe<DeleteRecordingEvent>([this](const DeleteRecordingEvent & e) { + return this->delete_recording(); + }); + if (DISABLE_REPLAY) return; + replay.record_start(); +} + +bool ButtonReplaySubScript::on_button_press(const ButtonPressEvent & e) { + if (DISABLE_REPLAY) return false; + replay.play(this->recording); + return false; +} + +bool ButtonReplaySubScript::set_recording() { + if (DISABLE_REPLAY) return false; + this->recording = replay.record_end(); + return false; +} + +bool ButtonReplaySubScript::delete_recording() { + if (DISABLE_REPLAY) return false; + replay.release(this->recording); + return false; +} diff --git a/game/menus/ButtonReplaySubScript.h b/game/menus/ButtonReplaySubScript.h new file mode 100644 index 0000000..3eb8aa9 --- /dev/null +++ b/game/menus/ButtonReplaySubScript.h @@ -0,0 +1,21 @@ +#pragma once + +#include "IButtonScript.h" + +#include <crepe/api/Script.h> + +struct DeleteRecordingEvent : public crepe::Event {}; + +class ButtonReplaySubScript : public IButtonScript { +public: + void init() override; + bool on_button_press(const crepe::ButtonPressEvent & e); + +private: + crepe::recording_t recording = 0; + bool set_recording(); + bool delete_recording(); + +protected: + bool transition = false; +}; diff --git a/game/menus/ButtonShowCreditsSubScript.cpp b/game/menus/ButtonShowCreditsSubScript.cpp new file mode 100644 index 0000000..ec0e980 --- /dev/null +++ b/game/menus/ButtonShowCreditsSubScript.cpp @@ -0,0 +1,20 @@ +#include "ButtonShowCreditsSubScript.h" +#include "MenusConfig.h" +#include "mainmenu/CreditsSubScript.h" +#include <crepe/api/AudioSource.h> +#include <crepe/types.h> + +using namespace crepe; +using namespace std; + +void ButtonShowCreditsSubScript::init() { + IButtonScript::init(); + this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) { + return this->on_button_press(e); + }); +} + +bool ButtonShowCreditsSubScript::on_button_press(const ButtonPressEvent & e) { + this->trigger_event<ShowCreditsEvent>(); + return false; +} diff --git a/game/menus/ButtonShowCreditsSubScript.h b/game/menus/ButtonShowCreditsSubScript.h new file mode 100644 index 0000000..3c73c44 --- /dev/null +++ b/game/menus/ButtonShowCreditsSubScript.h @@ -0,0 +1,14 @@ +#pragma once + +#include "IButtonScript.h" + +#include <crepe/api/Script.h> + +class ButtonShowCreditsSubScript : public IButtonScript { +public: + void init() override; + bool on_button_press(const crepe::ButtonPressEvent & e); + +protected: + bool transition = false; +}; diff --git a/game/menus/ButtonSubScene.cpp b/game/menus/ButtonSubScene.cpp index e41c798..1fe6b03 100644 --- a/game/menus/ButtonSubScene.cpp +++ b/game/menus/ButtonSubScene.cpp @@ -1,13 +1,22 @@ #include "ButtonSubScene.h" #include "ButtonNextMainMenuSubScript.h" +#include "ButtonReplaySubScript.h" #include "ButtonSetMainMenuSubScript.h" #include "ButtonSetShopSubScript.h" +#include "ButtonShowCreditsSubScript.h" #include "IButtonScript.h" #include "MenusConfig.h" +#include "../preview/PreviewReplaySubScript.h" +#include "../preview/PreviewStartRecSubScript.h" +#include "../preview/PreviewStopRecSubScript.h" +#include "api/Asset.h" #include "mainmenu/ButtonTransitionPreviewSubScript.h" #include "../Config.h" +#include "mainmenu/CreditsSubScript.h" +#include "menus/shop/ButtonBuySelectBubbleScript.h" +#include "menus/shop/ButtonBuySelectBulletScript.h" #include <crepe/api/BehaviorScript.h> #include <crepe/api/Button.h> @@ -58,6 +67,36 @@ void ButtonSubScene::set_script(crepe::GameObject & button_object, const Data & button_object.add_component<BehaviorScript>() .set_script<ButtonNextMainMenuSubScript>(); break; + case ScriptSelect::REPLAY: + button_object.add_component<BehaviorScript>().set_script<ButtonReplaySubScript>(); + break; + case ScriptSelect::CREDITS_BACK: + button_object.add_component<BehaviorScript>().set_script<CreditsSubScript>(data.tag + ); + break; + case ScriptSelect::CREDITS_SHOW: + button_object.add_component<BehaviorScript>() + .set_script<ButtonShowCreditsSubScript>(); + break; + case ScriptSelect::PREVIEW_REPLAY: + button_object.add_component<BehaviorScript>().set_script<PreviewReplaySubScript>(); + break; + case ScriptSelect::PREVIEW_START: + button_object.add_component<BehaviorScript>().set_script<PreviewStartRecSubScript>( + ); + break; + case ScriptSelect::PREVIEW_STOP: + button_object.add_component<BehaviorScript>().set_script<PreviewStopRecSubScript>( + ); + break; + case ScriptSelect::SHOP_BULLET: + button_object.add_component<BehaviorScript>() + .set_script<ButtonBuySelectBulletScript>(); + break; + case ScriptSelect::SHOP_BUBBLE: + button_object.add_component<BehaviorScript>() + .set_script<ButtonBuySelectBubbleScript>(); + break; case ScriptSelect::NONE: button_object.add_component<BehaviorScript>().set_script<IButtonScript>(); break; @@ -182,8 +221,31 @@ void ButtonSubScene::next_btn_overlay(crepe::GameObject & button_object, const D void ButtonSubScene::btn_color_side( crepe::GameObject & button_object, const vec2 & offset, const Data & data ) { + Asset * selected; + Asset blue = Asset("asset/ui/buttonSmallBlue.png"); + Asset orange = Asset("asset/ui/buttonSmallOrange.png"); + Asset purple = Asset("asset/ui/buttonSmallPurple.png"); + Asset yellow = Asset("asset/ui/buttonSmallYellow.png"); + switch (data.btn_side_color) { + case ButtonSideColor::BLUE: + selected = &blue; + break; + case ButtonSideColor::ORANGE: + selected = &orange; + break; + case ButtonSideColor::PURPLE: + selected = &purple; + break; + case ButtonSideColor::YELLOW: + selected = &yellow; + break; + case ButtonSideColor::NONE: + selected = &blue; + break; + } + button_object.add_component<Sprite>( - Asset("asset/ui/buttonSmallBlue.png"), + *selected, Sprite::Data { .sorting_in_layer = STARTING_SORTING_IN_LAYER + 2 + data.sorting_layer_offset, .size = SIDE_PANEL_SIZE, @@ -192,7 +254,7 @@ void ButtonSubScene::btn_color_side( } ); button_object.add_component<Sprite>( - Asset("asset/ui/buttonSmallBlue.png"), + *selected, Sprite::Data { .flip = {true, false}, .sorting_in_layer = STARTING_SORTING_IN_LAYER + 2 + data.sorting_layer_offset, diff --git a/game/menus/ButtonSubScene.h b/game/menus/ButtonSubScene.h index c1c6de8..d4c7223 100644 --- a/game/menus/ButtonSubScene.h +++ b/game/menus/ButtonSubScene.h @@ -16,6 +16,14 @@ public: SHOP, MAINMENU, NEXT, + REPLAY, + CREDITS_SHOW, + CREDITS_BACK, + PREVIEW_START, + PREVIEW_STOP, + PREVIEW_REPLAY, + SHOP_BULLET, + SHOP_BUBBLE, NONE, }; //icon enum @@ -30,6 +38,14 @@ public: NEXT, LARGE, }; + + enum class ButtonSideColor { + BLUE, + ORANGE, + PURPLE, + YELLOW, + NONE, + }; //data struct struct Data { const std::string & text = "NODATA"; @@ -45,6 +61,7 @@ public: const bool color_side = true; const std::string & tag = ""; const int sorting_layer_offset = 0; + const ButtonSideColor btn_side_color = ButtonSideColor::NONE; }; public: diff --git a/game/menus/MenusConfig.h b/game/menus/MenusConfig.h index 24b60e8..3e357a5 100644 --- a/game/menus/MenusConfig.h +++ b/game/menus/MenusConfig.h @@ -5,7 +5,7 @@ static constexpr int STARTING_SORTING_IN_LAYER = 7; //Scene names static constexpr const char * START_SCENE = "scene1"; -static constexpr const char * PREVIEW_SCENE = "scene1"; +static constexpr const char * PREVIEW_SCENE = "preview scene"; static constexpr const char * SHOP_SCENE = "shopmenu"; static constexpr const char * MAINMENU_SCENE = "mainmenu"; //button config diff --git a/game/menus/endgame/EndGameSubScene.cpp b/game/menus/endgame/EndGameSubScene.cpp index 3ef0f9a..b33072a 100644 --- a/game/menus/endgame/EndGameSubScene.cpp +++ b/game/menus/endgame/EndGameSubScene.cpp @@ -47,6 +47,51 @@ void EndGameSubScene::create(Scene & scn) { vec2 {0, -207} + FONTOFFSET, TITEL_STRING ); + const float Y_SPACING = 50; + const float Y_OFFSET = -100; + + // Gold gathered + const string GOLD_STRING = "gold:0"; + GameObject gold = scn.new_object("gold_endgame", TAG); + crepe::vec2 size_gold = {200, (200.0f / GOLD_STRING.size()) * 2}; + gold.add_component<Text>( + size_gold, FONT, + Text::Data { + .world_space = false, + .text_color = Color::GOLD, + }, + vec2 {0, Y_OFFSET} + FONTOFFSET, GOLD_STRING + ); + + // Distance + const string DISTANCE_STRING = "0M"; + GameObject distance = scn.new_object("distance_endgame", TAG); + crepe::vec2 size_distance = {200, (200.0f / DISTANCE_STRING.size()) * 2}; + distance.add_component<Text>( + size_distance, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {0, Y_SPACING + Y_OFFSET} + FONTOFFSET, DISTANCE_STRING + ); + + // Highscore + const string HIGHSCORE_STRING = "NEW HIGHSCORE"; + GameObject highscore = scn.new_object("highscore_endgame", "highscore_tag_end"); + crepe::vec2 size_highscore = {200, (200.0f / HIGHSCORE_STRING.size()) * 2}; + highscore + .add_component<Text>( + size_highscore, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {0, Y_SPACING * 2 + Y_OFFSET} + FONTOFFSET, HIGHSCORE_STRING + ) + .active + = false; + // Buttons vec2 button_position = {190, 190}; ButtonSubScene button; @@ -71,7 +116,7 @@ void EndGameSubScene::create(Scene & scn) { .text = "REPLAY", .text_width = 150, .position = {-button_position.x, button_position.y}, - // .script_type = ButtonSubScene::ScriptSelect::MAINMENU, + .script_type = ButtonSubScene::ScriptSelect::REPLAY, .button_type = ButtonSubScene::ButtonSelect::BACK, .scale = 0.6, .worldspace = false, diff --git a/game/menus/endgame/EndGameSubScript.cpp b/game/menus/endgame/EndGameSubScript.cpp index f120e2d..6793f3e 100644 --- a/game/menus/endgame/EndGameSubScript.cpp +++ b/game/menus/endgame/EndGameSubScript.cpp @@ -1,7 +1,11 @@ #include "EndGameSubScript.h" +#include "../../Config.h" #include "../../Events.h" +#include "../ButtonReplaySubScript.h" #include "../IFloatingWindowScript.h" +#include "ValueBroker.h" +#include "manager/SaveManager.h" #include <string> @@ -20,6 +24,9 @@ void EndGameSubScript::init() { this->subscribe<EndGameEvent>([this](const EndGameEvent e) { return this->reset_timescale(); }); + this->subscribe<ShowScoreEvent>([this](const ShowScoreEvent e) { + return this->showscore(); + }); } bool EndGameSubScript::disable_all() { @@ -52,3 +59,43 @@ bool EndGameSubScript::reset_timescale() { this->get_loop_timer().set_time_scale(1); return false; } + +bool EndGameSubScript::showscore() { + // Gather text + Text & coins_text = this->get_components_by_name<Text>("gold_endgame").front().get(); + Text & distance_text + = this->get_components_by_name<Text>("distance_endgame").front().get(); + Text & highscore_text + = this->get_components_by_name<Text>("highscore_endgame").front().get(); + highscore_text.active = false; + + // Gather saved data + SaveManager & savemgr = this->get_save_manager(); + ValueBroker<std::string> coins = savemgr.get<std::string>(TOTAL_COINS_RUN, "0"); + ValueBroker<std::string> distance = savemgr.get<std::string>(DISTANCE_RUN, "0"); + int distance_run = savemgr.get<int>(DISTANCE_RUN, 0).get(); + int distance_game = savemgr.get<int>(DISTANCE_GAME, 0).get(); + + // Show highscore + if (distance_run > distance_game) highscore_text.active = true; + + const float CHAR_SIZE_DIS = 20; + // Show distance + std::string distance_string = "DISTANCE:" + distance.get(); + distance_text.text = distance_string; + crepe::vec2 size_distance + = {CHAR_SIZE_DIS * distance_string.size(), + (CHAR_SIZE_DIS * distance_string.size() / distance_string.size()) * 2}; + distance_text.dimensions = size_distance; + + const float CHAR_SIZE_COIN = 16; + // Show coins + std::string coins_string = "Coins:" + coins.get(); + coins_text.text = coins_string; + crepe::vec2 size_coins + = {CHAR_SIZE_COIN * coins_string.size(), + (CHAR_SIZE_COIN * coins_string.size() / coins_string.size()) * 2}; + coins_text.dimensions = size_coins; + + return false; +} diff --git a/game/menus/endgame/EndGameSubScript.h b/game/menus/endgame/EndGameSubScript.h index 62a2f0c..c25f6ca 100644 --- a/game/menus/endgame/EndGameSubScript.h +++ b/game/menus/endgame/EndGameSubScript.h @@ -5,6 +5,8 @@ #include <crepe/api/Event.h> #include <crepe/api/Script.h> +struct ShowScoreEvent : public crepe::Event {}; + class EndGameSubScript : public IFloatingWindowScript { public: EndGameSubScript(const std::string & tag); @@ -12,4 +14,5 @@ public: bool disable_all(); bool enable_all(); bool reset_timescale(); + bool showscore(); }; diff --git a/game/menus/mainmenu/CreditsSubScene.cpp b/game/menus/mainmenu/CreditsSubScene.cpp new file mode 100644 index 0000000..65576ee --- /dev/null +++ b/game/menus/mainmenu/CreditsSubScene.cpp @@ -0,0 +1,132 @@ + +#include "CreditsSubScene.h" +#include "CreditsSubScript.h" + +#include "../../Config.h" +#include "../ButtonSubScene.h" +#include "../FloatingWindowSubScene.h" + +#include <string> + +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Text.h> +#include <crepe/types.h> + +using namespace crepe; +using namespace std; + +void CreditsSubScene::create(Scene & scn) { + + const std::string TAG = "credits_tag"; + GameObject script = scn.new_object("script"); + script.add_component<BehaviorScript>().set_script<CreditsSubScript>(TAG); + + // Window + FloatingWindowSubScene window; + window.create( + scn, + FloatingWindowSubScene::Data { + .group_tag = TAG, + .width = 500, + .offset = {150, -50}, + .width_middle_offset = -2, + } + ); + + // Titel + const string TITEL_STRING = "Credits"; + GameObject titel = scn.new_object("titel", TAG); + crepe::vec2 size = {200, (200.0f / TITEL_STRING.size()) * 2}; + titel.add_component<Text>( + size, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207} + FONTOFFSET, TITEL_STRING + ); + + // Buttons + vec2 button_position = {190, 190}; + ButtonSubScene button; + button.create( + scn, + ButtonSubScene::Data { + .text = "Back", + .text_width = 150, + .position = {-button_position.x + 150, button_position.y}, + .script_type = ButtonSubScene::ScriptSelect::CREDITS_BACK, + .button_type = ButtonSubScene::ButtonSelect::BACK, + .scale = 0.6, + .worldspace = false, + .tag = TAG, + .sorting_layer_offset = 20, + } + ); + + const float SIZE_CHAR_NAMES = 10; + const float Y_OFFSET_NAMES_BEGIN = 100; + const float Y_OFFSET_NAMES = 30; + const string LOEK = "Loek Le Blansch"; + crepe::vec2 size_loek + = {LOEK.size() * SIZE_CHAR_NAMES, (LOEK.size() * SIZE_CHAR_NAMES / LOEK.size()) * 2}; + titel.add_component<Text>( + size_loek, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207 + Y_OFFSET_NAMES + Y_OFFSET_NAMES_BEGIN} + FONTOFFSET, LOEK + ); + + const string WOUTER = "Wouter Boerenkamps"; + crepe::vec2 size_wouter + = {WOUTER.size() * SIZE_CHAR_NAMES, + (WOUTER.size() * SIZE_CHAR_NAMES / WOUTER.size()) * 2}; + titel.add_component<Text>( + size_wouter, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207 + Y_OFFSET_NAMES * 2 + Y_OFFSET_NAMES_BEGIN} + FONTOFFSET, WOUTER + ); + + const string JARO = "Jaro Rutjes"; + crepe::vec2 size_jaro + = {JARO.size() * SIZE_CHAR_NAMES, (JARO.size() * SIZE_CHAR_NAMES / JARO.size()) * 2}; + titel.add_component<Text>( + size_jaro, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207 + Y_OFFSET_NAMES * 3 + Y_OFFSET_NAMES_BEGIN} + FONTOFFSET, JARO + ); + + const string MAX = "Max Smits"; + crepe::vec2 size_max + = {MAX.size() * SIZE_CHAR_NAMES, (MAX.size() * SIZE_CHAR_NAMES / MAX.size()) * 2}; + titel.add_component<Text>( + size_max, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207 + Y_OFFSET_NAMES * 4 + Y_OFFSET_NAMES_BEGIN} + FONTOFFSET, MAX + ); + + const string NIELS = "Niels Stunnebrink"; + crepe::vec2 size_niels + = {NIELS.size() * SIZE_CHAR_NAMES, (NIELS.size() * SIZE_CHAR_NAMES / NIELS.size()) * 2 + }; + titel.add_component<Text>( + size_niels, FONT, + Text::Data { + .world_space = false, + .text_color = Color::WHITE, + }, + vec2 {150, -207 + Y_OFFSET_NAMES * 5 + Y_OFFSET_NAMES_BEGIN} + FONTOFFSET, NIELS + ); +} diff --git a/game/menus/mainmenu/CreditsSubScene.h b/game/menus/mainmenu/CreditsSubScene.h new file mode 100644 index 0000000..e7ff735 --- /dev/null +++ b/game/menus/mainmenu/CreditsSubScene.h @@ -0,0 +1,9 @@ +#pragma once + +#include <crepe/api/Scene.h> + +class CreditsSubScene { + +public: + void create(crepe::Scene & scn); +}; diff --git a/game/menus/mainmenu/CreditsSubScript.cpp b/game/menus/mainmenu/CreditsSubScript.cpp new file mode 100644 index 0000000..4224dc8 --- /dev/null +++ b/game/menus/mainmenu/CreditsSubScript.cpp @@ -0,0 +1,58 @@ +#include "CreditsSubScript.h" + +#include "../../Events.h" +#include "../ButtonReplaySubScript.h" +#include "../IFloatingWindowScript.h" + +#include <string> + +#include <crepe/api/Button.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Text.h> +#include <crepe/types.h> + +using namespace crepe; + +CreditsSubScript::CreditsSubScript(const std::string & tag) { this->tag = tag; } + +void CreditsSubScript::init() { + IButtonScript::init(); + this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) { + return this->on_button_press(e); + }); + this->subscribe<ShowCreditsEvent>([this](const ShowCreditsEvent & e) { + this->enable_all(); + return false; + }); + this->disable_all(); +} + +bool CreditsSubScript::disable_all() { + IFloatingWindowScript::disable_all_sprites(); + RefVector<Button> buttons = this->get_components_by_tag<Button>(this->tag); + for (Button & button : buttons) { + button.active = false; + } + RefVector<Text> texts = this->get_components_by_tag<Text>(this->tag); + for (Text & text : texts) { + text.active = false; + } + return false; +} + +bool CreditsSubScript::enable_all() { + IFloatingWindowScript::enable_all_sprites(); + RefVector<Button> buttons = this->get_components_by_tag<Button>(this->tag); + for (Button & button : buttons) { + button.active = true; + } + RefVector<Text> texts = this->get_components_by_tag<Text>(this->tag); + for (Text & text : texts) { + text.active = true; + } + return false; +} + +bool CreditsSubScript::on_button_press(const ButtonPressEvent & e) { + return this->disable_all(); +} diff --git a/game/menus/mainmenu/CreditsSubScript.h b/game/menus/mainmenu/CreditsSubScript.h new file mode 100644 index 0000000..81f941a --- /dev/null +++ b/game/menus/mainmenu/CreditsSubScript.h @@ -0,0 +1,18 @@ +#pragma once + +#include "../IButtonScript.h" +#include "../IFloatingWindowScript.h" + +#include <crepe/api/Event.h> +#include <crepe/api/Script.h> + +struct ShowCreditsEvent : public crepe::Event {}; + +class CreditsSubScript : public IFloatingWindowScript, public IButtonScript { +public: + CreditsSubScript(const std::string & tag); + void init() override; + bool disable_all(); + bool enable_all(); + bool on_button_press(const crepe::ButtonPressEvent & e); +}; diff --git a/game/menus/mainmenu/MainMenuScene.cpp b/game/menus/mainmenu/MainMenuScene.cpp index 43418e3..c5d2030 100644 --- a/game/menus/mainmenu/MainMenuScene.cpp +++ b/game/menus/mainmenu/MainMenuScene.cpp @@ -1,6 +1,8 @@ #include "MainMenuScene.h" +#include "CreditsSubScene.h" #include "MainMenuConfig.h" +#include "QuitScript.h" #include "TransitionStartSubScript.h" #include "../ButtonSubScene.h" @@ -28,10 +30,11 @@ void MainMenuScene::load_scene() { camera_object.add_component<Camera>( ivec2(990, 720), vec2(1100, 800), Camera::Data { - .bg_color = Color::RED, + .bg_color = Color::BLACK, } ); camera_object.add_component<BehaviorScript>().set_script<TransitionStartSubScript>(); + camera_object.add_component<BehaviorScript>().set_script<QuitScript>(); //Button menu GameObject menu_button = this->new_object(MENU_BUTTON_NAME, MENU_BUTTON_NAME, MENU_OFFSET); @@ -54,6 +57,7 @@ void MainMenuScene::load_scene() { .text_width = 200, .position = pos_btn, .script_type = ButtonSubScene::ScriptSelect::PREVIEW, + .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE, } ); @@ -64,11 +68,26 @@ void MainMenuScene::load_scene() { ButtonSubScene::Data { .text = "SHOP", .text_offset = {-20, 0}, - .text_width = 115, + .text_width = 110, .icon_offset = {60, 0}, .icon_type = ButtonSubScene::IconSelect::SHOP, .position = pos_btn, .script_type = ButtonSubScene::ScriptSelect::SHOP, + .btn_side_color = ButtonSubScene::ButtonSideColor::ORANGE, + } + ); + + //Credits btn + pos_btn.y += MENU_BUTTON_SPACING + LARGE_OVERLAY_SIZE.y; + button.create( + *this, + ButtonSubScene::Data { + .text = "CREDITS", + .text_offset = {0, 0}, + .text_width = 200, + .position = pos_btn, + .script_type = ButtonSubScene::ScriptSelect::CREDITS_SHOW, + .btn_side_color = ButtonSubScene::ButtonSideColor::BLUE, } ); @@ -110,6 +129,9 @@ void MainMenuScene::load_scene() { .tag = MENU_INFO_TAG, } ); + + CreditsSubScene creditscene; + creditscene.create(*this); } string MainMenuScene::get_name() const { return MAINMENU_SCENE; } diff --git a/game/menus/mainmenu/TransitionStartSubScript.cpp b/game/menus/mainmenu/TransitionStartSubScript.cpp index 63723cf..f737f7f 100644 --- a/game/menus/mainmenu/TransitionStartSubScript.cpp +++ b/game/menus/mainmenu/TransitionStartSubScript.cpp @@ -6,7 +6,7 @@ using namespace crepe; using namespace std; void TransitionStartSubScript::fixed_update(crepe::duration_t dt) { - if (this->get_key_state(Keycode::ENTER) && this->transition == false) + if (this->get_key_state(Keycode::SPACE) && this->transition == false) this->transition = true; } diff --git a/game/menus/shop/ButtonBuySelectBubbleScript.cpp b/game/menus/shop/ButtonBuySelectBubbleScript.cpp new file mode 100644 index 0000000..741afde --- /dev/null +++ b/game/menus/shop/ButtonBuySelectBubbleScript.cpp @@ -0,0 +1,34 @@ +#include "ButtonBuySelectBubbleScript.h" +#include "../MenusConfig.h" +#include "Config.h" +#include "ValueBroker.h" +#include "manager/SaveManager.h" +#include "menus/shop/Shopconfig.h" + +using namespace crepe; +using namespace std; + +void ButtonBuySelectBubbleScript::init() { + IButtonScript::init(); + this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) { + return this->on_button_press(e); + }); +} + +bool ButtonBuySelectBubbleScript::on_button_press(const ButtonPressEvent & e) { + SaveManager & save = this->get_save_manager(); + ValueBroker<int> buy_bullet = save.get<int>(BUY_BUBBLE_SAVE, 0); + if (!buy_bullet.get()) { + ValueBroker<int> coins = save.get<int>(TOTAL_COINS_GAME, 0); + if (coins.get() >= 1000) { + int coin = coins.get(); + coin -= 1000; + save.set(TOTAL_COINS_GAME, coin); + save.set(BUY_BUBBLE_SAVE, 1); + } + } else { + save.set(JETPACK_PARTICLES, 1); + } + this->trigger_event<ShopUpdate>(); + return false; +} diff --git a/game/menus/shop/ButtonBuySelectBubbleScript.h b/game/menus/shop/ButtonBuySelectBubbleScript.h new file mode 100644 index 0000000..ce276ef --- /dev/null +++ b/game/menus/shop/ButtonBuySelectBubbleScript.h @@ -0,0 +1,14 @@ +#pragma once + +#include "../IButtonScript.h" + +#include <crepe/api/Script.h> + +class ButtonBuySelectBubbleScript : public IButtonScript { +public: + void init() override; + bool on_button_press(const crepe::ButtonPressEvent & e); + +protected: + bool transition = false; +}; diff --git a/game/menus/shop/ButtonBuySelectBulletScript.cpp b/game/menus/shop/ButtonBuySelectBulletScript.cpp new file mode 100644 index 0000000..d30849c --- /dev/null +++ b/game/menus/shop/ButtonBuySelectBulletScript.cpp @@ -0,0 +1,34 @@ +#include "ButtonBuySelectBulletScript.h" +#include "../MenusConfig.h" +#include "Config.h" +#include "ValueBroker.h" +#include "manager/SaveManager.h" +#include "menus/shop/Shopconfig.h" + +using namespace crepe; +using namespace std; + +void ButtonBuySelectBulletScript::init() { + IButtonScript::init(); + this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) { + return this->on_button_press(e); + }); +} + +bool ButtonBuySelectBulletScript::on_button_press(const ButtonPressEvent & e) { + SaveManager & save = this->get_save_manager(); + ValueBroker<int> buy_bullet = save.get<int>(BUY_BULLET_SAVE, 0); + if (!buy_bullet.get()) { + ValueBroker<int> coins = save.get<int>(TOTAL_COINS_GAME, 0); + if (coins.get() >= 0) { + int coin = coins.get(); + coin -= 0; + save.set(TOTAL_COINS_GAME, coin); + save.set(BUY_BULLET_SAVE, 1); + } + } else { + save.set(JETPACK_PARTICLES, 0); + } + this->trigger_event<ShopUpdate>(); + return false; +} diff --git a/game/menus/shop/ButtonBuySelectBulletScript.h b/game/menus/shop/ButtonBuySelectBulletScript.h new file mode 100644 index 0000000..86de0ac --- /dev/null +++ b/game/menus/shop/ButtonBuySelectBulletScript.h @@ -0,0 +1,14 @@ +#pragma once + +#include "../IButtonScript.h" + +#include <crepe/api/Script.h> + +class ButtonBuySelectBulletScript : public IButtonScript { +public: + void init() override; + bool on_button_press(const crepe::ButtonPressEvent & e); + +protected: + bool transition = false; +}; diff --git a/game/menus/shop/ShopLoadScript.cpp b/game/menus/shop/ShopLoadScript.cpp new file mode 100644 index 0000000..a545fe2 --- /dev/null +++ b/game/menus/shop/ShopLoadScript.cpp @@ -0,0 +1,126 @@ +#include "ShopLoadScript.h" +#include "Shopconfig.h" +#include "api/Button.h" +#include "api/Sprite.h" +#include "api/Text.h" +#include "manager/SaveManager.h" +#include <crepe/ValueBroker.h> + +using namespace crepe; +using namespace std; + +void ShopLoadScript::init() { + this->update(); + this->subscribe<ShopUpdate>([this](const ShopUpdate e) { return this->update(); }); +} + +bool ShopLoadScript::update() { + SaveManager & save = this->get_save_manager(); + ValueBroker<int> buy_bullet = save.get<int>(BUY_BULLET_SAVE, 0); + ValueBroker<int> buy_bubble = save.get<int>(BUY_BUBBLE_SAVE, 0); + + if (buy_bullet.get()) { + auto sprites = this->get_components_by_tag<Sprite>(BUY_BULLET); + for (auto sprite : sprites) { + sprite.get().active = false; + } + auto buttons = this->get_components_by_tag<Button>(BUY_BULLET); + for (auto btn : buttons) { + btn.get().active = false; + } + auto texts = this->get_components_by_tag<Text>(BUY_BULLET); + for (auto txt : texts) { + txt.get().active = false; + } + auto sprites1 = this->get_components_by_tag<Sprite>(SELECT_BULLET); + for (auto sprite : sprites1) { + sprite.get().active = true; + } + auto buttons1 = this->get_components_by_tag<Button>(SELECT_BULLET); + for (auto btn : buttons1) { + btn.get().active = true; + } + auto texts1 = this->get_components_by_tag<Text>(SELECT_BULLET); + for (auto txt : texts1) { + txt.get().active = true; + } + } else { + auto sprites = this->get_components_by_tag<Sprite>(SELECT_BULLET); + for (auto sprite : sprites) { + sprite.get().active = false; + } + auto buttons = this->get_components_by_tag<Button>(SELECT_BULLET); + for (auto btn : buttons) { + btn.get().active = false; + } + auto texts = this->get_components_by_tag<Text>(SELECT_BULLET); + for (auto txt : texts) { + txt.get().active = false; + } + auto sprites1 = this->get_components_by_tag<Sprite>(BUY_BULLET); + for (auto sprite : sprites1) { + sprite.get().active = true; + } + auto buttons1 = this->get_components_by_tag<Button>(BUY_BULLET); + for (auto btn : buttons1) { + btn.get().active = true; + } + auto texts1 = this->get_components_by_tag<Text>(BUY_BULLET); + for (auto txt : texts1) { + txt.get().active = true; + } + } + + if (buy_bubble.get()) { + auto sprites = this->get_components_by_tag<Sprite>(BUY_BUBBLE); + for (auto sprite : sprites) { + sprite.get().active = false; + } + auto buttons = this->get_components_by_tag<Button>(BUY_BUBBLE); + for (auto btn : buttons) { + btn.get().active = false; + } + auto texts = this->get_components_by_tag<Text>(BUY_BUBBLE); + for (auto txt : texts) { + txt.get().active = false; + } + auto sprites1 = this->get_components_by_tag<Sprite>(SELECT_BUBBLE); + for (auto sprite : sprites1) { + sprite.get().active = true; + } + auto buttons1 = this->get_components_by_tag<Button>(SELECT_BUBBLE); + for (auto btn : buttons1) { + btn.get().active = true; + } + auto texts1 = this->get_components_by_tag<Text>(SELECT_BUBBLE); + for (auto txt : texts1) { + txt.get().active = true; + } + } else { + auto sprites = this->get_components_by_tag<Sprite>(SELECT_BUBBLE); + for (auto sprite : sprites) { + sprite.get().active = false; + } + auto buttons = this->get_components_by_tag<Button>(SELECT_BUBBLE); + for (auto btn : buttons) { + btn.get().active = false; + } + auto texts = this->get_components_by_tag<Text>(SELECT_BUBBLE); + for (auto txt : texts) { + txt.get().active = false; + } + auto sprites1 = this->get_components_by_tag<Sprite>(BUY_BUBBLE); + for (auto sprite : sprites1) { + sprite.get().active = true; + } + auto buttons1 = this->get_components_by_tag<Button>(BUY_BUBBLE); + for (auto btn : buttons1) { + btn.get().active = true; + } + auto texts1 = this->get_components_by_tag<Text>(BUY_BUBBLE); + for (auto txt : texts1) { + txt.get().active = true; + } + } + return false; +} diff --git a/game/menus/shop/ShopLoadScript.h b/game/menus/shop/ShopLoadScript.h new file mode 100644 index 0000000..b17bf1c --- /dev/null +++ b/game/menus/shop/ShopLoadScript.h @@ -0,0 +1,10 @@ +#pragma once + +#include <crepe/api/Script.h> +#include <crepe/manager/SaveManager.h> + +class ShopLoadScript : public crepe::Script { +public: + void init() override; + bool update(); +}; diff --git a/game/menus/shop/ShopMenuScene.cpp b/game/menus/shop/ShopMenuScene.cpp index d4542ba..641352c 100644 --- a/game/menus/shop/ShopMenuScene.cpp +++ b/game/menus/shop/ShopMenuScene.cpp @@ -2,12 +2,17 @@ #include "ShopMenuScene.h" #include "../../Config.h" -#include "../BannerSubScene.h" #include "../ButtonSubScene.h" #include "../MenusConfig.h" +#include "api/BehaviorScript.h" +#include "menus/BannerSubScene.h" +#include "menus/shop/ShopLoadScript.h" +#include "types.h" +#include "Shopconfig.h" #include <crepe/api/Camera.h> #include <crepe/api/Sprite.h> +#include <crepe/api/Text.h> using namespace crepe; using namespace std; @@ -38,6 +43,7 @@ void ShopMenuScene::load_scene() { .position_offset {0}, } ); + menu_background.add_component<BehaviorScript>().set_script<ShopLoadScript>(); ButtonSubScene button; button.create( @@ -51,6 +57,160 @@ void ShopMenuScene::load_scene() { .scale = 0.8 } ); + + const float CHAR_SIZE = 16; + const float CHAR_SIZE_COIN = 16; + crepe::vec2 size; + + GameObject shop_item_bullet = this->new_object("bullet", "shop_item", vec2(-100, 0)); + shop_item_bullet.add_component<Sprite>( + Asset("asset/other_effects/effect_rocketmgshell_TVOS.png"), + Sprite::Data { + .sorting_in_layer = STARTING_SORTING_IN_LAYER + 1, + .size = {0, 100}, + .position_offset = {0, 0}, + } + ); + + const string BULLETS_STRING = "BULLETS"; + size + = {CHAR_SIZE * BULLETS_STRING.size(), + (CHAR_SIZE * BULLETS_STRING.size() / BULLETS_STRING.size()) * 2}; + + shop_item_bullet.add_component<Text>( + size, FONT, + Text::Data { + .world_space = true, + .text_color = Color::WHITE, + }, + vec2 {0, -75}, BULLETS_STRING + ); + shop_item_bullet.add_component<Sprite>( + Asset("asset/ui/buttonCoinsSmall.png"), + Sprite::Data { + .sorting_in_layer = STARTING_SORTING_IN_LAYER + 1, + .size = {0, 45}, + .position_offset = {25, 75}, + } + ); + + const string BULLETS_GOLD_STRING = "0"; + size + = {CHAR_SIZE_COIN * BULLETS_GOLD_STRING.size(), + (CHAR_SIZE_COIN * BULLETS_GOLD_STRING.size() / BULLETS_GOLD_STRING.size()) * 2}; + shop_item_bullet.add_component<Text>( + size, FONT, + Text::Data { + .world_space = true, + .text_color = Color::GOLD, + }, + vec2 {-5, 75}, BULLETS_GOLD_STRING + ); + + GameObject shop_item_bubble = this->new_object("bubble", "shop_item", vec2(100, 0)); + shop_item_bubble.add_component<Sprite>( + Asset("asset/background/aquarium/bubble.png"), + Sprite::Data { + .sorting_in_layer = STARTING_SORTING_IN_LAYER + 1, + .size = {0, 100}, + .position_offset = {0, 0}, + } + ); + + const string BUBBLE_STRING = "BUBBLE"; + size + = {CHAR_SIZE * BUBBLE_STRING.size(), + (CHAR_SIZE * BUBBLE_STRING.size() / BUBBLE_STRING.size()) * 2}; + shop_item_bubble.add_component<Text>( + size, FONT, + Text::Data { + .world_space = true, + .text_color = Color::WHITE, + }, + vec2 {0, -75}, BUBBLE_STRING + ); + shop_item_bubble.add_component<Sprite>( + Asset("asset/ui/buttonCoinsSmall.png"), + Sprite::Data { + .sorting_in_layer = STARTING_SORTING_IN_LAYER + 1, + .size = {0, 45}, + .position_offset = {45, 75}, + } + ); + + const string BUBBLE_GOLD_STRING = "1000"; + size + = {CHAR_SIZE_COIN * BUBBLE_GOLD_STRING.size(), + (CHAR_SIZE_COIN * BUBBLE_GOLD_STRING.size() / BUBBLE_GOLD_STRING.size()) * 2}; + shop_item_bubble.add_component<Text>( + size, FONT, + Text::Data { + .world_space = true, + .text_color = Color::GOLD, + }, + vec2 {-10, 75}, BUBBLE_GOLD_STRING + ); + + button.create( + *this, + ButtonSubScene::Data { + .text = "BUY", + .text_width = 100, + .position = vec2(-100, 120), + .script_type = ButtonSubScene::ScriptSelect::SHOP_BULLET, + .button_type = ButtonSubScene::ButtonSelect::LARGE, + .scale = 0.4, + .tag = BUY_BULLET, + .sorting_layer_offset = 20, + .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE + + } + ); + + button.create( + *this, + ButtonSubScene::Data { + .text = "BUY", + .text_width = 100, + .position = vec2(100, 120), + .script_type = ButtonSubScene::ScriptSelect::SHOP_BUBBLE, + .button_type = ButtonSubScene::ButtonSelect::LARGE, + .scale = 0.4, + .tag = BUY_BUBBLE, + .sorting_layer_offset = 20, + .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE + } + ); + + button.create( + *this, + ButtonSubScene::Data { + .text = "SELECT", + .text_width = 100, + .position = vec2(-100, 120), + .script_type = ButtonSubScene::ScriptSelect::SHOP_BULLET, + .button_type = ButtonSubScene::ButtonSelect::LARGE, + .scale = 0.4, + .tag = SELECT_BULLET, + .sorting_layer_offset = 20, + .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE + } + ); + + button.create( + *this, + ButtonSubScene::Data { + .text = "SELECT", + .text_width = 100, + .position = vec2(100, 120), + .script_type = ButtonSubScene::ScriptSelect::SHOP_BUBBLE, + .button_type = ButtonSubScene::ButtonSelect::LARGE, + .scale = 0.4, + .tag = SELECT_BUBBLE, + .sorting_layer_offset = 20, + .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE + } + ); } string ShopMenuScene::get_name() const { return SHOP_SCENE; } diff --git a/game/menus/shop/Shopconfig.h b/game/menus/shop/Shopconfig.h new file mode 100644 index 0000000..a686242 --- /dev/null +++ b/game/menus/shop/Shopconfig.h @@ -0,0 +1,14 @@ +#pragma once +#include "api/Event.h" + +//tags +static constexpr const char * BUY_BULLET = "BUY_BULLET"; +static constexpr const char * SELECT_BULLET = "SELECT_BULLET"; +static constexpr const char * BUY_BUBBLE = "BUY_BUBBLE"; +static constexpr const char * SELECT_BUBBLE = "SELECT_BUBBLE"; + +//save_data +static constexpr const char * BUY_BULLET_SAVE = "BUY_BULLET_SAVE"; +static constexpr const char * BUY_BUBBLE_SAVE = "BUY_BUBBLE_SAVE"; + +struct ShopUpdate : public crepe::Event {}; |