From c7869b4d35a6880728c01d3d172c0c14e8893859 Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 9 Apr 2021 10:15:13 +0200 Subject: [PATCH] Created more txts. They still need to be cleaned up. --- 21_sdl_application/main_scene.cpp | 18 ++-- 21_sdl_application/main_scene.h | 1 + 21_sdl_scene.txt | 10 +++ 22_sdl_application.txt | 95 +++++++++++++++++++++ 23_sdl_main.txt | 63 ++++++++++++++ 24_sdl_main_scene.txt | 90 ++++++++++++++++++++ 25_sdl_input_app.txt | 122 +++++++++++++++++++++++++++ 26_sdl_button.txt | 134 ++++++++++++++++++++++++++++++ 27_sdl_button_app.txt | 117 ++++++++++++++++++++++++++ 21_others.txt => 28_exercises.txt | 2 + 10 files changed, 645 insertions(+), 7 deletions(-) create mode 100644 21_sdl_scene.txt create mode 100644 22_sdl_application.txt create mode 100644 23_sdl_main.txt create mode 100644 24_sdl_main_scene.txt create mode 100644 25_sdl_input_app.txt create mode 100644 26_sdl_button.txt create mode 100644 27_sdl_button_app.txt rename 21_others.txt => 28_exercises.txt (99%) diff --git a/21_sdl_application/main_scene.cpp b/21_sdl_application/main_scene.cpp index 2c70b96..40cc6f2 100644 --- a/21_sdl_application/main_scene.cpp +++ b/21_sdl_application/main_scene.cpp @@ -12,17 +12,16 @@ void MainScene::update(float delta) { void MainScene::render() { Renderer::get_singleton()->clear(); - _camera->viewport.x -= 1; + _camera->viewport.x += _dir; - if (_camera->viewport.x >= 300) - _camera->viewport.x = 0; + if (_camera->viewport.x <= -100) + _dir = 1; + else if (_camera->viewport.x >= 100) + _dir = -1; _camera->bind(); - _sprite->set_x(30); - _sprite->set_y(30); - - Renderer::get_singleton()->draw_sprite(_sprite); + _sprite->draw(); } MainScene::MainScene() { @@ -30,6 +29,11 @@ MainScene::MainScene() { _image = new Image("ti.bmp"); _texture = new Texture(_image); _sprite = new Sprite(_texture); + + _sprite->set_x(30); + _sprite->set_y(30); + + _dir = 1; } MainScene::~MainScene() { diff --git a/21_sdl_application/main_scene.h b/21_sdl_application/main_scene.h index 697e6d2..feb20c1 100644 --- a/21_sdl_application/main_scene.h +++ b/21_sdl_application/main_scene.h @@ -21,6 +21,7 @@ public: Image *_image; Texture *_texture; Sprite *_sprite; + int _dir; }; #endif \ No newline at end of file diff --git a/21_sdl_scene.txt b/21_sdl_scene.txt new file mode 100644 index 0000000..fc47002 --- /dev/null +++ b/21_sdl_scene.txt @@ -0,0 +1,10 @@ + +class Scene { +public: + 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 new file mode 100644 index 0000000..2dc08b5 --- /dev/null +++ b/22_sdl_application.txt @@ -0,0 +1,95 @@ + +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; +}; + + + +Application* Application::_instance = nullptr; + +#include + +void Application::event(const SDL_Event ¤t_event) { + switch (current_event.type) { + case SDL_QUIT: + running = false; + break; + } + + scene->event(current_event); +} + +void Application::update(float delta) { + scene->update(delta); +} +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); + } + + 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(); + + double tfps = 1.0 / static_cast(target_fps); + + double remaining = tfps - t; + + if (remaining > 0) { + Uint32 fms = static_cast(remaining * 1000.0); + + frame_delta = tfps; + + SDL_Delay(fms); + } else { + frame_delta = t; + } +} + +Application::Application() { + running = true; + target_fps = 60; + + scene = nullptr; + _instance = this; +} +Application::~Application() { + _instance = nullptr; +} + +Application* Application::get_singleton() { + return _instance; +} diff --git a/23_sdl_main.txt b/23_sdl_main.txt new file mode 100644 index 0000000..e8ed12a --- /dev/null +++ b/23_sdl_main.txt @@ -0,0 +1,63 @@ + + +#include "application.h" +#include "renderer.h" + +#include "impl_application.h" + +Renderer *renderer = nullptr; +Application *application = nullptr; + +int main(int argc, char *argv[]) { + renderer = new Renderer(); + application = new ImplApplication(); + + while (application->running) { + application->main_loop(); + } + + delete application; + delete renderer; + + return 0; +} + + + + + + +#ifdef __EMSCRIPTEN__ +#include +#endif + +#include "application.h" +#include "renderer.h" + +#include "impl_application.h" +#define APPLICATION_CLASS ImplApplication + +Renderer *renderer = nullptr; +Application *application = nullptr; + +void handle_frame() { + application->main_loop(); +} + +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) { + application->main_loop(); + } +#endif + + delete application; + delete renderer; + + return 0; +} diff --git a/24_sdl_main_scene.txt b/24_sdl_main_scene.txt new file mode 100644 index 0000000..c25b50c --- /dev/null +++ b/24_sdl_main_scene.txt @@ -0,0 +1,90 @@ + + +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; +}; + + +#include "main_scene.h" + +#include "renderer.h" + + +void MainScene::event(const SDL_Event &ev) { +} + +void MainScene::update(float delta) { +} + +void MainScene::render() { + Renderer::get_singleton()->clear(); + + _camera->viewport.x += _dir; + + if (_camera->viewport.x <= -100) + _dir = 1; + else if (_camera->viewport.x >= 100) + _dir = -1; + + _camera->bind(); + + _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); + + _dir = 1; +} + +MainScene::~MainScene() { + _texture->free(); + _image->free(); + + delete _sprite; + delete _texture; + delete _image; + delete _camera; +} + + + + + + +#ifndef IMPL_APPLICATION_H +#define IMPL_APPLICATION_H + +#include "application.h" + +#include "main_scene.h" + +class ImplApplication : public Application { +public: + 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 new file mode 100644 index 0000000..c8c6cd9 --- /dev/null +++ b/25_sdl_input_app.txt @@ -0,0 +1,122 @@ +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; +}; + + +#include "main_scene.h" + +#include "renderer.h" +#include "rect2.h" + +#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; + + _camera->viewport = Rect2(0, 0, width, height); + + break; + } + } + + 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; + } + + 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; + } + + 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); + } + + if (_left) { + _sprite->set_x(_sprite->get_x() - 50 * delta); + } + + if (_right) { + _sprite->set_x(_sprite->get_x() + 50 * delta); + } +} + +void MainScene::render() { + Renderer::get_singleton()->clear(); + + _camera->bind(); + + Renderer::get_singleton()->draw_sprite(_sprite); +} + +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 new file mode 100644 index 0000000..dc236e9 --- /dev/null +++ b/26_sdl_button.txt @@ -0,0 +1,134 @@ + + +#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() { +} + diff --git a/27_sdl_button_app.txt b/27_sdl_button_app.txt new file mode 100644 index 0000000..06e8a91 --- /dev/null +++ b/27_sdl_button_app.txt @@ -0,0 +1,117 @@ + +class MainScene : public Scene { +public: + void event(const SDL_Event &ev); + void update(float delta); + void render(); + + //ver a + static void on_first_button_clicked(); + + //ver b + static void on_first_button_clicked_member(void* cls); + void member_print(); + + MainScene(); + ~MainScene(); + + Camera *_camera; + Image *_image; + Texture *_texture; + + Button *b1; + Button *b2; + Button *b3; +}; + + +#include "main_scene.h" + +#include "rect2.h" +#include "renderer.h" + +#include + +#include + +void MainScene::event(const SDL_Event &ev) { + b1->event(ev); + b2->event(ev); + b3->event(ev); +} + +void MainScene::update(float delta) { +} + +void MainScene::render() { + Renderer::get_singleton()->clear(); + + _camera->bind(); + + b1->render(); + b2->render(); + b3->render(); +} + +void MainScene::on_first_button_clicked() { + printf("Click!\n"); +} + +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() { + _camera = new Camera(); + _image = new Image("ti.bmp"); + _texture = new Texture(_image); + + b1 = new Button(); + b1->transform = Rect2(0, 0, 100, 100); + 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; + + b2 = new Button(); + b2->transform = Rect2(0, 110, 100, 100); + b2->off = new Sprite(_texture, Color(50, 50, 50)); + b2->state = Button::BUTTON_STATE_OFF; + + b3 = new Button(); + b3->transform = Rect2(0, 220, 100, 100); + b3->up = new Sprite(_texture); + b3->down = new Sprite(_texture, Color(100, 100, 100)); + b3->hover = new Sprite(_texture, Color(200, 200, 200)); + b3->cls = this; + b3->on_click_member = MainScene::on_first_button_clicked_member; +} + +MainScene::~MainScene() { + _texture->free(); + _image->free(); + + delete b1->up; + delete b1->down; + delete b1->hover; + delete b1; + + delete b2->off; + delete b2; + + delete b3->up; + delete b3->down; + delete b3->hover; + delete b3; + + delete _texture; + delete _image; + delete _camera; +} + + diff --git a/21_others.txt b/28_exercises.txt similarity index 99% rename from 21_others.txt rename to 28_exercises.txt index 338f158..69f8915 100644 --- a/21_others.txt +++ b/28_exercises.txt @@ -341,6 +341,8 @@ https://www.youtube.com/watch?v=gYRrGTC7GtA https://www.youtube.com/watch?v=PC1RaETIx3Y https://www.youtube.com/watch?v=eOCQfxRQ2pY +vagy ./wip/raycaster/main.cpp + etc...