Mario: add basic main menu to editor, separate scenes from main game loop
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
This commit is contained in:
parent
c59851b490
commit
92ffac0edf
@ -89,6 +89,8 @@ target_sources(editor
|
||||
PRIVATE edit_box.cpp
|
||||
PRIVATE tool_box.cpp
|
||||
PRIVATE editor_visitor.cpp
|
||||
PRIVATE scenes/editor_main.cpp
|
||||
PRIVATE scenes/editor_main_menu.cpp
|
||||
)
|
||||
|
||||
target_compile_definitions(editor PUBLIC EDITOR)
|
||||
|
1331
mario/editor.cpp
1331
mario/editor.cpp
File diff suppressed because it is too large
Load Diff
@ -10,3 +10,4 @@ std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture{};
|
||||
std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
||||
std::shared_ptr<SDLPP::Scene> g_playground{};
|
||||
std::shared_ptr<SDLPP::FontConfiguration> g_text_config{};
|
||||
bool g_quit = false;
|
||||
|
@ -12,5 +12,6 @@ extern std::shared_ptr<SDLPP::Texture> g_translucent_mod_texture;
|
||||
extern std::shared_ptr<SDLPP::Texture> g_translucent_enemies_texture;
|
||||
extern std::shared_ptr<SDLPP::Scene> g_playground;
|
||||
extern std::shared_ptr<SDLPP::FontConfiguration> g_text_config;
|
||||
extern bool g_quit;
|
||||
|
||||
#endif
|
||||
|
1218
mario/scenes/editor_main.cpp
Normal file
1218
mario/scenes/editor_main.cpp
Normal file
File diff suppressed because it is too large
Load Diff
177
mario/scenes/editor_main_menu.cpp
Normal file
177
mario/scenes/editor_main_menu.cpp
Normal file
@ -0,0 +1,177 @@
|
||||
#include "editor_scenes.hpp"
|
||||
#include "../../sdlpp/sdlpp.hpp"
|
||||
#include "../../sdlpp/sdlpp_mouse.hpp"
|
||||
#include "../global_vars.hpp"
|
||||
#include "../objectids.hpp"
|
||||
#include "../editor_visitor.hpp"
|
||||
|
||||
bool __update_scenes_main_menu = false;
|
||||
bool __quit_scenes_main_menu = false;
|
||||
bool __started_main_menu = false;
|
||||
uint64_t __cur_button_index_main_menu = -1;
|
||||
uint64_t __cur_button_index_main_menu_down = -1;
|
||||
std::vector<std::shared_ptr<Button>> __buttons_main_menu{};
|
||||
std::shared_ptr<SDLPP::RectangleRender> __mouse_main_menu{};
|
||||
|
||||
void quitMainMenu() {
|
||||
g_quit = true;
|
||||
}
|
||||
|
||||
void resumeMainMenu() {
|
||||
__quit_scenes_main_menu = true;
|
||||
}
|
||||
|
||||
void quitMainMenuCallback(void */*UNUSED*/, Button */*UNUSED*/) {
|
||||
quitMainMenu();
|
||||
}
|
||||
|
||||
void resumeMainMenuCallback(void */*UNUSED*/, Button */*UNUSED*/) {
|
||||
resumeMainMenu();
|
||||
}
|
||||
|
||||
void resetGlobals() {
|
||||
__update_scenes_main_menu = false;
|
||||
__quit_scenes_main_menu = false;
|
||||
__cur_button_index_main_menu = -1;
|
||||
__cur_button_index_main_menu_down = -1;
|
||||
__mouse_main_menu->setPos(0, 0);
|
||||
for(auto &button : __buttons_main_menu) {
|
||||
button->unsetHighlight();
|
||||
}
|
||||
}
|
||||
|
||||
void handleKeyUpMainMenu(SDL_Keycode key, SDLPP::Scene &/*UNUSED*/) {
|
||||
switch (key) {
|
||||
case SDLK_ESCAPE:
|
||||
resumeMainMenu();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
std::shared_ptr<SDLPP::Scene> createSceneMainMenu(std::shared_ptr<SDLPP::Renderer> &renderer) {
|
||||
auto scene = std::make_shared<SDLPP::Scene>(renderer);
|
||||
auto bg = std::make_shared<SDLPP::RectangleRender>(
|
||||
0, 0, 10, 10, renderer, "#00000088", true);
|
||||
bg->setPermanent();
|
||||
bg->setId(1);
|
||||
scene->addObject(bg);
|
||||
__mouse_main_menu =
|
||||
std::make_shared<SDLPP::RectangleRender>(0.01, 0.01, 0, 0, renderer);
|
||||
__mouse_main_menu->setMinWidth(1);
|
||||
__mouse_main_menu->setMinHeight(1);
|
||||
__mouse_main_menu->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
||||
__mouse_main_menu->setId(EDITOR_MOUSE_ID);
|
||||
__mouse_main_menu->setColiderColor("#00FF00");
|
||||
__mouse_main_menu->addCollision(SDLPP::RectColider({ 0, 0 }, { 1, 1 }));
|
||||
scene->addObject(__mouse_main_menu);
|
||||
|
||||
ButtonConfig default_button_theme{};
|
||||
default_button_theme.bg_color = "#FFFFFF88";
|
||||
default_button_theme.bg_color_highlight = "#FFFFFFBB";
|
||||
default_button_theme.bg_color_disabled = "#AAAAAA88";
|
||||
default_button_theme.font_color = "#000000";
|
||||
default_button_theme.font_color_highlight = "#000000";
|
||||
default_button_theme.font_color_disabled = "#555555";
|
||||
default_button_theme.font_outline_color = "#FFFFFF88";
|
||||
default_button_theme.font_outline_color_highlight = "#FFFFFFAA";
|
||||
default_button_theme.font_outline_color_disabled = "#787878";
|
||||
default_button_theme.outline = 0.1;
|
||||
// buttons
|
||||
__buttons_main_menu.emplace_back(std::make_shared<Button>(
|
||||
0.2, 0.3, 0.6, 0.1,
|
||||
renderer, "RESUME", default_button_theme, resumeMainMenuCallback, nullptr));
|
||||
__buttons_main_menu.back()->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
||||
__buttons_main_menu.back()->setPermanent();
|
||||
__buttons_main_menu.back()->setButtonIndex(__buttons_main_menu.size() - 1);
|
||||
__buttons_main_menu.emplace_back(std::make_shared<Button>(
|
||||
0.2, 0.45, 0.6, 0.1,
|
||||
renderer, "QUIT", default_button_theme, quitMainMenuCallback, nullptr));
|
||||
__buttons_main_menu.back()->setAlignment(SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER);
|
||||
__buttons_main_menu.back()->setPermanent();
|
||||
__buttons_main_menu.back()->setButtonIndex(__buttons_main_menu.size() - 1);
|
||||
for(auto &button : __buttons_main_menu) {
|
||||
scene->addObject(button);
|
||||
}
|
||||
return scene;
|
||||
}
|
||||
|
||||
void additionalRenderMainMenu(std::shared_ptr<SDLPP::Scene> &/*UNUSED*/) {
|
||||
if (__update_scenes_main_menu) {
|
||||
for(auto &_scene : game_scenes) {
|
||||
_scene.scene->updateSizeAndPosition();
|
||||
}
|
||||
if (__started_main_menu) {
|
||||
__update_scenes_main_menu = false;
|
||||
} else {
|
||||
__started_main_menu = true;
|
||||
}
|
||||
}
|
||||
if (__quit_scenes_main_menu) {
|
||||
game_scenes.pop_back();
|
||||
resetGlobals();
|
||||
}
|
||||
}
|
||||
|
||||
void getMousePositionFlagsMainMenu(SDLPP::Scene &scene) {
|
||||
auto mouse = scene.getObjects({ EDITOR_MOUSE_ID })[0];
|
||||
// move mouse colider to mouse position
|
||||
mouse->setPos(SDLPP::Mouse::getMousePositionDouble(
|
||||
scene.getRenderer(), SDLPP::OBJ_CENTER, SDLPP::OBJ_CENTER));
|
||||
|
||||
MouseVisitor visitor;
|
||||
scene.visitCollisions(*mouse, visitor);
|
||||
if(visitor.getCurButton() != __cur_button_index_main_menu) {
|
||||
if(__cur_button_index_main_menu != (uint64_t)-1) {
|
||||
__buttons_main_menu[__cur_button_index_main_menu]->unsetHighlight();
|
||||
}
|
||||
if(visitor.getCurButton() != (uint64_t)-1) {
|
||||
__buttons_main_menu[visitor.getCurButton()]->setHighlight();
|
||||
}
|
||||
}
|
||||
__cur_button_index_main_menu = visitor.getCurButton();
|
||||
}
|
||||
|
||||
void pollEventsMainMenu(std::shared_ptr<SDLPP::Scene> &scene) {
|
||||
SDL_Event event;
|
||||
while (SDLPP::getSDLEvent(event)) {
|
||||
switch (event.type) {
|
||||
case SDL_QUIT:
|
||||
quitMainMenu();
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
handleKeyUpMainMenu(event.key.keysym.sym, *scene);
|
||||
break;
|
||||
case SDL_WINDOWEVENT:
|
||||
if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
||||
__update_scenes_main_menu = true;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
getMousePositionFlagsMainMenu(*scene);
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
if (__cur_button_index_main_menu_down == __cur_button_index_main_menu &&
|
||||
__cur_button_index_main_menu != (uint64_t)-1) {
|
||||
__buttons_main_menu[__cur_button_index_main_menu]->performFunction();
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
// store current mouse flags in previous mouse flags
|
||||
__cur_button_index_main_menu_down = __cur_button_index_main_menu;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SceneStruct createEditorMainMenuScene(std::shared_ptr<SDLPP::Renderer> &renderer) {
|
||||
SceneStruct ret{};
|
||||
ret.scene = createSceneMainMenu(renderer);
|
||||
ret.additionalRender = additionalRenderMainMenu;
|
||||
ret.doInput = pollEventsMainMenu;
|
||||
__update_scenes_main_menu = true;
|
||||
return ret;
|
||||
}
|
20
mario/scenes/editor_scenes.hpp
Normal file
20
mario/scenes/editor_scenes.hpp
Normal file
@ -0,0 +1,20 @@
|
||||
#ifndef EDITOR_MAIN_HPP
|
||||
#define EDITOR_MAIN_HPP
|
||||
|
||||
#include "../../sdlpp/sdlpp_scene.hpp"
|
||||
#include <functional>
|
||||
|
||||
struct SceneStruct {
|
||||
std::shared_ptr<SDLPP::Scene> scene;
|
||||
std::function<void(std::shared_ptr<SDLPP::Scene>&)> doInput;
|
||||
std::function<void(std::shared_ptr<SDLPP::Scene>&)> additionalRender;
|
||||
};
|
||||
|
||||
extern std::mutex render_mutex;
|
||||
extern std::vector<SceneStruct> game_scenes;
|
||||
|
||||
SceneStruct createEditorScene(std::shared_ptr<SDLPP::Renderer> &renderer);
|
||||
SceneStruct createEditorMainMenuScene(std::shared_ptr<SDLPP::Renderer> &renderer);
|
||||
SceneStruct createEditorFileChoiceScene(std::shared_ptr<SDLPP::Renderer> &renderer);
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user