Created more txts. They still need to be cleaned up.

This commit is contained in:
Relintai 2021-04-09 10:15:13 +02:00
parent aad056d9b1
commit c7869b4d35
10 changed files with 645 additions and 7 deletions

View File

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

View File

@ -21,6 +21,7 @@ public:
Image *_image;
Texture *_texture;
Sprite *_sprite;
int _dir;
};
#endif

10
21_sdl_scene.txt Normal file
View File

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

95
22_sdl_application.txt Normal file
View File

@ -0,0 +1,95 @@
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;
};
Application* Application::_instance = nullptr;
#include <chrono>
void Application::event(const SDL_Event &current_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(&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();
double tfps = 1.0 / static_cast<double>(target_fps);
double remaining = tfps - t;
if (remaining > 0) {
Uint32 fms = static_cast<Uint32>(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;
}

63
23_sdl_main.txt Normal file
View File

@ -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 <emscripten.h>
#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;
}

90
24_sdl_main_scene.txt Normal file
View File

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

122
25_sdl_input_app.txt Normal file
View File

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

134
26_sdl_button.txt Normal file
View File

@ -0,0 +1,134 @@
#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() {
}

117
27_sdl_button_app.txt Normal file
View File

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

View File

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