Introduce app::scene & support changing scenes
This commit is contained in:
parent
91de56753b
commit
da8d9550a7
3 changed files with 72 additions and 62 deletions
|
|
@ -1,5 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/app/scene.hpp>
|
||||
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
|
||||
#include <memory>
|
||||
|
|
@ -8,38 +10,24 @@ namespace psemek::app
|
|||
{
|
||||
|
||||
struct app
|
||||
: scene
|
||||
{
|
||||
app(std::string const & name);
|
||||
virtual ~app();
|
||||
~app() override;
|
||||
|
||||
virtual bool running() const;
|
||||
|
||||
virtual void on_resize(int width, int height);
|
||||
virtual void on_focus_gained();
|
||||
virtual void on_focus_lost();
|
||||
virtual void on_quit();
|
||||
void on_resize(int width, int height) override;
|
||||
void on_quit() override;
|
||||
|
||||
virtual void on_mouse_move(int x, int y);
|
||||
virtual void on_mouse_wheel(int delta);
|
||||
virtual void on_left_button_down();
|
||||
virtual void on_left_button_up();
|
||||
virtual void on_middle_button_down();
|
||||
virtual void on_middle_button_up();
|
||||
virtual void on_right_button_down();
|
||||
virtual void on_right_button_up();
|
||||
|
||||
virtual void on_key_down(SDL_Keycode key);
|
||||
virtual void on_key_up(SDL_Keycode key);
|
||||
void draw() override;
|
||||
|
||||
void poll_events();
|
||||
|
||||
virtual void update();
|
||||
virtual void draw();
|
||||
|
||||
void run();
|
||||
|
||||
void show_cursor(bool show);
|
||||
scene * set_scene(scene * s);
|
||||
|
||||
void show_cursor(bool show);
|
||||
float time() const;
|
||||
|
||||
private:
|
||||
|
|
|
|||
35
libs/app/include/psemek/app/scene.hpp
Normal file
35
libs/app/include/psemek/app/scene.hpp
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
#pragma once
|
||||
|
||||
#include <SDL2/SDL_keycode.h>
|
||||
|
||||
namespace psemek::app
|
||||
{
|
||||
|
||||
struct scene
|
||||
{
|
||||
virtual ~scene() = 0;
|
||||
|
||||
virtual void on_resize(int width, int height) {}
|
||||
virtual void on_focus_gained() {}
|
||||
virtual void on_focus_lost() {}
|
||||
virtual void on_quit() {}
|
||||
|
||||
virtual void on_mouse_move(int x, int y) {}
|
||||
virtual void on_mouse_wheel(int delta) {}
|
||||
virtual void on_left_button_down() {}
|
||||
virtual void on_left_button_up() {}
|
||||
virtual void on_middle_button_down() {}
|
||||
virtual void on_middle_button_up() {}
|
||||
virtual void on_right_button_down() {}
|
||||
virtual void on_right_button_up() {}
|
||||
|
||||
virtual void on_key_down(SDL_Keycode key) {}
|
||||
virtual void on_key_up(SDL_Keycode key) {}
|
||||
|
||||
virtual void update() {}
|
||||
virtual void draw() {}
|
||||
};
|
||||
|
||||
inline scene::~scene() = default;
|
||||
|
||||
}
|
||||
|
|
@ -39,6 +39,8 @@ namespace psemek::app
|
|||
SDL_Window * window = nullptr;
|
||||
SDL_GLContext gl_context = nullptr;
|
||||
|
||||
scene * current_scene = nullptr;
|
||||
|
||||
bool running = false;
|
||||
|
||||
bool had_initial_resize = false;
|
||||
|
|
@ -97,73 +99,53 @@ namespace psemek::app
|
|||
gl::Viewport(0, 0, width, height);
|
||||
}
|
||||
|
||||
void app::on_focus_gained() {}
|
||||
|
||||
void app::on_focus_lost() {}
|
||||
|
||||
void app::on_quit()
|
||||
{
|
||||
impl().running = false;
|
||||
}
|
||||
|
||||
void app::on_mouse_move(int, int) {}
|
||||
|
||||
void app::on_mouse_wheel(int) {}
|
||||
|
||||
void app::on_left_button_down() {}
|
||||
|
||||
void app::on_left_button_up() {}
|
||||
|
||||
void app::on_middle_button_down() {}
|
||||
|
||||
void app::on_middle_button_up() {}
|
||||
|
||||
void app::on_right_button_down() {}
|
||||
|
||||
void app::on_right_button_up() {}
|
||||
|
||||
void app::on_key_down(SDL_Keycode) {}
|
||||
|
||||
void app::on_key_up(SDL_Keycode) {}
|
||||
|
||||
void app::poll_events()
|
||||
{
|
||||
scene * handler = this;
|
||||
if (impl().current_scene)
|
||||
handler = impl().current_scene;
|
||||
|
||||
for (SDL_Event e; SDL_PollEvent(&e);) switch (e.type)
|
||||
{
|
||||
case SDL_QUIT:
|
||||
on_quit();
|
||||
handler->on_quit();
|
||||
break;
|
||||
case SDL_WINDOWEVENT: switch (e.window.event)
|
||||
{
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
impl().had_initial_resize = true;
|
||||
on_resize(e.window.data1, e.window.data2);
|
||||
handler->on_resize(e.window.data1, e.window.data2);
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_GAINED:
|
||||
on_focus_gained();
|
||||
handler->on_focus_gained();
|
||||
break;
|
||||
case SDL_WINDOWEVENT_FOCUS_LOST:
|
||||
on_focus_lost();
|
||||
handler->on_focus_lost();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEMOTION:
|
||||
on_mouse_move(e.motion.x, e.motion.y);
|
||||
handler->on_mouse_move(e.motion.x, e.motion.y);
|
||||
break;
|
||||
case SDL_MOUSEWHEEL:
|
||||
on_mouse_wheel(e.wheel.y);
|
||||
handler->on_mouse_wheel(e.wheel.y);
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
switch (e.button.button)
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
on_left_button_down();
|
||||
handler->on_left_button_down();
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
on_middle_button_down();
|
||||
handler->on_middle_button_down();
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
on_right_button_down();
|
||||
handler->on_right_button_down();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
|
@ -171,28 +153,25 @@ namespace psemek::app
|
|||
switch (e.button.button)
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
on_left_button_up();
|
||||
handler->on_left_button_up();
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
on_middle_button_up();
|
||||
handler->on_middle_button_up();
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
on_right_button_up();
|
||||
handler->on_right_button_up();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
on_key_down(e.key.keysym.sym);
|
||||
handler->on_key_down(e.key.keysym.sym);
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
on_key_up(e.key.keysym.sym);
|
||||
handler->on_key_up(e.key.keysym.sym);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void app::update()
|
||||
{}
|
||||
|
||||
void app::draw()
|
||||
{
|
||||
gl::ClearColor(0.7f, 0.7f, 1.f, 1.f);
|
||||
|
|
@ -220,6 +199,14 @@ namespace psemek::app
|
|||
}
|
||||
}
|
||||
|
||||
scene * app::set_scene(scene * s)
|
||||
{
|
||||
impl().had_initial_resize = false;
|
||||
|
||||
std::swap(s, impl().current_scene);
|
||||
return s;
|
||||
}
|
||||
|
||||
void app::show_cursor(bool show)
|
||||
{
|
||||
SDL_ShowCursor(show ? SDL_TRUE : SDL_FALSE);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue