diff --git a/assets/items/Weapons.items b/assets/items/Weapons.items index ea4aa34..c994fbf 100644 --- a/assets/items/Weapons.items +++ b/assets/items/Weapons.items @@ -3,7 +3,8 @@ - + + @@ -15,7 +16,8 @@ - + + diff --git a/assets/scenes/Game.scene b/assets/scenes/Game.scene index ff26491..978fd5a 100644 --- a/assets/scenes/Game.scene +++ b/assets/scenes/Game.scene @@ -17,7 +17,8 @@ - + + diff --git a/assets/sprites/Player.sprite b/assets/sprites/Player.sprite index b73bd84..6b17c8a 100644 --- a/assets/sprites/Player.sprite +++ b/assets/sprites/Player.sprite @@ -19,23 +19,23 @@ - - + + - - + + - - + + - - + + \ No newline at end of file diff --git a/assets/sprites/items/Lvl2Sword.sprite b/assets/sprites/items/Lvl2Sword.sprite index 8f3ab05..0c82476 100644 --- a/assets/sprites/items/Lvl2Sword.sprite +++ b/assets/sprites/items/Lvl2Sword.sprite @@ -5,7 +5,6 @@ - - + \ No newline at end of file diff --git a/src/GameState.h b/src/GameState.h index 7ae9d2a..d689fba 100644 --- a/src/GameState.h +++ b/src/GameState.h @@ -8,10 +8,10 @@ #ifndef MODEL_GAMESTATE_H_ #define MODEL_GAMESTATE_H_ -#include -#include +#include #include #include +#include #include #include @@ -30,11 +30,11 @@ namespace farmlands { model::Configuration* config; // Render context - base::RenderContext renderContext; + graphics::RenderContext renderContext; // Scene model::Scene* scene; - std::vector itemPrefabs; + std::vector itemPrefabs; // Misc float elapsedTime; diff --git a/src/base/RenderContext.h b/src/base/RenderContext.h deleted file mode 100644 index fd74018..0000000 --- a/src/base/RenderContext.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * RenderContext.h - * - * Created on: Nov 30, 2016 - * Author: tibi - */ - -#ifndef GRAPHICS_RENDERCONTEXT_H_ -#define GRAPHICS_RENDERCONTEXT_H_ - -#include -#include - -namespace farmlands { -namespace base { - - class GameObject; - struct Transform; - struct Camera; - - class RenderContext - { - public: - float xToWorld(float x); - float yToWorld(float y); - float xToScreen(float x); - float yToScreen(float y); - - bool visible(SDL_Rect& rect); - - inline GameObject* cameraObj() { return m_cameraObj; } - inline Camera* camera() { return m_camera; } - inline Transform* cameraTransform() { return m_cameraTransform; } - - void setCamera(GameObject* camera); - - /** - * Screen properties - */ - Viewport viewport; - float uiScale = 1.0f; - - private: - Transform* m_cameraTransform; - Camera* m_camera; - GameObject* m_cameraObj; - }; - -} -} - -#endif /* GRAPHICS_RENDERCONTEXT_H_ */ diff --git a/src/model/Background.cpp b/src/components/Background.cpp similarity index 95% rename from src/model/Background.cpp rename to src/components/Background.cpp index 3aeb92d..a62ee30 100644 --- a/src/model/Background.cpp +++ b/src/components/Background.cpp @@ -5,13 +5,13 @@ * Author: tibi */ -#include +#include #include #include namespace farmlands { -namespace model { +namespace components { Background::Background(size_t layerCount, size_t rowCount, size_t columnCount) @@ -29,7 +29,7 @@ Background::~Background() delete[] m_textures; } -base::Component* Background::clone() +model::Component* Background::clone() { Background* clone = new Background(m_layers, m_rows, m_columns); memcpy(clone->m_cells, m_cells, sizeof(Cell) * m_layers * m_rows * m_columns); diff --git a/src/model/Background.h b/src/components/Background.h similarity index 87% rename from src/model/Background.h rename to src/components/Background.h index 8aff8fb..fae8795 100644 --- a/src/model/Background.h +++ b/src/components/Background.h @@ -8,21 +8,21 @@ #ifndef MODEL_BACKGROUND_H_ #define MODEL_BACKGROUND_H_ -#include +#include #include namespace farmlands { -namespace model { +namespace components { typedef int16_t Cell; - class Background: public base::Component + class Background: public model::Component { public: Background(size_t layerCount, size_t rowCount, size_t columnCount); virtual ~Background(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; inline size_t layerCount() const { return m_layers; } diff --git a/src/controller/DebugController.cpp b/src/components/DebugController.cpp similarity index 88% rename from src/controller/DebugController.cpp rename to src/components/DebugController.cpp index 3c8fe78..9c30cd1 100644 --- a/src/controller/DebugController.cpp +++ b/src/components/DebugController.cpp @@ -6,8 +6,8 @@ */ #include -#include -#include +#include +#include #include #include @@ -15,7 +15,7 @@ using namespace farmlands::input; namespace farmlands { -namespace controller { +namespace components { static const float ScaleVelocity = 0.5f; static const float ScaleShiftVelocity = 2.0f; @@ -29,7 +29,7 @@ DebugController::~DebugController() { } -base::Component* DebugController::clone() +model::Component* DebugController::clone() { return new DebugController(); } diff --git a/src/controller/DebugController.h b/src/components/DebugController.h similarity index 70% rename from src/controller/DebugController.h rename to src/components/DebugController.h index fed3b7a..25df915 100644 --- a/src/controller/DebugController.h +++ b/src/components/DebugController.h @@ -8,26 +8,26 @@ #ifndef CONTROLLER_DEBUGCONTROLLER_H_ #define CONTROLLER_DEBUGCONTROLLER_H_ -#include -#include +#include +#include namespace farmlands { -namespace controller { +namespace components { - class DebugController: public base::Component + class DebugController: public model::Component { public: DebugController(); virtual ~DebugController(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onInitialize() override; virtual void onUpdateLogic() override; private: - base::Camera* m_camera; + basic::Camera* m_camera; }; } /* namespace controller */ diff --git a/src/controller/GuiController.cpp b/src/components/GuiController.cpp similarity index 93% rename from src/controller/GuiController.cpp rename to src/components/GuiController.cpp index 3776b2a..b2077d0 100644 --- a/src/controller/GuiController.cpp +++ b/src/components/GuiController.cpp @@ -6,13 +6,13 @@ */ #include -#include +#include #include #include namespace farmlands { -namespace controller { +namespace components { GuiController::GuiController() : m_canvas() @@ -23,7 +23,7 @@ GuiController::~GuiController() { } -base::Component* GuiController::clone() +model::Component* GuiController::clone() { return new GuiController(); } @@ -70,7 +70,6 @@ bool GuiController::onEvent(SDL_Event& event) void GuiController::onRender() { - // Compute render context // Render m_canvas.render(m_context); } diff --git a/src/controller/GuiController.h b/src/components/GuiController.h similarity index 74% rename from src/controller/GuiController.h rename to src/components/GuiController.h index ba18ebe..03e9c3f 100644 --- a/src/controller/GuiController.h +++ b/src/components/GuiController.h @@ -8,22 +8,22 @@ #ifndef CONTROLLER_GUICONTROLLER_H_ #define CONTROLLER_GUICONTROLLER_H_ -#include -#include +#include +#include #include #include namespace farmlands { -namespace controller { +namespace components { - class GuiController : public base::Component + class GuiController : public model::Component { public: GuiController(); virtual ~GuiController(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; /** @@ -35,7 +35,7 @@ namespace controller { private: gui::layout::Canvas m_canvas; - base::RenderContext* m_context; + graphics::RenderContext* m_context; }; } /* namespace controller */ diff --git a/src/base/Camera.cpp b/src/components/basic/Camera.cpp similarity index 82% rename from src/base/Camera.cpp rename to src/components/basic/Camera.cpp index 43220f5..d1b5589 100644 --- a/src/base/Camera.cpp +++ b/src/components/basic/Camera.cpp @@ -6,13 +6,16 @@ */ #include -#include -#include +#include +#include #include +using namespace farmlands::model; + namespace farmlands { -namespace base { +namespace components { +namespace basic { Camera::Camera() : scale(1), @@ -53,4 +56,5 @@ void Camera::dump(unsigned level) } } +} diff --git a/src/base/Camera.h b/src/components/basic/Camera.h similarity index 68% rename from src/base/Camera.h rename to src/components/basic/Camera.h index 5751f4f..d1f7bd5 100644 --- a/src/base/Camera.h +++ b/src/components/basic/Camera.h @@ -8,18 +8,19 @@ #ifndef MODEL_CAMERA_H_ #define MODEL_CAMERA_H_ -#include +#include namespace farmlands { -namespace base { +namespace components { +namespace basic { - class Camera : public base::Component + class Camera : public model::Component { public: Camera(); virtual ~Camera(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onCreate(); @@ -30,5 +31,6 @@ namespace base { } } +} #endif /* MODEL_CAMERA_H_ */ diff --git a/src/base/Sprite.cpp b/src/components/basic/Sprite.cpp similarity index 60% rename from src/base/Sprite.cpp rename to src/components/basic/Sprite.cpp index bef3819..faa4a22 100644 --- a/src/base/Sprite.cpp +++ b/src/components/basic/Sprite.cpp @@ -5,22 +5,26 @@ * Author: tibi */ -#include +#include +#include #include #include +#include namespace farmlands { -namespace base { +namespace components { +namespace basic { Sprite::Sprite() - : anchorX(0), anchorY(0), - name(), + : name(), + anchorX(0), anchorY(0), + animationVelocity(1.0f), m_states(), + m_stateNames(), m_currentState(0), m_currentFrame(0), - m_currentFrameTimeLeft(0), - m_animationVelocity(1) + m_currentFrameTimeLeft(0) { } @@ -28,11 +32,45 @@ Sprite::~Sprite() { } +model::Component* Sprite::clone() +{ + Sprite* clone = new Sprite(); + + // Copy public fields + clone->name = name; + clone->anchorX = anchorX; + clone->anchorY = anchorY; + clone->animationVelocity = animationVelocity; + + // Copy private memberes + std::copy(m_states.begin(), m_states.end(), std::back_inserter(clone->m_states)); + std::copy(m_stateNames.begin(), m_stateNames.end(), std::inserter(clone->m_stateNames, clone->m_stateNames.end())); + clone->m_currentState = m_currentState; + clone->m_currentFrame = m_currentFrame; + clone->m_currentFrameTimeLeft = m_currentFrameTimeLeft; + + return clone; +} + +void Sprite::dump(unsigned level) +{ + for (unsigned i = 0; i < level; i++) + std::cout<<" "; + + std::cout << " .Component: Sprite "; + std::cout << "name="< 0, "State must have at least one frame!"); #ifdef BUILD_DEBUG - uint32_t totalDuration = 0; + float totalDuration = 0; for (auto frame : state.frames) totalDuration += frame.duration; @@ -63,11 +101,23 @@ void Sprite::setState(const std::string& name) setState(m_stateNames.at(name)); } +SpriteState& Sprite::currentState() +{ + Assert(m_states.size() > 0, "Sprite must have at least one state!"); + return m_states.at(m_currentState); +} + +Frame& Sprite::currentFrame() +{ + Assert(currentState().frames.size() > 0, "State must have at least one frame!"); + return currentState().frames.at(m_currentFrame); +} + void Sprite::advanceTime(float fractions) { Assert(m_states.size() > 0, "Sprite must have at least one state!"); - m_currentFrameTimeLeft -= fractions * m_animationVelocity; + m_currentFrameTimeLeft -= fractions * animationVelocity; while (m_currentFrameTimeLeft <= 0) { @@ -79,22 +129,6 @@ void Sprite::advanceTime(float fractions) } } -SpriteState& Sprite::currentState() -{ - Assert(m_states.size() > 0, "Sprite must have at least one state!"); - return m_states.at(m_currentState); } - -void Sprite::setAnimationVelocity(float velocity) -{ - m_animationVelocity = velocity; } - -Frame& Sprite::currentFrame() -{ - Assert(currentState().frames.size() > 0, "State must have at least one frame!"); - return currentState().frames.at(m_currentFrame); -} - -} /* namespace model */ } /* namespace farmlands */ diff --git a/src/base/Sprite.h b/src/components/basic/Sprite.h similarity index 76% rename from src/base/Sprite.h rename to src/components/basic/Sprite.h index 494fc44..594b5f4 100644 --- a/src/base/Sprite.h +++ b/src/components/basic/Sprite.h @@ -8,13 +8,15 @@ #ifndef MODEL_SPRITE_H_ #define MODEL_SPRITE_H_ +#include #include #include #include namespace farmlands { -namespace base { +namespace components { +namespace basic { /** * Defines an animation frame @@ -24,11 +26,11 @@ namespace base { uint32_t tileSetId; uint32_t tileSetCell; uint32_t width, height; - uint32_t duration; + float duration; }; /** - * Defines a sprite state (aka an animation). + * Defines a sprite state (i.e. an animation). */ struct SpriteState { @@ -39,12 +41,17 @@ namespace base { /** * Defines a sprite */ - class Sprite + class Sprite : public model::Component { public: Sprite(); virtual ~Sprite(); + virtual model::Component* clone() override; + virtual void dump(unsigned level) override; + + virtual void onPreRender() override; + /** * Adds a state to the sprite. */ @@ -60,35 +67,28 @@ namespace base { */ void setState(const std::string& name); - /** - * Advances the current frame - */ - void advanceTime(float fractions); - - /** - * Sets the animation velocity. Using this property, animation can be slowed or accelerated. - */ - void setAnimationVelocity(float velocity); - // Getters SpriteState& currentState(); Frame& currentFrame(); // Public fields - float anchorX, anchorY; std::string name; + float anchorX, anchorY; + float animationVelocity; private: + void advanceTime(float fractions); + std::vector m_states; std::unordered_map m_stateNames; size_t m_currentState; size_t m_currentFrame; float m_currentFrameTimeLeft; - float m_animationVelocity; }; -} /* namespace model */ +} +} /* namespace components */ } /* namespace farmlands */ #endif /* MODEL_SPRITE_H_ */ diff --git a/src/base/Transform.cpp b/src/components/basic/Transform.cpp similarity index 86% rename from src/base/Transform.cpp rename to src/components/basic/Transform.cpp index 773e01d..9e1886d 100644 --- a/src/base/Transform.cpp +++ b/src/components/basic/Transform.cpp @@ -5,13 +5,14 @@ * Author: tibi */ -#include -#include +#include +#include #include namespace farmlands { -namespace base { +namespace components { +namespace basic { Transform::Transform() : x(0), y(0), @@ -24,7 +25,7 @@ Transform::~Transform() { } -Component* Transform::clone() +model::Component* Transform::clone() { Transform* clone = new Transform(); clone->x = x; @@ -34,7 +35,7 @@ Component* Transform::clone() return clone; } -void farmlands::base::Transform::onCreate() +void Transform::onCreate() { if (gameObject->parent() != nullptr) m_parent = gameObject->parent()->component(); @@ -72,7 +73,8 @@ void Transform::dump(unsigned level) std::cout << "h="< +#include namespace farmlands { -namespace base { +namespace components { +namespace basic { - class Transform: public Component + class Transform: public model::Component { public: Transform(); virtual ~Transform(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onCreate(); @@ -40,7 +41,8 @@ namespace base { Transform* m_parent; }; -} /* namespace base */ +} +} } /* namespace farmlands */ #endif /* BASE_TRANSFORM_H_ */ diff --git a/src/controller/items/Giftable.cpp b/src/components/items/Giftable.cpp similarity index 83% rename from src/controller/items/Giftable.cpp rename to src/components/items/Giftable.cpp index 9bb1e9f..4fdefaf 100644 --- a/src/controller/items/Giftable.cpp +++ b/src/components/items/Giftable.cpp @@ -5,12 +5,12 @@ * Author: tibi */ -#include +#include #include namespace farmlands { -namespace controller { +namespace components { namespace items { Giftable::Giftable() @@ -21,7 +21,7 @@ Giftable::~Giftable() { } -base::Component* Giftable::clone() +model::Component* Giftable::clone() { return new Giftable(); } @@ -46,5 +46,5 @@ void Giftable::dump(unsigned level) } } /* namespace items */ -} /* namespace controller */ +} /* namespace components */ } /* namespace farmlands */ diff --git a/src/controller/items/Giftable.h b/src/components/items/Giftable.h similarity index 75% rename from src/controller/items/Giftable.h rename to src/components/items/Giftable.h index 016f712..7da2f90 100644 --- a/src/controller/items/Giftable.h +++ b/src/components/items/Giftable.h @@ -8,20 +8,20 @@ #ifndef CONTROLLER_ITEMS_GIFTABLE_H_ #define CONTROLLER_ITEMS_GIFTABLE_H_ -#include +#include #include namespace farmlands { -namespace controller { +namespace components { namespace items { - class Giftable: public base::Component + class Giftable: public model::Component { public: Giftable(); virtual ~Giftable(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; bool canGift(float x, float y, model::Direction d); @@ -29,7 +29,7 @@ namespace items { }; } /* namespace items */ -} /* namespace controller */ +} /* namespace components */ } /* namespace farmlands */ #endif /* CONTROLLER_ITEMS_GIFTABLE_H_ */ diff --git a/src/model/Item.h b/src/components/items/Item.h similarity index 79% rename from src/model/Item.h rename to src/components/items/Item.h index 041abaa..a7621bd 100644 --- a/src/model/Item.h +++ b/src/components/items/Item.h @@ -8,19 +8,20 @@ #ifndef MODEL_ITEM_H_ #define MODEL_ITEM_H_ -#include +#include #include namespace farmlands { -namespace model { +namespace components { +namespace items { - class Item: public base::Component + class Item: public model::Component { public: Item(); virtual ~Item(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; std::string name; @@ -41,7 +42,7 @@ namespace model { { } - inline base::Component* Item::clone() + inline model::Component* Item::clone() { Item* clone = new Item(); clone->name = name; @@ -59,7 +60,8 @@ namespace model { std::cout << " .Component: Item\n"; } -} /* namespace model */ +} +} } /* namespace farmlands */ #endif /* MODEL_ITEM_H_ */ diff --git a/src/controller/items/Weapon.cpp b/src/components/items/Weapon.cpp similarity index 81% rename from src/controller/items/Weapon.cpp rename to src/components/items/Weapon.cpp index 35b6b03..db54ea2 100644 --- a/src/controller/items/Weapon.cpp +++ b/src/components/items/Weapon.cpp @@ -6,12 +6,12 @@ */ #include -#include +#include #include namespace farmlands { -namespace controller { +namespace components { namespace items { Weapon::Weapon() @@ -19,7 +19,7 @@ Weapon::Weapon() critProbability(0), critDamage(0), attackDuration(1.0f), - m_spriteRenderer(nullptr), + m_sprite(nullptr), m_attackTimeLeft(0) { } @@ -28,7 +28,7 @@ Weapon::~Weapon() { } -base::Component* Weapon::clone() +model::Component* Weapon::clone() { Weapon* clone = new Weapon(); clone->damage = damage; @@ -41,12 +41,12 @@ base::Component* Weapon::clone() void Weapon::onInitialize() { - m_spriteRenderer = gameObject->component(); + m_sprite = gameObject->component(); } void Weapon::onPreRender() { - m_spriteRenderer->sprite->setState(m_attackTimeLeft > 0); + m_sprite->setState(m_attackTimeLeft > 0); } void Weapon::onUpdateLogic() @@ -78,6 +78,6 @@ void Weapon::dump(unsigned level) } } -} /* namespace model */ +} /* namespace components */ } /* namespace farmlands */ diff --git a/src/controller/items/Weapon.h b/src/components/items/Weapon.h similarity index 79% rename from src/controller/items/Weapon.h rename to src/components/items/Weapon.h index 9c68a38..5cbefe3 100644 --- a/src/controller/items/Weapon.h +++ b/src/components/items/Weapon.h @@ -8,21 +8,22 @@ #ifndef CONTROLLER_ITEMS_WEAPON_H_ #define CONTROLLER_ITEMS_WEAPON_H_ -#include +#include #include +#include #include namespace farmlands { -namespace controller { +namespace components { namespace items { - class Weapon: public base::Component + class Weapon: public model::Component { public: Weapon(); virtual ~Weapon(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onInitialize() override; @@ -42,12 +43,12 @@ namespace items { float attackDuration; // In seconds private: - graphics::SpriteRenderer* m_spriteRenderer; + basic::Sprite* m_sprite; float m_attackTimeLeft; }; } -} /* namespace model */ +} /* namespace components */ } /* namespace farmlands */ #endif /* CONTROLLER_ITEMS_WEAPON_H_ */ diff --git a/src/controller/player/PlayerController.cpp b/src/components/player/PlayerController.cpp similarity index 90% rename from src/controller/player/PlayerController.cpp rename to src/components/player/PlayerController.cpp index 8990144..1ed230b 100644 --- a/src/controller/player/PlayerController.cpp +++ b/src/components/player/PlayerController.cpp @@ -6,24 +6,24 @@ */ #include -#include -#include -#include +#include +#include +#include +#include #include #include -#include #include #include -using namespace farmlands::base; -using namespace farmlands::controller::items; +using namespace farmlands::components::basic; +using namespace farmlands::components::items; using namespace farmlands::graphics; using namespace farmlands::input; using namespace farmlands::model; namespace farmlands { -namespace controller { +namespace components { namespace player { static const float PlayerWalkVelocity = 2.0f; // The default velocity of the player when walking (units/sec). @@ -53,14 +53,14 @@ PlayerController::~PlayerController() { } -base::Component* PlayerController::clone() +model::Component* PlayerController::clone() { return new PlayerController(); } void PlayerController::onInitialize() { - m_transform = gameObject->component(); + m_transform = gameObject->component(); } bool PlayerController::onEvent(SDL_Event& event) @@ -171,7 +171,7 @@ void PlayerController::onUpdateLogic() void PlayerController::onPreRender() { // Get sprite - SpriteRenderer* spriteRenderer = gameObject->component(); + Sprite* sprite = gameObject->component(); // Compute current state std::string stateName = (m_walking) ? "Walking " : "Idle "; @@ -185,14 +185,14 @@ void PlayerController::onPreRender() else stateName += "down"; - spriteRenderer->sprite->setState(stateName); + sprite->setState(stateName); // Set animation velocity float animVelocity = (m_running) ? 1.0f : 0.7f; // if (m_attackTimeLeft) // animVelocity = 0.1f; - spriteRenderer->sprite->setAnimationVelocity(animVelocity); + sprite->animationVelocity = animVelocity; // Set weapon if (m_currentItem) @@ -203,7 +203,7 @@ void PlayerController::onPreRender() } // Set camera - base::Transform* cam = GameState::current().renderContext.cameraTransform(); + components::basic::Transform* cam = GameState::current().renderContext.cameraTransform(); cam->x = m_transform->x; cam->y = m_transform->y - 1; } diff --git a/src/controller/player/PlayerController.h b/src/components/player/PlayerController.h similarity index 76% rename from src/controller/player/PlayerController.h rename to src/components/player/PlayerController.h index 7139220..4c0f3ac 100644 --- a/src/controller/player/PlayerController.h +++ b/src/components/player/PlayerController.h @@ -8,23 +8,23 @@ #ifndef CONTROLLER_PLAYERCONTROLLER_H_ #define CONTROLLER_PLAYERCONTROLLER_H_ -#include -#include +#include +#include #include #include namespace farmlands { -namespace controller { +namespace components { namespace player { - class PlayerController : public base::Component + class PlayerController : public model::Component { public: PlayerController(); virtual ~PlayerController(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onInitialize() override; @@ -41,15 +41,15 @@ namespace player { bool canMove(float x, float y); void attack(); - base::Transform* m_transform; + basic::Transform* m_transform; model::Direction m_facingDirection; bool m_walking, m_running; - base::GameObject* m_currentItem; + model::GameObject* m_currentItem; }; } -} /* namespace controller */ +} /* namespace components */ } /* namespace farmlands */ #endif /* CONTROLLER_PLAYERCONTROLLER_H_ */ diff --git a/src/controller/FarmlandsGame.cpp b/src/controller/FarmlandsGame.cpp index b807b09..9a20483 100644 --- a/src/controller/FarmlandsGame.cpp +++ b/src/controller/FarmlandsGame.cpp @@ -5,13 +5,9 @@ * Author: tibi */ -#include -#include -#include +#include #include #include -#include -#include #include #include @@ -20,7 +16,6 @@ #include #include -using namespace farmlands::base; using namespace farmlands::graphics; using namespace farmlands::graphics::backend; using namespace farmlands::resources; diff --git a/src/graphics/BackgroundRenderer.cpp b/src/graphics/BackgroundRenderer.cpp index 6f0bb54..1ef45ce 100644 --- a/src/graphics/BackgroundRenderer.cpp +++ b/src/graphics/BackgroundRenderer.cpp @@ -6,7 +6,7 @@ */ #include -#include +#include #include #include #include @@ -16,6 +16,7 @@ #include #include +using namespace farmlands::components; using namespace farmlands::graphics::backend; using namespace farmlands::resources; @@ -32,7 +33,7 @@ BackgroundRenderer::~BackgroundRenderer() { } -base::Component* BackgroundRenderer::clone() +model::Component* BackgroundRenderer::clone() { return new BackgroundRenderer(); } @@ -42,7 +43,7 @@ void BackgroundRenderer::onInitialize() Assert(gameObject != nullptr, "Component not properly initialized!"); m_context = &GameState::current().renderContext; - m_back = gameObject->component(); + m_back = gameObject->component(); } void BackgroundRenderer::onRender() diff --git a/src/graphics/BackgroundRenderer.h b/src/graphics/BackgroundRenderer.h index c9ae423..0fb124f 100644 --- a/src/graphics/BackgroundRenderer.h +++ b/src/graphics/BackgroundRenderer.h @@ -8,34 +8,34 @@ #ifndef GRAPHICS_BACKGROUNDRENDERER_H_ #define GRAPHICS_BACKGROUNDRENDERER_H_ -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include namespace farmlands { namespace graphics { -class BackgroundRenderer: public base::Component -{ -public: - BackgroundRenderer(); - virtual ~BackgroundRenderer(); + class BackgroundRenderer: public model::Component + { + public: + BackgroundRenderer(); + virtual ~BackgroundRenderer(); - virtual base::Component* clone() override; - virtual void dump(unsigned level) override; + virtual model::Component* clone() override; + virtual void dump(unsigned level) override; - virtual void onInitialize() override; - virtual void onRender() override; + virtual void onInitialize() override; + virtual void onRender() override; -private: - void getCell(SDL_Texture* texture, uint32_t cell, int* outX, int* outY); + private: + void getCell(SDL_Texture* texture, uint32_t cell, int* outX, int* outY); - // Private fields - base::RenderContext* m_context; - model::Background* m_back; -}; + // Private fields + graphics::RenderContext* m_context; + components::Background* m_back; + }; } /* namespace graphics */ } /* namespace farmlands */ diff --git a/src/base/RenderContext.cpp b/src/graphics/RenderContext.cpp similarity index 78% rename from src/base/RenderContext.cpp rename to src/graphics/RenderContext.cpp index 28b3518..feb7e45 100644 --- a/src/base/RenderContext.cpp +++ b/src/graphics/RenderContext.cpp @@ -4,13 +4,17 @@ * Created on: Nov 30, 2016 * Author: tibi */ -#include -#include -#include -#include + +#include +#include +#include +#include + +using namespace farmlands::components::basic; +using namespace farmlands::model; namespace farmlands { -namespace base { +namespace graphics { float RenderContext::xToWorld(float x) { @@ -36,7 +40,7 @@ float RenderContext::yToScreen(float y) return (y - m_cameraTransform->y) * cellH + viewport.height / 2; } -bool farmlands::base::RenderContext::visible(SDL_Rect& rect) +bool RenderContext::visible(SDL_Rect& rect) { SDL_Rect screen = { 0, 0, viewport.width, viewport.height }; return SDL_HasIntersection(&screen, &rect); diff --git a/src/graphics/RenderContext.h b/src/graphics/RenderContext.h new file mode 100644 index 0000000..c6350de --- /dev/null +++ b/src/graphics/RenderContext.h @@ -0,0 +1,54 @@ +/* + * RenderContext.h + * + * Created on: Nov 30, 2016 + * Author: tibi + */ + +#ifndef GRAPHICS_RENDERCONTEXT_H_ +#define GRAPHICS_RENDERCONTEXT_H_ + +#include +#include + +namespace farmlands { + +// Forward declarations +namespace model { class GameObject; } +namespace components { namespace basic { struct Transform; } } +namespace components { namespace basic { struct Camera; } } + +namespace graphics { + + class RenderContext + { + public: + float xToWorld(float x); + float yToWorld(float y); + float xToScreen(float x); + float yToScreen(float y); + + bool visible(SDL_Rect& rect); + + inline model::GameObject* cameraObj() { return m_cameraObj; } + inline components::basic::Camera* camera() { return m_camera; } + inline components::basic::Transform* cameraTransform() { return m_cameraTransform; } + + void setCamera(model::GameObject* camera); + + /** + * Screen properties + */ + model::Viewport viewport; + float uiScale = 1.0f; + + private: + model::GameObject* m_cameraObj; + components::basic::Transform* m_cameraTransform; + components::basic::Camera* m_camera; + }; + +} +} + +#endif /* GRAPHICS_RENDERCONTEXT_H_ */ diff --git a/src/graphics/SpriteRenderer.cpp b/src/graphics/SpriteRenderer.cpp index cb65dce..01a3341 100644 --- a/src/graphics/SpriteRenderer.cpp +++ b/src/graphics/SpriteRenderer.cpp @@ -6,14 +6,15 @@ */ #include -#include -#include +#include +#include #include #include #include #include +using namespace farmlands::components::basic; using namespace farmlands::graphics::backend; using namespace farmlands::resources; @@ -21,31 +22,26 @@ namespace farmlands { namespace graphics { SpriteRenderer::SpriteRenderer() - : sprite(nullptr), - m_transform(nullptr), - m_context(nullptr) + : m_transform(nullptr), + m_context(nullptr), + m_sprite(nullptr) { } SpriteRenderer::~SpriteRenderer() { - delete sprite; } -base::Component* SpriteRenderer::clone() +model::Component* SpriteRenderer::clone() { - SpriteRenderer* clone = new SpriteRenderer(); - clone->sprite = new base::Sprite(*sprite); - - return clone; + return new SpriteRenderer(); } void SpriteRenderer::onInitialize() { - Assert(gameObject != nullptr, "Component not properly initialized!"); - - m_transform = gameObject->component(); m_context = &GameState::current().renderContext; + m_transform = gameObject->component(); + m_sprite = gameObject->component(); } void SpriteRenderer::onRender() @@ -53,27 +49,27 @@ void SpriteRenderer::onRender() float posX = m_context->xToScreen(m_transform->globalX()); float posY = m_context->yToScreen(m_transform->globalY()); - float w = sprite->currentFrame().width * m_context->viewport.pixelsPerUnitX; - float h = sprite->currentFrame().height * m_context->viewport.pixelsPerUnitY; + float w = m_sprite->currentFrame().width * m_context->viewport.pixelsPerUnitX; + float h = m_sprite->currentFrame().height * m_context->viewport.pixelsPerUnitY; // Compute destination rectangle float scale = m_context->camera()->scale; SDL_Rect dest; - dest.x = posX - sprite->anchorX * w * scale; - dest.y = posY - sprite->anchorY * h * scale; + dest.x = posX - m_sprite->anchorX * w * scale; + dest.y = posY - m_sprite->anchorY * h * scale; dest.w = w * scale; dest.h = h * scale; if (m_context->visible(dest)) { // Obtain texture - int texId = sprite->currentFrame().tileSetId; + int texId = m_sprite->currentFrame().tileSetId; SDL_Texture* texture = resources::ResourceManager::instance().texture(texId); // Compute source rectangle SDL_Rect src; - getCell(texture, sprite->currentFrame().tileSetCell, &src.x, &src.y); + getCell(texture, m_sprite->currentFrame().tileSetCell, &src.x, &src.y); src.w = w; src.h = h; @@ -82,14 +78,6 @@ void SpriteRenderer::onRender() } } -void SpriteRenderer::onPostRender() -{ - float animFps = GameState::current().config->animationFps; - float deltaTime = GameState::current().elapsedTime; - - sprite->advanceTime(animFps * deltaTime); -} - void SpriteRenderer::getCell(SDL_Texture* texture, uint32_t cell, int* outX, int* outY) { int texWidth, texHeight; @@ -108,8 +96,7 @@ void SpriteRenderer::dump(unsigned level) for (unsigned i = 0; i < level; i++) std::cout<<" "; - std::cout << " .Component: SpriteRenderer sprite="; - std::cout << sprite->name <<"\n"; + std::cout << " .Component: SpriteRenderer\n"; } } /* namespace graphics */ diff --git a/src/graphics/SpriteRenderer.h b/src/graphics/SpriteRenderer.h index 9fc458c..954f0de 100644 --- a/src/graphics/SpriteRenderer.h +++ b/src/graphics/SpriteRenderer.h @@ -8,38 +8,35 @@ #ifndef GRAPHICS_SPRITERENDERER_H_ #define GRAPHICS_SPRITERENDERER_H_ -#include -#include -#include -#include +#include +#include +#include +#include #include namespace farmlands { namespace graphics { - class SpriteRenderer: public base::Component + class SpriteRenderer: public model::Component { public: SpriteRenderer(); virtual ~SpriteRenderer(); - virtual base::Component* clone() override; + virtual model::Component* clone() override; virtual void dump(unsigned level) override; virtual void onInitialize() override; virtual void onRender() override; - virtual void onPostRender() override; - - // Public fields - base::Sprite* sprite; private: void getCell(SDL_Texture* texture, uint32_t cell, int* outX, int* outY); // Private fields - base::Transform* m_transform; - base::RenderContext* m_context; + graphics::RenderContext* m_context; + components::basic::Transform* m_transform; + components::basic::Sprite* m_sprite; }; } /* namespace graphics */ diff --git a/src/graphics/backend/SdlRenderer.cpp b/src/graphics/backend/SdlRenderer.cpp index 7e64200..6e75fef 100644 --- a/src/graphics/backend/SdlRenderer.cpp +++ b/src/graphics/backend/SdlRenderer.cpp @@ -44,7 +44,7 @@ SdlRenderer::~SdlRenderer() SDL_Quit(); } -bool SdlRenderer::initialize(base::RenderContext* renderContext) +bool SdlRenderer::initialize(graphics::RenderContext* renderContext) { if (SDL_Init(SDL_INIT_VIDEO) != 0) { std::cerr << "Failed to initialize SDL!\n"; diff --git a/src/graphics/backend/SdlRenderer.h b/src/graphics/backend/SdlRenderer.h index c9b0e21..7d247a4 100644 --- a/src/graphics/backend/SdlRenderer.h +++ b/src/graphics/backend/SdlRenderer.h @@ -8,7 +8,7 @@ #ifndef GRAPHICS_SDLRENDERER_H_ #define GRAPHICS_SDLRENDERER_H_ -#include +#include #include @@ -31,7 +31,7 @@ namespace backend { * * @returns true if successful, false otherwise. */ - bool initialize(base::RenderContext* renderContext); + bool initialize(graphics::RenderContext* renderContext); /** * Performs steps for beginning to render. diff --git a/src/gui/layout/Canvas.cpp b/src/gui/layout/Canvas.cpp index 805a928..cb853aa 100644 --- a/src/gui/layout/Canvas.cpp +++ b/src/gui/layout/Canvas.cpp @@ -19,7 +19,7 @@ Canvas::~Canvas() { } -void Canvas::render(base::RenderContext* context) +void Canvas::render(graphics::RenderContext* context) { for (auto child : m_children) child->render(context); diff --git a/src/gui/layout/Canvas.h b/src/gui/layout/Canvas.h index d46d9fd..20b3d45 100644 --- a/src/gui/layout/Canvas.h +++ b/src/gui/layout/Canvas.h @@ -20,7 +20,7 @@ namespace layout { Canvas(); virtual ~Canvas(); - virtual void render(base::RenderContext* context) override; + virtual void render(graphics::RenderContext* context) override; }; } diff --git a/src/gui/primitives/UIElement.cpp b/src/gui/primitives/UIElement.cpp index f113ab0..601a467 100644 --- a/src/gui/primitives/UIElement.cpp +++ b/src/gui/primitives/UIElement.cpp @@ -27,7 +27,7 @@ UIElement::~UIElement() { } -void UIElement::render(base::RenderContext* context) +void UIElement::render(graphics::RenderContext* context) { if (m_backColor.a > 0) { diff --git a/src/gui/primitives/UIElement.h b/src/gui/primitives/UIElement.h index 7facf2a..0d28484 100644 --- a/src/gui/primitives/UIElement.h +++ b/src/gui/primitives/UIElement.h @@ -10,7 +10,7 @@ #include -#include +#include namespace farmlands { namespace gui { @@ -22,7 +22,7 @@ namespace primitives { UIElement(); virtual ~UIElement(); - virtual void render(base::RenderContext* context); + virtual void render(graphics::RenderContext* context); virtual bool handleEvent(SDL_Event& event); // Getters & setters diff --git a/src/gui/widgets/TextArea.cpp b/src/gui/widgets/TextArea.cpp index a9910a4..c925915 100644 --- a/src/gui/widgets/TextArea.cpp +++ b/src/gui/widgets/TextArea.cpp @@ -41,7 +41,7 @@ TextArea::~TextArea() { } -void TextArea::render(base::RenderContext* context) +void TextArea::render(graphics::RenderContext* context) { UIElement::render(context); @@ -258,7 +258,7 @@ void TextArea::wrapText(TTF_Font* font) m_wrappedText.erase(m_wrappedText.size() - 1); } -void TextArea::renderLines(base::RenderContext* context, TTF_Font* font) +void TextArea::renderLines(graphics::RenderContext* context, TTF_Font* font) { // Clean up old textures for (SDL_Texture* tex : m_renderedLines) diff --git a/src/gui/widgets/TextArea.h b/src/gui/widgets/TextArea.h index c04a6a7..80639a7 100644 --- a/src/gui/widgets/TextArea.h +++ b/src/gui/widgets/TextArea.h @@ -49,7 +49,7 @@ namespace widgets { TextArea(); virtual ~TextArea(); - virtual void render(base::RenderContext* context) override; + virtual void render(graphics::RenderContext* context) override; // Getters and setters inline std::string text() const { return m_text; } @@ -71,7 +71,7 @@ namespace widgets { private: void wrapText(TTF_Font* font); - void renderLines(base::RenderContext* context, TTF_Font* font); + void renderLines(graphics::RenderContext* context, TTF_Font* font); std::string m_text; std::string m_wrappedText; diff --git a/src/base/Component.cpp b/src/model/Component.cpp similarity index 89% rename from src/base/Component.cpp rename to src/model/Component.cpp index 1114d27..b243391 100644 --- a/src/base/Component.cpp +++ b/src/model/Component.cpp @@ -5,10 +5,10 @@ * Author: tibi */ -#include +#include namespace farmlands { -namespace base { +namespace model { Component::Component() : gameObject(nullptr) @@ -61,7 +61,7 @@ void Component::onDisable() } } -/* namespace base */ +/* namespace model */ } /* namespace farmlands */ diff --git a/src/base/Component.h b/src/model/Component.h similarity index 88% rename from src/base/Component.h rename to src/model/Component.h index e04f7f8..1825a12 100644 --- a/src/base/Component.h +++ b/src/model/Component.h @@ -8,13 +8,13 @@ #ifndef COMPONENT_H_ #define COMPONENT_H_ -#include -#include +#include +#include #include namespace farmlands { -namespace base { +namespace model { class GameObject; @@ -44,7 +44,7 @@ namespace base { }; } -/* namespace base */ +/* namespace model */ } /* namespace farmlands */ #endif /* COMPONENT_H_ */ diff --git a/src/base/GameObject.cpp b/src/model/GameObject.cpp similarity index 87% rename from src/base/GameObject.cpp rename to src/model/GameObject.cpp index 9c232a5..ecb6f83 100644 --- a/src/base/GameObject.cpp +++ b/src/model/GameObject.cpp @@ -6,13 +6,13 @@ */ #include -#include -#include +#include +#include #include namespace farmlands { -namespace base { +namespace model { GameObject::GameObject() : name("unnamed"), @@ -87,20 +87,30 @@ void GameObject::addChild(GameObject* obj) obj->m_parent = this; } -GameObject* GameObject::removeChild(size_t index) +GameObject* GameObject::removeChild(GameObject::iterator it) { - GameObject* child = m_children.at(index); - child->m_parent = nullptr; - - m_children.erase(m_children.begin() + index); - - return child; + m_children.erase(it); + return *it; } -void GameObject::destroyChild(size_t index) +GameObject* GameObject::removeChild(GameObject* obj) { - delete m_children.at(index); - m_children.erase(m_children.begin() + index); + for (auto it = m_children.begin(); it != m_children.end(); it++) + { + if (*it == obj) + { + m_children.erase(it); + return *it; + } + } + + return nullptr; +} + +void GameObject::destroyChild(GameObject::iterator it) +{ + delete *it; + m_children.erase(it); } void GameObject::destroyChild(GameObject* obj) @@ -116,14 +126,19 @@ void GameObject::destroyChild(GameObject* obj) } } -size_t GameObject::childrenCount() const +size_t GameObject::childrenSize() const { return m_children.size(); } -GameObject* GameObject::child(size_t index) +GameObject::iterator GameObject::childrenBegin() { - return m_children.at(index); + return m_children.begin(); +} + +GameObject::iterator GameObject::childrenEnd() +{ + return m_children.end(); } GameObject* GameObject::parent() @@ -286,11 +301,5 @@ void GameObject::dumpTree(unsigned level) child->dumpTree(level + 1); } -} /* namespace base */ +} /* namespace model */ } /* namespace farmlands */ - - - - - - diff --git a/src/base/GameObject.h b/src/model/GameObject.h similarity index 88% rename from src/base/GameObject.h rename to src/model/GameObject.h index 594e8ce..bbb044f 100644 --- a/src/base/GameObject.h +++ b/src/model/GameObject.h @@ -8,8 +8,8 @@ #ifndef GAMEOBJECT_H_ #define GAMEOBJECT_H_ -#include -#include +#include +#include #include #include @@ -19,7 +19,7 @@ #include namespace farmlands { -namespace base { +namespace model { class Component; class RenderContext; @@ -27,10 +27,11 @@ namespace base { class GameObject : public INonAssignable, public ICloneable { public: + typedef std::vector::iterator iterator; + // Constructors GameObject(); virtual ~GameObject(); - virtual GameObject* clone() override; static GameObject* instantiate(GameObject* gameObject, std::string name, GameObject* parent); @@ -43,11 +44,15 @@ namespace base { // Tree methods void addChild(GameObject* obj); - GameObject* removeChild(size_t index); - void destroyChild(size_t index); + GameObject* removeChild(iterator it); + GameObject* removeChild(GameObject* obj); + void destroyChild(iterator it); void destroyChild(GameObject* obj); - GameObject* child(size_t index); - size_t childrenCount() const; + + size_t childrenSize() const; + iterator childrenBegin(); + iterator childrenEnd(); + GameObject* parent(); // Game object methods @@ -132,7 +137,7 @@ namespace base { return m_components.erase(typeIndex); } -} /* namespace base */ +} /* namespace model */ } /* namespace farmlands */ #endif /* GAMEOBJECT_H_ */ diff --git a/src/base/ICloneable.h b/src/model/ICloneable.h similarity index 94% rename from src/base/ICloneable.h rename to src/model/ICloneable.h index 6bdaf35..b7cbcb4 100644 --- a/src/base/ICloneable.h +++ b/src/model/ICloneable.h @@ -9,7 +9,7 @@ #define BASE_ICLONEABLE_H_ namespace farmlands { -namespace base { +namespace model { template class ICloneable diff --git a/src/base/INonAssignable.h b/src/model/INonAssignable.h similarity index 95% rename from src/base/INonAssignable.h rename to src/model/INonAssignable.h index 573a8e8..9fd696b 100644 --- a/src/base/INonAssignable.h +++ b/src/model/INonAssignable.h @@ -9,7 +9,7 @@ #define BASE_INONASSIGNABLE_H_ namespace farmlands { -namespace base { +namespace model { class INonAssignable { diff --git a/src/model/Scene.h b/src/model/Scene.h index f19f66c..3bb4a73 100644 --- a/src/model/Scene.h +++ b/src/model/Scene.h @@ -8,7 +8,7 @@ #ifndef MODEL_SCENE_H_ #define MODEL_SCENE_H_ -#include +#include #include @@ -18,7 +18,7 @@ namespace model { struct Scene { uint32_t cellWidth = 1, cellHeight = 1; - base::GameObject root; + model::GameObject root; }; } /* namespace model */ diff --git a/src/base/Viewport.h b/src/model/Viewport.h similarity index 94% rename from src/base/Viewport.h rename to src/model/Viewport.h index f3cbaae..ab974b2 100644 --- a/src/base/Viewport.h +++ b/src/model/Viewport.h @@ -9,7 +9,7 @@ #define MODEL_VIEWPORT_H_ namespace farmlands { -namespace base { +namespace model { struct Viewport { diff --git a/src/resources/ResourceManager.h b/src/resources/ResourceManager.h index dd1430d..2b189a5 100644 --- a/src/resources/ResourceManager.h +++ b/src/resources/ResourceManager.h @@ -8,7 +8,7 @@ #ifndef STORAGE_RESOURCEMANAGER_H_ #define STORAGE_RESOURCEMANAGER_H_ -#include +#include #include #include diff --git a/src/storage/Parsers.cpp b/src/storage/Parsers.cpp index dc7931a..0d0869e 100644 --- a/src/storage/Parsers.cpp +++ b/src/storage/Parsers.cpp @@ -8,170 +8,20 @@ #include #include +using namespace farmlands::components; +using namespace farmlands::components::basic; +using namespace farmlands::components::items; +using namespace farmlands::components::player; +using namespace farmlands::graphics; +using namespace farmlands::model; using namespace farmlands::resources; namespace farmlands { namespace storage { -/****** Base namespace ******/ +/****** Components ******/ -template <> -base::Camera* parse (boost::property_tree::ptree& root) -{ - if (root.front().first == "Camera") - root = root.front().second; - - base::Camera* camera = new base::Camera(); - camera->scale = root.get(".scale", 1.0f); - camera->mainCamera = root.get(".mainCamera", false); - return camera; -} - -template <> -base::Frame* parse (boost::property_tree::ptree& root) -{ - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Frame") - root = root.front().second; - - base::Frame* frame = new base::Frame(); - - // Obtine tile set id - std::string tileSetPath = root.get(".tileSet"); - frame->tileSetId = resources::ResourceManager::instance().getId(tileSetPath); - - // Set properties - frame->tileSetCell = root.get(".cell"); - frame->width = root.get(".w", 1u); - frame->height = root.get(".h", 1u); - frame->duration = root.get(".duration"); - - return frame; -} - -template <> -base::GameObject* parse (boost::property_tree::ptree& root) -{ - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "GameObject") - root = root.front().second; - - base::GameObject* gameObj = new base::GameObject(); - gameObj->name = root.get(".name"); - - for (auto child : root) - { - // Base objects - if (child.first == "Transform") - gameObj->addComponent(parse(child.second)); - - else if (child.first == "Camera") - gameObj->addComponent(parse(child.second)); - - // Model - else if (child.first == "Background") - { - std::string path = child.second.get(".src"); - resources::ResourceId id = resources::ResourceManager::instance().getId(path); - gameObj->addComponent(parse(id)); - } - - else if (child.first == "Item") - gameObj->addComponent(parse(child.second)); - - // Graphics - else if (child.first == "BackgroundRenderer") - gameObj->addComponent(parse(child.second)); - - else if (child.first == "SpriteRenderer") - gameObj->addComponent(parse(child.second)); - - // Controllers - else if (child.first == "DebugController") - gameObj->addComponent(parse(child.second)); - - else if (child.first == "Giftable") - gameObj->addComponent(parse(child.second)); - - else if (child.first == "Weapon") - gameObj->addComponent(parse(child.second)); - - else if (child.first == "PlayerController") - gameObj->addComponent(parse(child.second)); - - // !!! Add additional types here !!! - } - - return gameObj; -} - -template <> -base::Sprite* parse (boost::property_tree::ptree& root) -{ - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Sprite") - root = root.front().second; - - base::Sprite* sprite = new base::Sprite(); - sprite->anchorX = root.get(".anchorX"); - sprite->anchorY = root.get(".anchorY"); - - for (auto child : root) - { - if (child.first == "State") - { - base::SpriteState* state = parse(child.second); - sprite->addState(*state); - delete state; - } - } - - return sprite; -} - -template <> -base::SpriteState* parse (boost::property_tree::ptree& root) -{ - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "SpriteState") - root = root.front().second; - - base::SpriteState* spriteState = new base::SpriteState(); - spriteState->name = root.get(".name"); - - for (auto child : root) - { - if (child.first == "Frame") - { - base::Frame* frame = parse(child.second); - spriteState->frames.push_back(*frame); - delete frame; - } - } - - return spriteState; -} - -template <> -base::Transform* parse (boost::property_tree::ptree& root) -{ - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Transform") - root = root.front().second; - - base::Transform* transform = new base::Transform(); - transform->x = root.get(".x", 0.0f); - transform->y = root.get(".y", 0.0f); - transform->w = root.get(".w", 0.0f); - transform->h = root.get(".h", 0.0f); - - return transform; -} - - -/****** Model namespace ******/ - -void parseBackgroundCells(resources::ResourceId cellsResource, model::Background* back, size_t layer) +void parseBackgroundCells(resources::ResourceId cellsResource, Background* back, size_t layer) { Assert(RInfo[cellsResource].type == ResourceType::BackgroundLayer, "Resource must be a level layer."); @@ -195,7 +45,7 @@ void parseBackgroundCells(resources::ResourceId cellsResource, model::Background char* nextNum = strtok(buffer, ",;"); for (size_t col = 0; col < back->columnCount() && nextNum != NULL; col++) { - model::Cell cell = (model::Cell)strtol(nextNum, NULL, 10); + Cell cell = (Cell) strtol(nextNum, NULL, 10); back->setCell(layer, row, col, cell); nextNum = strtok(NULL, ",;"); @@ -206,19 +56,27 @@ void parseBackgroundCells(resources::ResourceId cellsResource, model::Background } template <> -model::Background* parse (boost::property_tree::ptree& root) +Background* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) if (root.front().first == "Background") root = root.front().second; + // This object can be declared in another file + std::string src = root.get(".src", ""); + if (!src.empty()) + { + ResourceId id = ResourceManager::instance().getId(src); + return parse(id); + } + // Read sizes uint32_t layers = root.count("Layer"); uint32_t rows = root.get(".rows"); uint32_t cols = root.get(".columns"); // Create background object - model::Background* back = new model::Background(layers, rows, cols); + Background* back = new Background(layers, rows, cols); // Read layers size_t layerNum = 0; @@ -245,91 +103,144 @@ model::Background* parse (boost::property_tree::ptree& root) } template <> -model::Configuration* parse (boost::property_tree::ptree& root) +Camera* parse (boost::property_tree::ptree& root) { - // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Configuration") + if (root.front().first == "Camera") root = root.front().second; - model::Configuration* config = new model::Configuration(); - config->animationFps = root.get("animationFps"); - - return config; + Camera* camera = new Camera(); + camera->scale = root.get(".scale", 1.0f); + camera->mainCamera = root.get(".mainCamera", false); + return camera; } template <> -model::Item* parse (boost::property_tree::ptree& root) +Frame* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Item") + if (root.front().first == "Frame") root = root.front().second; - // Parse - model::Item* item = new model::Item(); - item->name = root.get(".name"); - item->description = root.get(".description"); - item->level = root.get(".level"); - return item; + Frame* frame = new Frame(); + + // Obtine tile set id + std::string tileSetPath = root.get(".tileSet"); + frame->tileSetId = resources::ResourceManager::instance().getId(tileSetPath); + + // Set properties + frame->tileSetCell = root.get(".cell"); + frame->width = root.get(".w", 1u); + frame->height = root.get(".h", 1u); + frame->duration = root.get(".duration"); + + return frame; } template <> -model::Scene* parse (boost::property_tree::ptree& root) +Sprite* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) - if (root.front().first == "Scene") + if (root.front().first == "Sprite") root = root.front().second; - model::Scene* scene = new model::Scene(); - scene->cellWidth = root.get(".cellWidth"); - scene->cellHeight = root.get(".cellHeight"); + // This object can be declared in another file + std::string src = root.get(".src", ""); + if (!src.empty()) + { + ResourceId id = ResourceManager::instance().getId(src); + return parse(id); + } + + // Parse sprite + Sprite* sprite = new Sprite(); + sprite->anchorX = root.get(".anchorX"); + sprite->anchorY = root.get(".anchorY"); + sprite->animationVelocity = root.get(".animationVelocity", 1.0f); for (auto child : root) { - if (child.first == "GameObject") + if (child.first == "State") { - base::GameObject* obj = parse(child.second); - scene->root.addChild(obj); + SpriteState* state = parse(child.second); + sprite->addState(*state); + delete state; } } - return scene; + return sprite; } +template <> +SpriteState* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "SpriteState") + root = root.front().second; -/****** Controller namespace ******/ + SpriteState* spriteState = new SpriteState(); + spriteState->name = root.get(".name"); + + for (auto child : root) + { + if (child.first == "Frame") + { + Frame* frame = parse(child.second); + spriteState->frames.push_back(*frame); + delete frame; + } + } + + return spriteState; +} template <> -controller::DebugController* parse (boost::property_tree::ptree& root) +Transform* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "Transform") + root = root.front().second; + + Transform* transform = new Transform(); + transform->x = root.get(".x", 0.0f); + transform->y = root.get(".y", 0.0f); + transform->w = root.get(".w", 0.0f); + transform->h = root.get(".h", 0.0f); + + return transform; +} + +template <> +DebugController* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) if (root.front().first == "DebugController") root = root.front().second; - controller::DebugController* controller = new controller::DebugController(); + DebugController* controller = new DebugController(); return controller; } template <> -controller::items::Giftable* parse (boost::property_tree::ptree& root) +Giftable* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) if (root.front().first == "Giftable") root = root.front().second; // Parse - return new controller::items::Giftable(); + return new Giftable(); } template <> -controller::items::Weapon* parse (boost::property_tree::ptree& root) +Weapon* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) if (root.front().first == "Weapon") root = root.front().second; // Parse - controller::items::Weapon* weapon = new controller::items::Weapon(); + Weapon* weapon = new Weapon(); weapon->damage = root.get(".damage"); weapon->critProbability = root.get(".critProbability"); weapon->critDamage = root.get(".critDamage"); @@ -338,18 +249,18 @@ controller::items::Weapon* parse (boost::property_tre } template <> -controller::player::PlayerController* parse (boost::property_tree::ptree& root) +PlayerController* parse (boost::property_tree::ptree& root) { // Ensure we are on the scene node (property tree seems to add root of its own) if (root.front().first == "PlayerController") root = root.front().second; - controller::player::PlayerController* controller = new controller::player::PlayerController(); + PlayerController* controller = new PlayerController(); return controller; } -/****** Graphics namespace ******/ +/****** Graphics ******/ template <> graphics::BackgroundRenderer* parse (boost::property_tree::ptree& root) @@ -370,15 +281,127 @@ graphics::SpriteRenderer* parse (boost::property_tree: root = root.front().second; graphics::SpriteRenderer* renderer = new graphics::SpriteRenderer(); - - // Load sprite - std::string spritePath = root.get(".sprite"); - resources::ResourceId spriteId = resources::ResourceManager::instance().getId(spritePath); - renderer->sprite = parse(spriteId); - return renderer; } + +/****** Model ******/ + +template <> +GameObject* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "GameObject") + root = root.front().second; + + GameObject* gameObj = new GameObject(); + gameObj->name = root.get(".name"); + + for (auto child : root) + { + // Components::basic + if (child.first == "Camera") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "Sprite") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "Transform") + gameObj->addComponent(parse(child.second)); + + // Components::items + else if (child.first == "Giftable") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "Item") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "Weapon") + gameObj->addComponent(parse(child.second)); + + // Components::player + else if (child.first == "PlayerController") + gameObj->addComponent(parse(child.second)); + + // Components + else if (child.first == "Background") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "DebugController") + gameObj->addComponent(parse(child.second)); + + // Graphics + else if (child.first == "BackgroundRenderer") + gameObj->addComponent(parse(child.second)); + + else if (child.first == "SpriteRenderer") + gameObj->addComponent(parse(child.second)); + + // !!! Add additional types here !!! + } + + return gameObj; +} + +template <> +Configuration* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "Configuration") + root = root.front().second; + + Configuration* config = new Configuration(); + config->animationFps = root.get("animationFps"); + + return config; +} + +template <> +Item* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "Item") + root = root.front().second; + + // Parse + Item* item = new Item(); + item->name = root.get(".name"); + item->description = root.get(".description"); + item->level = root.get(".level"); + return item; +} + +template <> +Scene* parse (boost::property_tree::ptree& root) +{ + // Ensure we are on the scene node (property tree seems to add root of its own) + if (root.front().first == "Scene") + root = root.front().second; + + Scene* scene = new Scene(); + scene->cellWidth = root.get(".cellWidth"); + scene->cellHeight = root.get(".cellHeight"); + + for (auto child : root) + { + if (child.first == "GameObject") + { + GameObject* obj = parse(child.second); + scene->root.addChild(obj); + } + } + + return scene; +} + + +/****** Controller namespace ******/ + + + + + + } } diff --git a/src/storage/Parsers.h b/src/storage/Parsers.h index 6b3e082..9783472 100644 --- a/src/storage/Parsers.h +++ b/src/storage/Parsers.h @@ -8,80 +8,65 @@ #ifndef STORAGE_PARSERS_PARSERS_H_ #define STORAGE_PARSERS_PARSERS_H_ -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include + +#include #include -#include #include + #include namespace farmlands { namespace storage { - /****** Base namespace ******/ + /****** Components ******/ template <> - base::Camera* parse (boost::property_tree::ptree& root); + components::Background* parse (boost::property_tree::ptree& root); template <> - base::Frame* parse (boost::property_tree::ptree& root); + components::basic::Camera* parse (boost::property_tree::ptree& root); template <> - base::GameObject* parse (boost::property_tree::ptree& root); + components::basic::Frame* parse (boost::property_tree::ptree& root); template <> - base::Sprite* parse (boost::property_tree::ptree& root); + components::basic::Sprite* parse (boost::property_tree::ptree& root); template <> - base::SpriteState* parse (boost::property_tree::ptree& root); + components::basic::SpriteState* parse (boost::property_tree::ptree& root); template <> - base::Transform* parse (boost::property_tree::ptree& root); - - - /****** Model namespace ******/ + components::basic::Transform* parse (boost::property_tree::ptree& root); template <> - model::Background* parse (boost::property_tree::ptree& root); + components::DebugController* parse (boost::property_tree::ptree& root); template <> - model::Configuration* parse (boost::property_tree::ptree& root); + components::items::Giftable* parse (boost::property_tree::ptree& root); template <> - model::Item* parse (boost::property_tree::ptree& root); + components::items::Item* parse (boost::property_tree::ptree& root); template <> - model::Scene* parse (boost::property_tree::ptree& root); - - - /****** Controller namespace ******/ + components::items::Weapon* parse (boost::property_tree::ptree& root); template <> - controller::DebugController* parse (boost::property_tree::ptree& root); - - template <> - controller::items::Giftable* parse (boost::property_tree::ptree& root); - - template <> - controller::items::Weapon* parse (boost::property_tree::ptree& root); - - template <> - controller::DebugController* parse (boost::property_tree::ptree& root); + components::player::PlayerController* parse (boost::property_tree::ptree& root); - template <> - controller::player::PlayerController* parse (boost::property_tree::ptree& root); - - - /****** Graphics namespace ******/ + /****** Graphics ******/ template <> graphics::BackgroundRenderer* parse (boost::property_tree::ptree& root); @@ -90,6 +75,18 @@ namespace storage { graphics::SpriteRenderer* parse (boost::property_tree::ptree& root); + /****** Model ******/ + + template <> + model::GameObject* parse (boost::property_tree::ptree& root); + + + template <> + model::Configuration* parse (boost::property_tree::ptree& root); + + template <> + model::Scene* parse (boost::property_tree::ptree& root); + } }