From b71371f0e1c8489bb33e4f288887a01174baab94 Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 9 Apr 2021 18:39:03 +0200 Subject: [PATCH] Created the UML diagrams, and started cleaning up the code in the new txts. --- 21_sdl_scene.txt | 20 +-- 22_sdl_application.txt | 141 +++++++++---------- 23_sdl_button/main_scene.cpp | 5 +- 23_sdl_main.txt | 20 +-- 24_sdl_main_scene.txt | 105 +++++++------- 25_sdl_input_app.txt | 189 ++++++++++++------------- 26_sdl_button.txt | 261 +++++++++++++++++++++-------------- 27_sdl_button_app.txt | 42 +++--- 8 files changed, 424 insertions(+), 359 deletions(-) diff --git a/21_sdl_scene.txt b/21_sdl_scene.txt index fc47002..5f4f2b2 100644 --- a/21_sdl_scene.txt +++ b/21_sdl_scene.txt @@ -1,10 +1,14 @@ -class Scene { -public: - virtual void event(const SDL_Event &ev) = 0; - virtual void update(float delta) = 0; - virtual void render() = 0; - Scene(); - virtual ~Scene(); -}; +|---------------------------------------------------------------------------------------| +| class Scene | +|---------------------------------------------------------------------------------------| +| + virtual void event(const SDL_Event &ev) = 0 | +| + virtual void update(float delta) = 0 | +| + virtual void render() = 0 | +| | +| + Scene() | +| + virtual ~Scene() | +|---------------------------------------------------------------------------------------| + + diff --git a/22_sdl_application.txt b/22_sdl_application.txt index 2dc08b5..482f9db 100644 --- a/22_sdl_application.txt +++ b/22_sdl_application.txt @@ -1,95 +1,96 @@ -class Application { -public: - bool running; - int target_fps; - virtual void event(const SDL_Event ¤t_event); - virtual void update(float delta); - virtual void render(); - - void main_loop(); - - Application(); - virtual ~Application(); - - Scene *scene; - - static Application* get_singleton(); - - double frame_delta = 0; - -protected: - static Application* _instance; -}; +|---------------------------------------------------------------------------------------| +| class Application | +|---------------------------------------------------------------------------------------| +| + bool running | +| + int target_fps | +| | +| + virtual void event(const SDL_Event ¤t_event) | +| + virtual void update(float delta) | +| + virtual void render() | +| | +| + void main_loop() | +| | +| + Application() | +| + virtual ~Application() | +| | +| + Scene *scene | +| | +| + static Application* get_singleton() | +| | +| + double frame_delta = 0 | +| | +| # static Application* _instance | +|---------------------------------------------------------------------------------------| -Application* Application::_instance = nullptr; +Application* Application::_instance = nullptr #include -void Application::event(const SDL_Event ¤t_event) { - switch (current_event.type) { +void Application::event(const SDL_Event ¤t_event): + switch (current_event.type): case SDL_QUIT: - running = false; - break; - } + running = false + break + - scene->event(current_event); -} + scene->event(current_event) -void Application::update(float delta) { - scene->update(delta); -} -void Application::render() { - scene->render(); - Renderer::get_singleton()->present(); -} +void Application::update(float delta): + scene->update(delta) -void Application::main_loop() { - std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now(); +void Application::render(): + scene->render() + + Renderer::get_singleton()->present() + + +void Application::main_loop(): + std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now() //handle input - SDL_Event current_event; - while (SDL_PollEvent(¤t_event)) { - event(current_event); - } + SDL_Event current_event + while (SDL_PollEvent(¤t_event)): + event(current_event) + - update(frame_delta); - render(); + update(frame_delta) + render() - std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now(); - std::chrono::duration elapsed_seconds = end - start; - double t = elapsed_seconds.count(); + std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now() + std::chrono::duration elapsed_seconds = end - start + double t = elapsed_seconds.count() - double tfps = 1.0 / static_cast(target_fps); + double tfps = 1.0 / static_cast(target_fps) - double remaining = tfps - t; + double remaining = tfps - t - if (remaining > 0) { - Uint32 fms = static_cast(remaining * 1000.0); + if (remaining > 0): + Uint32 fms = static_cast(remaining * 1000.0) - frame_delta = tfps; + frame_delta = tfps - SDL_Delay(fms); - } else { - frame_delta = t; - } -} + SDL_Delay(fms) + else: + frame_delta = t + -Application::Application() { - running = true; - target_fps = 60; - scene = nullptr; - _instance = this; -} -Application::~Application() { - _instance = nullptr; -} +Application::Application(): + running = true + target_fps = 60 + + scene = nullptr + _instance = this + +Application::~Application(): + _instance = nullptr + + +Application* Application::get_singleton(): + return _instance -Application* Application::get_singleton() { - return _instance; -} diff --git a/23_sdl_button/main_scene.cpp b/23_sdl_button/main_scene.cpp index 4d794a5..a96528b 100644 --- a/23_sdl_button/main_scene.cpp +++ b/23_sdl_button/main_scene.cpp @@ -49,7 +49,10 @@ MainScene::MainScene() { b1->up = new Sprite(_texture); b1->down = new Sprite(_texture, Color(100, 100, 100)); b1->hover = new Sprite(_texture, Color(200, 200, 200)); - b1->on_click = MainScene::on_first_button_clicked; + + //b1->on_click = MainScene::on_first_button_clicked; + + b1->on_click = []() -> void { printf("Click lambda!"); }; b2 = new Button(); b2->transform = Rect2(0, 110, 100, 100); diff --git a/23_sdl_main.txt b/23_sdl_main.txt index e8ed12a..5931b41 100644 --- a/23_sdl_main.txt +++ b/23_sdl_main.txt @@ -8,19 +8,19 @@ Renderer *renderer = nullptr; Application *application = nullptr; -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]): renderer = new Renderer(); application = new ImplApplication(); - while (application->running) { + while (application->running): application->main_loop(); - } + delete application; delete renderer; return 0; -} + @@ -40,24 +40,24 @@ int main(int argc, char *argv[]) { Renderer *renderer = nullptr; Application *application = nullptr; -void handle_frame() { +void handle_frame(): application->main_loop(); -} -int main(int argc, char *argv[]) { + +int main(int argc, char *argv[]): renderer = new Renderer(); application = new APPLICATION_CLASS(); #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(handle_frame, 0, 1); #else - while (application->running) { + while (application->running): application->main_loop(); - } + #endif delete application; delete renderer; return 0; -} + diff --git a/24_sdl_main_scene.txt b/24_sdl_main_scene.txt index c25b50c..543993d 100644 --- a/24_sdl_main_scene.txt +++ b/24_sdl_main_scene.txt @@ -1,20 +1,21 @@ -class MainScene : public Scene { -public: - void event(const SDL_Event &ev); - void update(float delta); - void render(); - - MainScene(); - ~MainScene(); - - Camera *_camera; - Image *_image; - Texture *_texture; - Sprite *_sprite; - int _dir; -}; +|---------------------------------------------------------------------------------------| +| class MainScene : public Scene | +|---------------------------------------------------------------------------------------| +| + void event(const SDL_Event &ev) | +| + void update(float delta) | +| + void render() | +| | +| + MainScene() | +| + ~MainScene() | +| | +| + Camera *_camera | +| + Image *_image | +| + Texture *_texture | +| + Sprite *_sprite | +| + int _dir | +|---------------------------------------------------------------------------------------| #include "main_scene.h" @@ -22,48 +23,48 @@ public: #include "renderer.h" -void MainScene::event(const SDL_Event &ev) { -} +void MainScene::event(const SDL_Event &ev): -void MainScene::update(float delta) { -} -void MainScene::render() { - Renderer::get_singleton()->clear(); +void MainScene::update(float delta): - _camera->viewport.x += _dir; + +void MainScene::render(): + Renderer::get_singleton()->clear() + + _camera->viewport.x += _dir if (_camera->viewport.x <= -100) - _dir = 1; + _dir = 1 else if (_camera->viewport.x >= 100) - _dir = -1; + _dir = -1 - _camera->bind(); + _camera->bind() - _sprite->draw(); -} + _sprite->draw() -MainScene::MainScene() { - _camera = new Camera(); - _image = new Image("ti.bmp"); - _texture = new Texture(_image); - _sprite = new Sprite(_texture); - _sprite->set_x(30); - _sprite->set_y(30); +MainScene::MainScene(): + _camera = new Camera() + _image = new Image("ti.bmp") + _texture = new Texture(_image) + _sprite = new Sprite(_texture) - _dir = 1; -} + _sprite->set_x(30) + _sprite->set_y(30) -MainScene::~MainScene() { - _texture->free(); - _image->free(); + _dir = 1 + + +MainScene::~MainScene(): + _texture->free() + _image->free() + + delete _sprite + delete _texture + delete _image + delete _camera - delete _sprite; - delete _texture; - delete _image; - delete _camera; -} @@ -77,14 +78,14 @@ MainScene::~MainScene() { #include "main_scene.h" -class ImplApplication : public Application { +class ImplApplication : public Application: public: - ImplApplication() : Application() { - scene = new MainScene(); - } - ~ImplApplication() { - delete scene; - } -}; + ImplApplication() : Application(): + scene = new MainScene() + + ~ImplApplication(): + delete scene + + #endif \ No newline at end of file diff --git a/25_sdl_input_app.txt b/25_sdl_input_app.txt index c8c6cd9..dec0ec1 100644 --- a/25_sdl_input_app.txt +++ b/25_sdl_input_app.txt @@ -1,22 +1,25 @@ -class MainScene : public Scene { -public: - void event(const SDL_Event &ev); - void update(float delta); - void render(); - MainScene(); - ~MainScene(); - Camera *_camera; - Image *_image; - Texture *_texture; - Sprite *_sprite; - - bool _up; - bool _down; - bool _left; - bool _right; -}; +|---------------------------------------------------------------------------------------| +| class MainScene : public Scene | +|---------------------------------------------------------------------------------------| +| + void event(const SDL_Event &ev) | +| + void update(float delta) | +| + void render() | +| | +| + MainScene() | +| + ~MainScene() | +| | +| + Camera *_camera | +| + Image *_image | +| + Texture *_texture | +| + Sprite *_sprite | +| | +| + bool _up | +| + bool _down | +| + bool _left | +| + bool _right | +|---------------------------------------------------------------------------------------| #include "main_scene.h" @@ -26,97 +29,97 @@ public: #include -void MainScene::event(const SDL_Event &ev) { - switch (ev.type) { - case SDL_WINDOWEVENT: { - switch (ev.window.event) { - case SDL_WINDOWEVENT_SIZE_CHANGED: { - int width = ev.window.data1; - int height = ev.window.data2; +void MainScene::event(const SDL_Event &ev): + switch (ev.type): + case SDL_WINDOWEVENT:: + switch (ev.window.event): + case SDL_WINDOWEVENT_SIZE_CHANGED:: + int width = ev.window.data1 + int height = ev.window.data2 - _camera->viewport = Rect2(0, 0, width, height); + _camera->viewport = Rect2(0, 0, width, height) - break; - } - } + break + + - break; - } - case SDL_KEYDOWN: { + break + + case SDL_KEYDOWN:: - if (ev.key.keysym.scancode == SDL_SCANCODE_A) { - _left = true; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_W) { - _up = true; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_S) { - _down = true; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_D) { - _right = true; - } + if (ev.key.keysym.scancode == SDL_SCANCODE_A): + _left = true + else if (ev.key.keysym.scancode == SDL_SCANCODE_W): + _up = true + else if (ev.key.keysym.scancode == SDL_SCANCODE_S): + _down = true + else if (ev.key.keysym.scancode == SDL_SCANCODE_D): + _right = true + - break; - } - case SDL_KEYUP: { + break + + case SDL_KEYUP:: - if (ev.key.keysym.scancode == SDL_SCANCODE_A) { - _left = false; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_W) { - _up = false; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_S) { - _down = false; - } else if (ev.key.keysym.scancode == SDL_SCANCODE_D) { - _right = false; - } + if (ev.key.keysym.scancode == SDL_SCANCODE_A): + _left = false + else if (ev.key.keysym.scancode == SDL_SCANCODE_W): + _up = false + else if (ev.key.keysym.scancode == SDL_SCANCODE_S): + _down = false + else if (ev.key.keysym.scancode == SDL_SCANCODE_D): + _right = false + - break; - } - } -} + break + + -void MainScene::update(float delta) { - if (_up) { - _sprite->set_y(_sprite->get_y() - 50 * delta); - } - if (_down) { - _sprite->set_y(_sprite->get_y() + 50 * delta); - } +void MainScene::update(float delta): + if (_up): + _sprite->set_y(_sprite->get_y() - 50 * delta) + - if (_left) { - _sprite->set_x(_sprite->get_x() - 50 * delta); - } + if (_down): + _sprite->set_y(_sprite->get_y() + 50 * delta) + - if (_right) { - _sprite->set_x(_sprite->get_x() + 50 * delta); - } -} + if (_left): + _sprite->set_x(_sprite->get_x() - 50 * delta) + -void MainScene::render() { - Renderer::get_singleton()->clear(); + if (_right): + _sprite->set_x(_sprite->get_x() + 50 * delta) + - _camera->bind(); - Renderer::get_singleton()->draw_sprite(_sprite); -} +void MainScene::render(): + Renderer::get_singleton()->clear() -MainScene::MainScene() { - _camera = new Camera(); - _image = new Image("ti.bmp"); - _texture = new Texture(_image); - _sprite = new Sprite(_texture); + _camera->bind() - _up = false; - _down = false; - _left = false; - _right = false; -} + Renderer::get_singleton()->draw_sprite(_sprite) -MainScene::~MainScene() { - _texture->free(); - _image->free(); - delete _sprite; - delete _texture; - delete _image; - delete _camera; -} +MainScene::MainScene(): + _camera = new Camera() + _image = new Image("ti.bmp") + _texture = new Texture(_image) + _sprite = new Sprite(_texture) + + _up = false + _down = false + _left = false + _right = false + + +MainScene::~MainScene(): + _texture->free() + _image->free() + + delete _sprite + delete _texture + delete _image + delete _camera + diff --git a/26_sdl_button.txt b/26_sdl_button.txt index dc236e9..9c6014a 100644 --- a/26_sdl_button.txt +++ b/26_sdl_button.txt @@ -1,134 +1,187 @@ +Írjunk egy gomb (Button) osztályt. -#include +Látjátok, hogy az UML diagramba raktam egy nem standard ábrázolást. +Itt csak az a lényeg, hogy innen elég 1 megoldást választani. +Az itteni változók függvénymutatók letárolására valók. +Nem olyan szépek sajnos, mert mindkét esetben statikus függvényt lehet csak +beléjük rakni, (vagy lambda függvényt - lást kicsit lejjebb -), viszont +a tagfüggvények eoltárolására a kód ennél jóval rosszabbul néz ki, ezért +úgy döntöttem, hogy azt nem rakom bele. Akit érdekel keresgéljen rá. +Érdemes a (std::functional) dokumentációját is nézegetni, +ott is van sok infó erről. +(Igazából ajánlom, hogy próbálgassatok ki több más módszert is, mert +elég sok van.) -class Button { -public: - enum ButtonState { - BUTTON_STATE_UP, - BUTTON_STATE_HOVER, - BUTTON_STATE_DOWN, - BUTTON_STATE_OFF, +Lambda függvény == Anoním függvény == név nélküli függvény + +így kell lértehozni: + +[ capture clause ] (parameters) -> return-type +{ + definition of method +} + +[ Az ide rakott változók elérhetőek lesznek majd a függvényben ] (paraméterek) -> visszatérési típus +{ + kód +} + +Nyilván, mivel nincs neve, ezért nem igazán lehet csak úgy meghívogatni, kivéve, +ha eltároljuk egy függvénymutatóban! + +Azaz az A verzióval az on_click változóba így lehet egy lambda függvényt belerakni: + +void Application::test() { + button->on_click = []() -> void { printf("Click lambda!"); }; + + button->on_click = [this]() -> void { + /* itt lehet majd használni a test() függvényben elérhető "this" pointert. */ + printf("Click lambda!"); }; - void event(const SDL_Event &ev); - void update(float delta); - void render(); + int a = 10; + button->on_click = [a]() -> void { + /* itt lehet majd használni a test() függvényben elérhető "a" változót. */ + printf("Click lambda!"); + }; - //ver a: (Csak statikus fv állítható be rá) - std::function on_click; + button->on_click = [&]() -> void { + /* itt lehet majd használni a test() függvényben elérhető összes változót. */ + printf("Click lambda!"); + }; +} - //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; +Ez az include kelleni fog: #include - Button(); - virtual ~Button(); +És akkor az osztály: - ButtonState state; - - Rect2 transform; - - Sprite *up; - Sprite *down; - Sprite *hover; - Sprite *off; -}; +|---------------------------------------------------------------------------------------| +| class Button | +|---------------------------------------------------------------------------------------| +| + 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() | +| | +| ----------------------------------------------------------------- | +| | A.Verzió: (Csak statikus fv állítható be rá) | | +| | + std::function on_click | | +| | ------------------------------------------------ | | +| | B Verzió: (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; - } +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; + 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; - } + 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; + 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; - } + 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; + 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 (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) + on_click() + - if (on_click_member) { - on_click_member(cls); - } - } else { - state = BUTTON_STATE_UP; - } + if (on_click_member) + on_click_member(cls) + + else + state = BUTTON_STATE_UP + - break; - } - } -} + break + + + -void Button::update(float delta) { -} +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(); - } - } -} +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; +Button::Button() + state = BUTTON_STATE_UP - up = nullptr; - down = nullptr; - hover = nullptr; - off = nullptr; -} + up = nullptr + down = nullptr + hover = nullptr + off = nullptr + -Button::~Button() { -} +Button::~Button() + diff --git a/27_sdl_button_app.txt b/27_sdl_button_app.txt index 06e8a91..7d563ec 100644 --- a/27_sdl_button_app.txt +++ b/27_sdl_button_app.txt @@ -1,5 +1,5 @@ -class MainScene : public Scene { +class MainScene : public Scene: public: void event(const SDL_Event &ev); void update(float delta); @@ -22,7 +22,7 @@ public: Button *b1; Button *b2; Button *b3; -}; +; #include "main_scene.h" @@ -34,16 +34,16 @@ public: #include -void MainScene::event(const SDL_Event &ev) { +void MainScene::event(const SDL_Event &ev): b1->event(ev); b2->event(ev); b3->event(ev); -} -void MainScene::update(float delta) { -} -void MainScene::render() { +void MainScene::update(float delta): + + +void MainScene::render(): Renderer::get_singleton()->clear(); _camera->bind(); @@ -51,22 +51,22 @@ void MainScene::render() { b1->render(); b2->render(); b3->render(); -} -void MainScene::on_first_button_clicked() { + +void MainScene::on_first_button_clicked(): printf("Click!\n"); -} -void MainScene::on_first_button_clicked_member(void* cls) { - if (cls) { + +void MainScene::on_first_button_clicked_member(void* cls): + if (cls): reinterpret_cast(cls)->member_print(); - } -} -void MainScene::member_print() { - printf("Click Member!\n"); -} + -MainScene::MainScene() { +void MainScene::member_print(): + printf("Click Member!\n"); + + +MainScene::MainScene(): _camera = new Camera(); _image = new Image("ti.bmp"); _texture = new Texture(_image); @@ -90,9 +90,9 @@ MainScene::MainScene() { b3->hover = new Sprite(_texture, Color(200, 200, 200)); b3->cls = this; b3->on_click_member = MainScene::on_first_button_clicked_member; -} -MainScene::~MainScene() { + +MainScene::~MainScene(): _texture->free(); _image->free(); @@ -112,6 +112,6 @@ MainScene::~MainScene() { delete _texture; delete _image; delete _camera; -} +