mirror of
https://github.com/Relintai/programming_tutorials.git
synced 2025-04-27 22:05:04 +02:00
135 lines
2.4 KiB
Plaintext
135 lines
2.4 KiB
Plaintext
|
|
|
|
#include <functional>
|
|
|
|
class Button {
|
|
public:
|
|
enum ButtonState {
|
|
BUTTON_STATE_UP,
|
|
BUTTON_STATE_HOVER,
|
|
BUTTON_STATE_DOWN,
|
|
BUTTON_STATE_OFF,
|
|
};
|
|
|
|
void event(const SDL_Event &ev);
|
|
void update(float delta);
|
|
void render();
|
|
|
|
//ver a: (Csak statikus fv állítható be rá)
|
|
std::function<void(void)> on_click;
|
|
|
|
//ver b: (Képes osztályok függvényeit is meghívni)
|
|
//Meg lehet oldani sokféleképp, egyik sem annyira szép sajnos
|
|
//mindneképp érdemes lenne setter mögé rejteni ezeket
|
|
void* cls;
|
|
std::function<void(void*)> on_click_member;
|
|
|
|
Button();
|
|
virtual ~Button();
|
|
|
|
ButtonState state;
|
|
|
|
Rect2 transform;
|
|
|
|
Sprite *up;
|
|
Sprite *down;
|
|
Sprite *hover;
|
|
Sprite *off;
|
|
};
|
|
|
|
|
|
#include "button.h"
|
|
|
|
#include "math.h"
|
|
|
|
void Button::event(const SDL_Event &ev) {
|
|
if (state == BUTTON_STATE_OFF) {
|
|
return;
|
|
}
|
|
|
|
switch (ev.type) {
|
|
case SDL_MOUSEMOTION: {
|
|
int x = ev.motion.x;
|
|
int y = ev.motion.y;
|
|
|
|
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y) {
|
|
state = BUTTON_STATE_HOVER;
|
|
} else {
|
|
state = BUTTON_STATE_UP;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case SDL_MOUSEBUTTONDOWN: {
|
|
int x = ev.motion.x;
|
|
int y = ev.motion.y;
|
|
|
|
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y) {
|
|
state = BUTTON_STATE_DOWN;
|
|
}
|
|
|
|
break;
|
|
}
|
|
case SDL_MOUSEBUTTONUP: {
|
|
int x = ev.motion.x;
|
|
int y = ev.motion.y;
|
|
|
|
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y) {
|
|
state = BUTTON_STATE_HOVER;
|
|
|
|
if (on_click) {
|
|
on_click();
|
|
}
|
|
|
|
if (on_click_member) {
|
|
on_click_member(cls);
|
|
}
|
|
} else {
|
|
state = BUTTON_STATE_UP;
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void Button::update(float delta) {
|
|
}
|
|
|
|
void Button::render() {
|
|
if (state == BUTTON_STATE_UP) {
|
|
if (up) {
|
|
up->set_transform(transform);
|
|
up->draw();
|
|
}
|
|
} else if (state == BUTTON_STATE_HOVER) {
|
|
if (hover) {
|
|
hover->set_transform(transform);
|
|
hover->draw();
|
|
}
|
|
} else if (state == BUTTON_STATE_DOWN) {
|
|
if (down) {
|
|
down->set_transform(transform);
|
|
down->draw();
|
|
}
|
|
} else if (state == BUTTON_STATE_OFF) {
|
|
if (off) {
|
|
off->set_transform(transform);
|
|
off->draw();
|
|
}
|
|
}
|
|
}
|
|
|
|
Button::Button() {
|
|
state = BUTTON_STATE_UP;
|
|
|
|
up = nullptr;
|
|
down = nullptr;
|
|
hover = nullptr;
|
|
off = nullptr;
|
|
}
|
|
|
|
Button::~Button() {
|
|
}
|
|
|