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
mario.cpp
blocks.cpp
gui/gui.cpp
)
list(APPEND SDLLibs
sdlpp)
if(WIN32)
list(APPEND CommonFiles
filesystem/windows/filesystem.cpp)
list(APPEND CommonFiles
../sdlpp/SDL2/SDL2_framerate.c
../sdlpp/SDL2/SDL2_gfxPrimitives.c
@ -51,6 +54,8 @@ if(WIN32)
SDL2_ttf_m
)
else()
list(APPEND CommonFiles
filesystem/unix/filesystem.cpp)
add_executable(mario)
add_executable(editor)
list(APPEND SDLLibs

View File

@ -1,4 +1,5 @@
#include "../sdlpp/sdlpp.hpp"
#include "gui/gui.hpp"
#include "sprites.hpp"
#ifdef _WIN32
#include "../sdlpp/SDL2/SDL2_framerate.h"
@ -56,6 +57,7 @@ struct MouseInfo {
SDLPP::Vec2D<int> edit_box;
SDLPP::Vec2D<int> tool_box;
ToolType::Value tool_type{};
const Button *cur_button{};
};
struct MapInfo {
@ -491,6 +493,7 @@ void getMousePositionFlags(SDLPP::Scene &scene) {
MouseVisitor visitor;
scene.visitCollisions(*mouse, visitor);
global_vars.mouse.cur_button = visitor.getCurButton();
global_vars.mouse.cur_flags = visitor.getFlags();
// + 1 because the left map arrow is on position 0
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,
ToolType::CHARACTER);
}
if(MouseVisitor::button(flags)) {
global_vars.mouse.cur_button->performFunction();
}
}
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
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PWSTR szCmdLine, int nCmdShow) {
#else
int main() {
#endif
int num = 0;
SDLPP::init();
SDLPP::Window w("Mario editor!");
w.setResizable(true);
@ -1125,6 +1137,10 @@ int main() {
updateToolSelection(0, ToolType::CHARACTER);
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();
int frames = 0;
std::thread inputThread(doInput, scene);
@ -1146,6 +1162,7 @@ int main() {
setFlag(UPDATE_FLAG);
while (!getFlag(QUIT_FLAG)) {
num = (num + 1) % 256;
SDL_framerateDelay(&gFPS);
SDL_PumpEvents();
std::lock_guard<std::mutex> lock(destruction_mutex);

View File

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

View File

@ -4,6 +4,7 @@
#include "../sdlpp/sdlpp_visitor.hpp"
#include "../sdlpp/sdlpp_geometry.hpp"
#include "blocks.hpp"
#include "gui/gui.hpp"
#include <memory>
struct VisitorType {
@ -46,6 +47,9 @@ public:
uint64_t getToolType() const {
return tool_box_type;
}
const Button *getCurButton() {
return cur_button;
}
static bool moveMapLeft(uint64_t flags);
static bool moveMapRight(uint64_t flags);
@ -55,6 +59,7 @@ public:
static bool moveModsRight(uint64_t flags);
static bool moveCharactersLeft(uint64_t flags);
static bool moveCharactersRight(uint64_t flags);
static bool button(uint64_t flags);
private:
uint64_t select_flags = 0;
@ -64,6 +69,7 @@ private:
SDLPP::Vec2D<int> tool_box_location = { -1, -1 };
uint64_t _type{};
uint64_t tool_box_type = 0;
const Button *cur_button;
};
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 "objectids.hpp"
#include "global_vars.hpp"
#include "filesystem.hpp"
#define TERRAIN_TYPE_HAS_ADDITIONAL 0x8
#define WIDE_TERRAIN_HAS_ADDITIONAL 0x8000
@ -101,13 +102,14 @@ void loadMap(std::shared_ptr<SDLPP::Scene> &scene,
std::shared_ptr<SDLPP::RenderObject> &mario,
const std::string &file, std::vector<mapColumnType> &objects,
bool editor, size_t editor_width) {
auto renderer = scene->getRendererShared();
std::ifstream map_file;
map_file.open(file, std::ios::in | std::ios::binary);
if(!map_file.is_open()) {
if(!FSLib::exists(file)) {
// create empty array large enough for initial editor window
objects.resize(editor_width);
return;
}
auto renderer = scene->getRendererShared();
std::ifstream map_file;
map_file.open(file, std::ios::in | std::ios::binary);
uint16_t version;
map_file.read((char *)&version, sizeof(uint16_t) / sizeof(char));
switch(version) {

View File

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