Use pimpl to hide properties used by the gameplay scene.
This commit is contained in:
parent
33c18680d6
commit
f1467d7d99
2 changed files with 32 additions and 19 deletions
|
@ -3,6 +3,9 @@
|
||||||
#include "mycurryConfig.h"
|
#include "mycurryConfig.h"
|
||||||
#include "key.hpp"
|
#include "key.hpp"
|
||||||
#include "inputbag.hpp"
|
#include "inputbag.hpp"
|
||||||
|
#include "worldgrid.hpp"
|
||||||
|
#include "worldviewport.hpp"
|
||||||
|
#include "texture.hpp"
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -26,15 +29,25 @@ namespace curry {
|
||||||
}
|
}
|
||||||
} //unnamed namespace
|
} //unnamed namespace
|
||||||
|
|
||||||
|
struct IngameScene::LocalData {
|
||||||
|
LocalData (const vec2us& parTileSize, const vec2us& parTileCount, cloonel::SDLMain* parSDLMain) :
|
||||||
|
world(parTileSize, parTileCount),
|
||||||
|
viewport(&world, vec2i(parSDLMain->WidthHeight()))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldGrid world;
|
||||||
|
WorldViewport viewport;
|
||||||
|
Texture worldtiles;
|
||||||
|
};
|
||||||
|
|
||||||
IngameScene::IngameScene (cloonel::SDLMain* parSDLMain) :
|
IngameScene::IngameScene (cloonel::SDLMain* parSDLMain) :
|
||||||
GameSceneBase(parSDLMain),
|
GameSceneBase(parSDLMain),
|
||||||
m_world(vec2us(96), vec2us(100)),
|
m_local_data(std::make_unique<LocalData>(vec2us(96), vec2us(100), parSDLMain))
|
||||||
m_viewport(&m_world, vec2i(parSDLMain->WidthHeight()))
|
|
||||||
{
|
{
|
||||||
using cloonel::Key;
|
using cloonel::Key;
|
||||||
using cloonel::InputDevice_Keyboard;
|
using cloonel::InputDevice_Keyboard;
|
||||||
|
|
||||||
//m_viewport.set_position(vec2i(38));
|
|
||||||
auto& inp = this->input_bag();
|
auto& inp = this->input_bag();
|
||||||
inp.AddAction(ActionLeft, Key(InputDevice_Keyboard, SDL_SCANCODE_LEFT), "Move left");
|
inp.AddAction(ActionLeft, Key(InputDevice_Keyboard, SDL_SCANCODE_LEFT), "Move left");
|
||||||
inp.AddAction(ActionUp, Key(InputDevice_Keyboard, SDL_SCANCODE_UP), "Move up");
|
inp.AddAction(ActionUp, Key(InputDevice_Keyboard, SDL_SCANCODE_UP), "Move up");
|
||||||
|
@ -45,27 +58,29 @@ namespace curry {
|
||||||
IngameScene::~IngameScene() noexcept = default;
|
IngameScene::~IngameScene() noexcept = default;
|
||||||
|
|
||||||
void IngameScene::on_prepare() {
|
void IngameScene::on_prepare() {
|
||||||
m_worldtiles.load(RESOURCES_PATH "textures.png", *this->sdl_main());
|
m_local_data->worldtiles.load(RESOURCES_PATH "textures.png", *this->sdl_main());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IngameScene::on_update (float parDeltaT) {
|
void IngameScene::on_update (float parDeltaT) {
|
||||||
|
const auto& world = m_local_data->world;
|
||||||
const float speed_per_sec =
|
const float speed_per_sec =
|
||||||
static_cast<float>(
|
static_cast<float>(
|
||||||
std::max(m_world.tile_size().x(), m_world.tile_size().y())
|
std::max(world.tile_size().x(), world.tile_size().y())
|
||||||
) * 1.5f;
|
) * 1.5f;
|
||||||
|
|
||||||
|
auto& viewport = m_local_data->viewport;
|
||||||
const float speed = parDeltaT * speed_per_sec;
|
const float speed = parDeltaT * speed_per_sec;
|
||||||
if (cloonel::IsPressed(input_bag(), ActionRight))
|
if (cloonel::IsPressed(input_bag(), ActionRight))
|
||||||
m_viewport.set_position(m_viewport.position() + vec2f(speed, 0));
|
viewport.set_position(viewport.position() + vec2f(speed, 0));
|
||||||
if (cloonel::IsPressed(input_bag(), ActionLeft))
|
if (cloonel::IsPressed(input_bag(), ActionLeft))
|
||||||
m_viewport.set_position(m_viewport.position() - vec2f(speed, 0));
|
viewport.set_position(viewport.position() - vec2f(speed, 0));
|
||||||
if (cloonel::IsPressed(input_bag(), ActionUp))
|
if (cloonel::IsPressed(input_bag(), ActionUp))
|
||||||
m_viewport.set_position(m_viewport.position() - vec2f(0, speed));
|
viewport.set_position(viewport.position() - vec2f(0, speed));
|
||||||
if (cloonel::IsPressed(input_bag(), ActionDown))
|
if (cloonel::IsPressed(input_bag(), ActionDown))
|
||||||
m_viewport.set_position(m_viewport.position() + vec2f(0, speed));
|
viewport.set_position(viewport.position() + vec2f(0, speed));
|
||||||
|
|
||||||
const auto tilesize(m_world.tile_size());
|
const auto tilesize(world.tile_size());
|
||||||
for (auto tile : m_viewport) {
|
for (auto tile : viewport) {
|
||||||
vec2us idx(tile.index & 1, (tile.index >> 1) & 1);
|
vec2us idx(tile.index & 1, (tile.index >> 1) & 1);
|
||||||
vec2us src_rect_xy = idx * tilesize;
|
vec2us src_rect_xy = idx * tilesize;
|
||||||
|
|
||||||
|
@ -73,12 +88,12 @@ namespace curry {
|
||||||
SDL_Rect src{src_rect_xy.x(), src_rect_xy.y(), tilesize.x(), tilesize.y()};
|
SDL_Rect src{src_rect_xy.x(), src_rect_xy.y(), tilesize.x(), tilesize.y()};
|
||||||
SDL_Rect dst{tile.pixel_pos.x(), tile.pixel_pos.y(), tilesize.x(), tilesize.y()};
|
SDL_Rect dst{tile.pixel_pos.x(), tile.pixel_pos.y(), tilesize.x(), tilesize.y()};
|
||||||
clip(src, dst, vec2i(0), sdl_main()->WidthHeight());
|
clip(src, dst, vec2i(0), sdl_main()->WidthHeight());
|
||||||
SDL_RenderCopy(this->sdl_main()->GetRenderer(), m_worldtiles.texture(), &src, &dst);
|
SDL_RenderCopy(this->sdl_main()->GetRenderer(), m_local_data->worldtiles.texture(), &src, &dst);
|
||||||
}
|
}
|
||||||
SDL_RenderPresent(this->sdl_main()->GetRenderer());
|
SDL_RenderPresent(this->sdl_main()->GetRenderer());
|
||||||
}
|
}
|
||||||
|
|
||||||
void IngameScene::on_destroy() noexcept {
|
void IngameScene::on_destroy() noexcept {
|
||||||
m_worldtiles.unload();
|
m_local_data->worldtiles.unload();
|
||||||
}
|
}
|
||||||
} //namespace curry
|
} //namespace curry
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "gamescenebase.hpp"
|
#include "gamescenebase.hpp"
|
||||||
#include "worldgrid.hpp"
|
#include <memory>
|
||||||
#include "worldviewport.hpp"
|
|
||||||
#include "texture.hpp"
|
|
||||||
|
|
||||||
namespace cloonel {
|
namespace cloonel {
|
||||||
class SDLMain;
|
class SDLMain;
|
||||||
|
@ -21,8 +19,8 @@ namespace curry {
|
||||||
virtual void on_update (float parDeltaT) override;
|
virtual void on_update (float parDeltaT) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WorldGrid m_world;
|
struct LocalData;
|
||||||
WorldViewport m_viewport;
|
|
||||||
Texture m_worldtiles;
|
std::unique_ptr<LocalData> m_local_data;
|
||||||
};
|
};
|
||||||
} //namespace curry
|
} //namespace curry
|
||||||
|
|
Loading…
Add table
Reference in a new issue