From 2ebe1916a4d2334833606b7c4b60638ca78ccf3b Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Tue, 3 Dec 2024 15:29:05 +0100 Subject: [PATCH] - Treballant en el menu del joc --- main.cpp | 19 +++++++- ui_menu.cpp | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++ ui_menu.h | 14 ++++++ zx_screen.cpp | 11 ++++- zx_screen.h | 7 ++- 5 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 ui_menu.cpp create mode 100644 ui_menu.h diff --git a/main.cpp b/main.cpp index 7104ffe..819d97d 100644 --- a/main.cpp +++ b/main.cpp @@ -8,6 +8,8 @@ #include "zx_tape.h" #include #include +#include "ui.h" +#include "ui_menu.h" uint8_t memory[65536]; uint32_t time = 0; @@ -26,6 +28,16 @@ int main(int argc, char *argv[]) z80debug::init(); zxscreen::init(); + ui::menu::init(); + int menu = ui::menu::addsubmenu("FILE"); + ui::menu::addoption(menu, "LOAD TAPE", nullptr); + ui::menu::addoption(menu, "SAVE TAPE", nullptr); + ui::menu::addseparator(menu); + ui::menu::addoption(menu, "LOAD STATE", nullptr); + ui::menu::addoption(menu, "SAVE STATE", nullptr); + menu = ui::menu::addsubmenu("OPTIONS"); + ui::menu::addbooloption(menu, "BERSERK MODE", false, nullptr); + zx_ula::sound_init(); zx_tape::load("alien8.tap"); @@ -77,7 +89,7 @@ int main(int argc, char *argv[]) if (e.type == SDL_TEXTINPUT) { z80debug::sendToConsole(e.text.text); } - + } else if (z80debug::paused()) { if (e.type == SDL_KEYDOWN) { if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) { @@ -91,6 +103,7 @@ int main(int argc, char *argv[]) if (e.type == SDL_KEYDOWN) { if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) { z80debug::pause(); + ui::setrenderer(zxscreen::getrenderer()); zxscreen::redraw(); } else if (e.key.keysym.scancode==SDL_SCANCODE_F1) { zxscreen::decZoom(); @@ -141,6 +154,10 @@ int main(int argc, char *argv[]) time = SDL_GetTicks(); } } + } else if (z80debug::paused()) { + zxscreen::redraw(false); + ui::menu::show(); + zxscreen::present(); } } diff --git a/ui_menu.cpp b/ui_menu.cpp new file mode 100644 index 0000000..9b7a2eb --- /dev/null +++ b/ui_menu.cpp @@ -0,0 +1,130 @@ +#include "ui_menu.h" +#include "ui.h" +#include +#include +#include "zx_screen.h" + +namespace ui +{ + namespace menu + { + #define OPTION_TYPE_NORMAL 0 + #define OPTION_TYPE_SEPARATOR 1 + #define OPTION_TYPE_BOOLEAN 2 + + struct option_t + { + std::string label; + int type; + int value; + int (*callback)(int); + }; + + struct menu_t + { + std::string label; + SDL_Rect rect; + std::vector options; + }; + + std::vector menus; + int visible_menu = -1; + int menu_x = 0; + + void init() + { + // No se si hi ha algo que fer acĂ­... + } + + void show() + { + int mx, my; + Uint32 mb = SDL_GetMouseState(&mx, &my); + mx=mx/CHR_W; my=my/CHR_H; + ui::printrect(0, 0, 59, 1, COLOR_BLACK); + int opt_pos=1; + int index=0; + for (auto menu : menus) + { + const int text_size = (menu.label.size()+2); + uint8_t text_color = COLOR_WHITE; + if (my<1 && mx>=opt_pos && mx=menu_x && mx +#include namespace zxscreen { void init(); void reinit(); void refresh(const uint8_t dt); - void redraw(); + void redraw(const bool present=true); + void present(); void incZoom(); void decZoom(); void toggleFullscreen(); + + SDL_Renderer *getrenderer(); }