Created the UML diagrams, and started cleaning up the code in the new txts.

This commit is contained in:
Relintai 2021-04-09 18:39:03 +02:00
parent bbecc1abbf
commit b71371f0e1
8 changed files with 424 additions and 359 deletions

View File

@ -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() |
|---------------------------------------------------------------------------------------|

View File

@ -1,95 +1,96 @@
class Application {
public:
bool running;
int target_fps;
virtual void event(const SDL_Event &current_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 &current_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 <chrono>
void Application::event(const SDL_Event &current_event) {
switch (current_event.type) {
void Application::event(const SDL_Event &current_event):
switch (current_event.type):
case SDL_QUIT:
running = false;
break;
}
running = false
break
scene->event(current_event);
}
void Application::update(float delta) {
scene->update(delta);
}
void Application::render() {
scene->render();
scene->event(current_event)
Renderer::get_singleton()->present();
}
void Application::main_loop() {
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
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(&current_event)) {
event(current_event);
}
SDL_Event current_event
while (SDL_PollEvent(&current_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<double> elapsed_seconds = end - start;
double t = elapsed_seconds.count();
update(frame_delta)
render()
double tfps = 1.0 / static_cast<double>(target_fps);
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now()
std::chrono::duration<double> elapsed_seconds = end - start
double t = elapsed_seconds.count()
double remaining = tfps - t;
double tfps = 1.0 / static_cast<double>(target_fps)
if (remaining > 0) {
Uint32 fms = static_cast<Uint32>(remaining * 1000.0);
double remaining = tfps - t
frame_delta = tfps;
if (remaining > 0):
Uint32 fms = static_cast<Uint32>(remaining * 1000.0)
SDL_Delay(fms);
} else {
frame_delta = t;
}
}
frame_delta = tfps
Application::Application() {
running = true;
target_fps = 60;
SDL_Delay(fms)
else:
frame_delta = t
scene = nullptr;
_instance = this;
}
Application::~Application() {
_instance = nullptr;
}
Application* Application::get_singleton() {
return _instance;
}
Application::Application():
running = true
target_fps = 60
scene = nullptr
_instance = this
Application::~Application():
_instance = nullptr
Application* Application::get_singleton():
return _instance

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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 <SDL.h>
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: {
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
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;
}
case SDL_KEYDOWN::
break;
}
}
}
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
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);
}
break
if (_left) {
_sprite->set_x(_sprite->get_x() - 50 * delta);
}
case SDL_KEYUP::
if (_right) {
_sprite->set_x(_sprite->get_x() + 50 * delta);
}
}
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
void MainScene::render() {
Renderer::get_singleton()->clear();
_camera->bind();
break
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();
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
delete _sprite;
delete _texture;
delete _image;
delete _camera;
}

View File

@ -1,134 +1,187 @@
Írjunk egy gomb (Button) osztályt.
#include <functional>
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 <functional> (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();
//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;
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!");
};
button->on_click = [&]() -> void {
/* itt lehet majd használni a test() függvényben elérhető összes változót. */
printf("Click lambda!");
};
}
Ez az include kelleni fog: #include <functional>
És akkor az osztály:
|---------------------------------------------------------------------------------------|
| 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<void(void)> 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<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;
}
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;
}
switch (ev.type)
case SDL_MOUSEMOTION:
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_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_DOWN;
}
break;
}
case SDL_MOUSEBUTTONUP: {
int x = ev.motion.x;
int y = ev.motion.y;
break
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y) {
state = BUTTON_STATE_HOVER;
case SDL_MOUSEBUTTONDOWN:
int x = ev.motion.x
int y = ev.motion.y
if (on_click) {
on_click();
}
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y)
state = BUTTON_STATE_DOWN
if (on_click_member) {
on_click_member(cls);
}
} else {
state = BUTTON_STATE_UP;
}
break;
}
}
}
break
void Button::update(float delta) {
}
case SDL_MOUSEBUTTONUP:
int x = ev.motion.x
int y = ev.motion.y
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();
}
}
}
if (transform.x < x && transform.x + transform.w > x && transform.y < y && transform.y + transform.w > y)
state = BUTTON_STATE_HOVER
Button::Button() {
state = BUTTON_STATE_UP;
if (on_click)
on_click()
up = nullptr;
down = nullptr;
hover = nullptr;
off = nullptr;
}
Button::~Button() {
}
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()

View File

@ -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 <stdio.h>
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<MainScene*>(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;
}