From f449345e3aeb599eb497dfeeac7027cf4d1de515 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 3 Feb 2021 00:52:47 -0500 Subject: Pulled transform stuff into a system (starting to do ECS stuff) --- CMakeLists.txt | 1 + src/game.cpp | 14 +------------- src/game.h | 22 +++++++++++++--------- src/main.cpp | 5 ++++- src/party.cpp | 4 ++-- src/renderer.cpp | 2 +- src/system.h | 7 +++++++ src/transform_system.cpp | 20 ++++++++++++++++++++ src/transform_system.h | 33 +++++++++++++++++++++++++++++++++ 9 files changed, 82 insertions(+), 26 deletions(-) create mode 100644 src/system.h create mode 100644 src/transform_system.cpp create mode 100644 src/transform_system.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 6357cb8..da71520 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,7 @@ add_executable(tanetane src/party.cpp src/game.cpp src/map.cpp + src/transform_system.cpp ) set_property(TARGET tanetane PROPERTY CXX_STANDARD 17) diff --git a/src/game.cpp b/src/game.cpp index ebb792e..42dbd64 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -3,22 +3,10 @@ int Game::addSprite(Sprite sprite) { int id = sprites_.size(); sprites_.push_back(std::move(sprite)); - spritesByY_.emplace(sprite.loc().y(), id); + spriteIds_.push_back(id); return id; } -void Game::moveSprite(int id, vec2i newLoc) { - Sprite& sprite = sprites_.at(id); - bool changedY = (sprite.loc().y() != newLoc.y()); - if (changedY) { - spritesByY_.erase(std::make_tuple(sprite.loc().y(), id)); - } - sprite.loc() = newLoc; - if (changedY) { - spritesByY_.emplace(newLoc.y(), id); - } -} - void Game::tick() { if (!cameraLocked_) { const Sprite& follow = getSprite(followingSprite_); diff --git a/src/game.h b/src/game.h index a717d53..189cabb 100644 --- a/src/game.h +++ b/src/game.h @@ -8,6 +8,7 @@ #include "sprite.h" #include "map.h" #include "consts.h" +#include "transform_system.h" struct Input { bool left = false; @@ -19,14 +20,20 @@ struct Input { class Game { public: + Game() : transform_(*this) {} + int addSprite(Sprite sprite); const Sprite& getSprite(int id) const { return sprites_.at(id); } - const std::vector& getSprites() { - return sprites_; + Sprite& getSprite(int id) { + return sprites_.at(id); + } + + const std::vector& getSprites() { + return spriteIds_; } auto spriteView() const { @@ -35,13 +42,8 @@ public: }); } - auto getSpritesByY() const { - return spritesByY_ | ranges::views::transform([] (const std::tuple& val) { - return std::get<1>(val); - }); - } + TransformSystem& getTransformSystem() { return transform_; } - void moveSprite(int id, vec2i newLoc); void setSpriteState(int id, std::string state) { sprites_[id].setState(std::move(state)); @@ -77,8 +79,10 @@ public: private: + TransformSystem transform_; + + std::vector spriteIds_; std::vector sprites_; - std::set> spritesByY_; std::unique_ptr map_; // Camera diff --git a/src/main.cpp b/src/main.cpp index 1d1583f..d182290 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,7 +19,10 @@ void loop(Renderer& renderer, Mixer& mixer) { int dusterSprite = game.addSprite(Sprite("../res/duster_anim.txt", renderer)); int boneySprite = game.addSprite(Sprite("../res/boney_anim.txt", renderer)); - game.moveSprite(lucasSprite, {32,32}); + game.getTransformSystem().initSprite(lucasSprite, {32, 32}); + game.getTransformSystem().initSprite(kumaSprite, {32, 32}); + game.getTransformSystem().initSprite(dusterSprite, {32, 32}); + game.getTransformSystem().initSprite(boneySprite, {32, 32}); Party party; party.addMember(game, lucasSprite); diff --git a/src/party.cpp b/src/party.cpp index b7284c7..863a5d2 100644 --- a/src/party.cpp +++ b/src/party.cpp @@ -156,12 +156,12 @@ void Party::move(Game& game, Mixer& mixer, const Input& keystate) { // Move everything if (pLoc != p1.loc()) { - game.moveSprite(members_[0].spriteId, pLoc); + game.getTransformSystem().moveSprite(members_[0].spriteId, pLoc); for (int i = 1; i < members_.size(); i++) { const Sprite& pNext = game.getSprite(members_[i].spriteId); const Movement& posdir = members_[i].movement.front(); - game.moveSprite(members_[i].spriteId, posdir.pos); + game.getTransformSystem().moveSprite(members_[i].spriteId, posdir.pos); game.setSpriteDirection(members_[i].spriteId, posdir.dir); members_[i].movement.pop_front(); diff --git a/src/renderer.cpp b/src/renderer.cpp index 03d5173..b705310 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -109,7 +109,7 @@ void Renderer::render(Game& game) { SDL_RenderCopy(ren_.get(), renLay1_.get(), nullptr, nullptr); - for (const Sprite& sprite : game.getSpritesByY() | game.spriteView()) { + for (const Sprite& sprite : game.getTransformSystem().getSpritesByY() | game.spriteView()) { const SpriteFrame& frame = sprite.getFrame(); const SDL_Rect& src = frame.srcRect; SDL_Rect dest { sprite.loc().x() - frame.center.x(), sprite.loc().y() - frame.center.y(), frame.size.w(), frame.size.h() }; diff --git a/src/system.h b/src/system.h new file mode 100644 index 0000000..684aca9 --- /dev/null +++ b/src/system.h @@ -0,0 +1,7 @@ +#ifndef SYSTEM_H_6B40E1B9 +#define SYSTEM_H_6B40E1B9 + +class System { +}; + +#endif /* end of include guard: SYSTEM_H_6B40E1B9 */ diff --git a/src/transform_system.cpp b/src/transform_system.cpp new file mode 100644 index 0000000..e53fb7d --- /dev/null +++ b/src/transform_system.cpp @@ -0,0 +1,20 @@ +#include "transform_system.h" +#include "game.h" + +void TransformSystem::initSprite(int spriteId, vec2i loc) { + Sprite& sprite = game_.getSprite(spriteId); + sprite.loc() = loc; + spritesByY_.emplace(loc.y(), spriteId); +} + +void TransformSystem::moveSprite(int spriteId, vec2i newLoc) { + Sprite& sprite = game_.getSprite(spriteId); + bool changedY = (sprite.loc().y() != newLoc.y()); + if (changedY) { + spritesByY_.erase(std::make_tuple(sprite.loc().y(), spriteId)); + } + sprite.loc() = newLoc; + if (changedY) { + spritesByY_.emplace(newLoc.y(), spriteId); + } +} diff --git a/src/transform_system.h b/src/transform_system.h new file mode 100644 index 0000000..4616fc0 --- /dev/null +++ b/src/transform_system.h @@ -0,0 +1,33 @@ +#ifndef TRANSFORM_SYSTEM_H_BA2633BC +#define TRANSFORM_SYSTEM_H_BA2633BC + +#include +#include +#include +#include "system.h" +#include "vector.h" + +class Game; + +class TransformSystem : public System { +public: + + TransformSystem(Game& game) : game_(game) {} + + void initSprite(int spriteId, vec2i loc); + + void moveSprite(int spriteId, vec2i newLoc); + + auto getSpritesByY() const { + return spritesByY_ | ranges::views::transform([] (const std::tuple& val) { + return std::get<1>(val); + }); + } + +private: + + Game& game_; + std::set> spritesByY_; +}; + +#endif /* end of include guard: TRANSFORM_SYSTEM_H_BA2633BC */ -- cgit 1.4.1