#include 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 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 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() { }