Use pimpl to hide properties used by the gameplay scene.

This commit is contained in:
King_DuckZ 2016-10-28 01:45:45 +02:00
parent 33c18680d6
commit f1467d7d99
2 changed files with 32 additions and 19 deletions

View file

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

View file

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