Added generic button
Some checks reported errors
continuous-integration/drone/push Build encountered an error

This commit is contained in:
zv0n 2022-06-21 14:52:36 +02:00
parent a3a1e900b5
commit 2402567330
8 changed files with 100 additions and 4 deletions

View File

@ -22,12 +22,15 @@ list(APPEND CommonFiles
blocks/simpleblocks.cpp blocks/simpleblocks.cpp
mario.cpp mario.cpp
blocks.cpp blocks.cpp
gui/gui.cpp
) )
list(APPEND SDLLibs list(APPEND SDLLibs
sdlpp) sdlpp)
if(WIN32) if(WIN32)
list(APPEND CommonFiles
filesystem/windows/filesystem.cpp)
list(APPEND CommonFiles list(APPEND CommonFiles
../sdlpp/SDL2/SDL2_framerate.c ../sdlpp/SDL2/SDL2_framerate.c
../sdlpp/SDL2/SDL2_gfxPrimitives.c ../sdlpp/SDL2/SDL2_gfxPrimitives.c
@ -51,6 +54,8 @@ if(WIN32)
SDL2_ttf_m SDL2_ttf_m
) )
else() else()
list(APPEND CommonFiles
filesystem/unix/filesystem.cpp)
add_executable(mario) add_executable(mario)
add_executable(editor) add_executable(editor)
list(APPEND SDLLibs list(APPEND SDLLibs

View File

@ -1,4 +1,5 @@
#include "../sdlpp/sdlpp.hpp" #include "../sdlpp/sdlpp.hpp"
#include "gui/gui.hpp"
#include "sprites.hpp" #include "sprites.hpp"
#ifdef _WIN32 #ifdef _WIN32
#include "../sdlpp/SDL2/SDL2_framerate.h" #include "../sdlpp/SDL2/SDL2_framerate.h"
@ -56,6 +57,7 @@ struct MouseInfo {
SDLPP::Vec2D<int> edit_box; SDLPP::Vec2D<int> edit_box;
SDLPP::Vec2D<int> tool_box; SDLPP::Vec2D<int> tool_box;
ToolType::Value tool_type{}; ToolType::Value tool_type{};
const Button *cur_button{};
}; };
struct MapInfo { struct MapInfo {
@ -491,6 +493,7 @@ void getMousePositionFlags(SDLPP::Scene &scene) {
MouseVisitor visitor; MouseVisitor visitor;
scene.visitCollisions(*mouse, visitor); scene.visitCollisions(*mouse, visitor);
global_vars.mouse.cur_button = visitor.getCurButton();
global_vars.mouse.cur_flags = visitor.getFlags(); global_vars.mouse.cur_flags = visitor.getFlags();
// + 1 because the left map arrow is on position 0 // + 1 because the left map arrow is on position 0
global_vars.mouse.edit_box = global_vars.mouse.edit_box =
@ -556,6 +559,9 @@ void mouseUpAction(uint64_t flags, SDLPP::Scene &scene) {
updateToolSelection(global_vars.tool.cur_page_characters - 1, updateToolSelection(global_vars.tool.cur_page_characters - 1,
ToolType::CHARACTER); ToolType::CHARACTER);
} }
if(MouseVisitor::button(flags)) {
global_vars.mouse.cur_button->performFunction();
}
} }
SDLPP::Vec2D<int> getSelectedObjectIndexes() { SDLPP::Vec2D<int> getSelectedObjectIndexes() {
@ -948,12 +954,18 @@ void checkArrowsEnabled(uint64_t cur_page, uint64_t max_page,
} }
} }
void testButtonFunc(void *input) {
auto actual = static_cast<int*>(input);
std::cout << "NUM: " << *actual << std::endl;
}
#ifdef _WIN32 #ifdef _WIN32
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR szCmdLine, int nCmdShow) { PWSTR szCmdLine, int nCmdShow) {
#else #else
int main() { int main() {
#endif #endif
int num = 0;
SDLPP::init(); SDLPP::init();
SDLPP::Window w("Mario editor!"); SDLPP::Window w("Mario editor!");
w.setResizable(true); w.setResizable(true);
@ -1125,6 +1137,10 @@ int main() {
updateToolSelection(0, ToolType::CHARACTER); updateToolSelection(0, ToolType::CHARACTER);
setToolColor(); setToolColor();
auto button = createButton(0, 0, 0.2, 0.2, renderer, "CLICK ME", "#FFFFFF", "#000000", "#FF0088", testButtonFunc, &num);
button->setStatic();
scene->addObject(button);
auto base = SDL_GetTicks(); auto base = SDL_GetTicks();
int frames = 0; int frames = 0;
std::thread inputThread(doInput, scene); std::thread inputThread(doInput, scene);
@ -1146,6 +1162,7 @@ int main() {
setFlag(UPDATE_FLAG); setFlag(UPDATE_FLAG);
while (!getFlag(QUIT_FLAG)) { while (!getFlag(QUIT_FLAG)) {
num = (num + 1) % 256;
SDL_framerateDelay(&gFPS); SDL_framerateDelay(&gFPS);
SDL_PumpEvents(); SDL_PumpEvents();
std::lock_guard<std::mutex> lock(destruction_mutex); std::lock_guard<std::mutex> lock(destruction_mutex);

View File

@ -4,6 +4,7 @@
#include "objectids.hpp" #include "objectids.hpp"
#include "edit_box.hpp" #include "edit_box.hpp"
#include "tool_box.hpp" #include "tool_box.hpp"
#include <memory>
#define SELECTED_LEFT_MAP 0x00000001 #define SELECTED_LEFT_MAP 0x00000001
#define SELECTED_RIGHT_MAP 0x00000002 #define SELECTED_RIGHT_MAP 0x00000002
@ -15,6 +16,7 @@
#define SELECTED_LEFT_MOD 0x00000080 #define SELECTED_LEFT_MOD 0x00000080
#define SELECTED_RIGHT_CHARACTER 0x00000100 #define SELECTED_RIGHT_CHARACTER 0x00000100
#define SELECTED_LEFT_CHARACTER 0x00000200 #define SELECTED_LEFT_CHARACTER 0x00000200
#define SELECTED_BUTTON 0x00000400
void MouseVisitor::visit(const SDLPP::RenderObject &obj) { void MouseVisitor::visit(const SDLPP::RenderObject &obj) {
auto id = obj.getId(); auto id = obj.getId();
@ -52,6 +54,10 @@ void MouseVisitor::visit(const SDLPP::RenderObject &obj) {
tool_box_location = dynamic_cast<const ToolBox &>(obj).getIndexes(); tool_box_location = dynamic_cast<const ToolBox &>(obj).getIndexes();
tool_box_type = dynamic_cast<const ToolBox &>(obj).getType(); tool_box_type = dynamic_cast<const ToolBox &>(obj).getType();
break; break;
case BUTTON_ID:
select_flags |= SELECTED_BUTTON;
cur_button = reinterpret_cast<const Button*>(&obj);
break;
default: default:
break; break;
} }
@ -88,6 +94,9 @@ bool MouseVisitor::moveCharactersLeft(uint64_t flags) {
bool MouseVisitor::moveCharactersRight(uint64_t flags) { bool MouseVisitor::moveCharactersRight(uint64_t flags) {
return flags & SELECTED_RIGHT_CHARACTER; return flags & SELECTED_RIGHT_CHARACTER;
} }
bool MouseVisitor::button(uint64_t flags) {
return flags & SELECTED_BUTTON;
}
void ToolVisitor::visit(const SDLPP::RenderObject &obj) { void ToolVisitor::visit(const SDLPP::RenderObject &obj) {
auto id = obj.getCollisions()[0]->getId(); auto id = obj.getCollisions()[0]->getId();

View File

@ -4,6 +4,7 @@
#include "../sdlpp/sdlpp_visitor.hpp" #include "../sdlpp/sdlpp_visitor.hpp"
#include "../sdlpp/sdlpp_geometry.hpp" #include "../sdlpp/sdlpp_geometry.hpp"
#include "blocks.hpp" #include "blocks.hpp"
#include "gui/gui.hpp"
#include <memory> #include <memory>
struct VisitorType { struct VisitorType {
@ -46,6 +47,9 @@ public:
uint64_t getToolType() const { uint64_t getToolType() const {
return tool_box_type; return tool_box_type;
} }
const Button *getCurButton() {
return cur_button;
}
static bool moveMapLeft(uint64_t flags); static bool moveMapLeft(uint64_t flags);
static bool moveMapRight(uint64_t flags); static bool moveMapRight(uint64_t flags);
@ -55,6 +59,7 @@ public:
static bool moveModsRight(uint64_t flags); static bool moveModsRight(uint64_t flags);
static bool moveCharactersLeft(uint64_t flags); static bool moveCharactersLeft(uint64_t flags);
static bool moveCharactersRight(uint64_t flags); static bool moveCharactersRight(uint64_t flags);
static bool button(uint64_t flags);
private: private:
uint64_t select_flags = 0; uint64_t select_flags = 0;
@ -64,6 +69,7 @@ private:
SDLPP::Vec2D<int> tool_box_location = { -1, -1 }; SDLPP::Vec2D<int> tool_box_location = { -1, -1 };
uint64_t _type{}; uint64_t _type{};
uint64_t tool_box_type = 0; uint64_t tool_box_type = 0;
const Button *cur_button;
}; };
class ToolVisitor : public SDLPP::Visitor { class ToolVisitor : public SDLPP::Visitor {

12
mario/gui/gui.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "gui.hpp"
std::shared_ptr<SDLPP::RectangleRender>
createButton(double x, double y, double w, double h,
std::shared_ptr<SDLPP::Renderer> &r, const std::string &text,
const std::string &color, const std::string &outline_color,
const std::string &background_color,
std::function<void(void *)> click_fun, void *input) {
auto button = std::make_shared<Button>(
x, y, w, h, r, text, color, outline_color, background_color, click_fun, input);
return std::static_pointer_cast<SDLPP::RectangleRender>(button);
}

42
mario/gui/gui.hpp Normal file
View File

@ -0,0 +1,42 @@
#ifndef GUIELEMENTS
#define GUIELEMENTS
#include "../../sdlpp/sdlpp.hpp"
#include "../global_vars.hpp"
#include "../objectids.hpp"
class Button : public SDLPP::TextRenderer {
public:
Button() = delete;
Button(double x, double y, double w, double h,
std::shared_ptr<SDLPP::Renderer> &r, const std::string &text,
const std::string &color, const std::string &outline_color,
const std::string &background_color,
std::function<void(void *)> click_fun, void *input)
: TextRenderer(x, y, w, h, r, g_text_config->getFont(), text, color,
outline_color, 0.2),
click_fun(click_fun), func_input(input) {
setColor(background_color);
setId(BUTTON_ID);
addCollision(SDLPP::RectColider(0, 0, 1, 1));
}
void setBackgroundColor(const std::string &color) {
setColor(color);
}
void performFunction() const {
click_fun(func_input);
}
// TODO highlight visit
private:
std::function<void(void *)> click_fun;
void *func_input;
};
std::shared_ptr<SDLPP::RectangleRender>
createButton(double x, double y, double w, double h,
std::shared_ptr<SDLPP::Renderer> &r, const std::string &text,
const std::string &color, const std::string &outline_color,
const std::string &background_color,
std::function<void(void *)> click_fun, void *input);
#endif

View File

@ -6,6 +6,7 @@
#include "blocks.hpp" #include "blocks.hpp"
#include "objectids.hpp" #include "objectids.hpp"
#include "global_vars.hpp" #include "global_vars.hpp"
#include "filesystem.hpp"
#define TERRAIN_TYPE_HAS_ADDITIONAL 0x8 #define TERRAIN_TYPE_HAS_ADDITIONAL 0x8
#define WIDE_TERRAIN_HAS_ADDITIONAL 0x8000 #define WIDE_TERRAIN_HAS_ADDITIONAL 0x8000
@ -101,13 +102,14 @@ void loadMap(std::shared_ptr<SDLPP::Scene> &scene,
std::shared_ptr<SDLPP::RenderObject> &mario, std::shared_ptr<SDLPP::RenderObject> &mario,
const std::string &file, std::vector<mapColumnType> &objects, const std::string &file, std::vector<mapColumnType> &objects,
bool editor, size_t editor_width) { bool editor, size_t editor_width) {
auto renderer = scene->getRendererShared(); if(!FSLib::exists(file)) {
std::ifstream map_file; // create empty array large enough for initial editor window
map_file.open(file, std::ios::in | std::ios::binary);
if(!map_file.is_open()) {
objects.resize(editor_width); objects.resize(editor_width);
return; return;
} }
auto renderer = scene->getRendererShared();
std::ifstream map_file;
map_file.open(file, std::ios::in | std::ios::binary);
uint16_t version; uint16_t version;
map_file.read((char *)&version, sizeof(uint16_t) / sizeof(char)); map_file.read((char *)&version, sizeof(uint16_t) / sizeof(char));
switch(version) { switch(version) {

View File

@ -90,6 +90,9 @@
#define NPC_RIGHT_SIDE_DETECT 0x200A #define NPC_RIGHT_SIDE_DETECT 0x200A
#define NPC_TOP_DETECT 0x200B #define NPC_TOP_DETECT 0x200B
// GUI
#define BUTTON_ID 0xA000
#define EDITOR_EDIT_SQUARE 0xF001 #define EDITOR_EDIT_SQUARE 0xF001
#define EDITOR_MOUSE_ID 0xF002 #define EDITOR_MOUSE_ID 0xF002
#define EDITOR_LEFT_MAP_ID 0xF003 #define EDITOR_LEFT_MAP_ID 0xF003