diff --git a/SFMLEngine/makingAGameTick/SceneNode.cpp b/SFMLEngine/makingAGameTick/SceneNode.cpp index 9c6b10f..dfd5508 100644 --- a/SFMLEngine/makingAGameTick/SceneNode.cpp +++ b/SFMLEngine/makingAGameTick/SceneNode.cpp @@ -47,4 +47,40 @@ void SceneNode::draw(sf::RenderTarget& target, sf::RenderStates states) const } } +void SceneNode::updateCurrent(sf::Time deltaTime) +{ + +} + +void SceneNode::updateChildren(sf::Time deltaTime) +{ + for (const ScenePointer& child : mChildren) + { + child -> update(deltaTime); // we also need to draw all the child nodes + } +} + +void SceneNode::update(sf::Time deltaTime) +{ + updateCurrent(deltaTime); + updateChildren(deltaTime); +} + +sf::Transform SceneNode::getWorldTransform() const +{ + sf::Transform transform = sf::Transform::Identity; // sf::Transform::Identity represents the identity transform - it does not have any effecft on the object, it is not necessary in the code but it clarifies how transforms are applied + for (const SceneNode* node = this; node != nullptr; node = node -> mParent) + { + transform = node -> getTransform() * transform; + } + return transform; +} + +sf::Vector2f SceneNode::getWorldPosition() const +{ + return getWorldTransform() * sf::Vector2f(); +} + + + #endif diff --git a/SFMLEngine/makingAGameTick/SceneNode.hpp b/SFMLEngine/makingAGameTick/SceneNode.hpp index d3bf0d6..aed2ff9 100644 --- a/SFMLEngine/makingAGameTick/SceneNode.hpp +++ b/SFMLEngine/makingAGameTick/SceneNode.hpp @@ -13,6 +13,7 @@ class SceneNode : public sf::Transformable, public sf::Drawable, private sf::Non //SceneNode(); void attachChild(ScenePointer child); ScenePointer detachChild(const SceneNode& node); + void update(sf::Time deltaTime); private: virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; // we override draw() function of sf::Drawable // Virtual functions are member functions whose behavior can be overridden in derived classes @@ -23,6 +24,10 @@ class SceneNode : public sf::Transformable, public sf::Drawable, private sf::Non window.draw(*node); */ virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const; // draws only the current object, and not the children + virtual void updateCurrent(sf::Time deltaTime); // we reuse scene graph to reach all entities with world update, this one updates current node + void updateChildren(sf::Time deltaTime); // this one updates child nodes + sf::Transform getWorldTransform() const; // it takes into account all the parent transform + sf::Vector2f getWorldPosition() const; private: std::vector mChildren; SceneNode* mParent; diff --git a/SFMLEngine/makingAGameTick/aircraft.cpp b/SFMLEngine/makingAGameTick/aircraft.cpp index ca9b454..e75bb9d 100644 --- a/SFMLEngine/makingAGameTick/aircraft.cpp +++ b/SFMLEngine/makingAGameTick/aircraft.cpp @@ -1,9 +1,32 @@ #ifndef AIRCRAFT_CPP #define AIRCRAFT_CPP -Aircraft::Aircraft(Type type) : mType(type) +Textures::ID toTextureID(Aircraft::Type type) { - + switch (type) + { + case Aircraft::Eagle: + return Textures::Eagle; + + case Aircraft::Raptor: + return Textures::Raptor; + + default: + return Textures::Eagle; + } + return Textures::Eagle; +} + + +Aircraft::Aircraft(Type type, const TextureHolder& textures) : mType(type), mSprite(textures.get(toTextureID(type))) +{ + sf::FloatRect bounds = mSprite.getLocalBounds(); // we get local bounding rectangle which means that we do not take transforms into account, as opposed to getGlobalBounds() + mSprite.setOrigin(bounds.width / 2.f, bounds.height / 2.f); // we want to set origin of the sprite to the middle of a rectangle around it +} + +void Aircraft::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const +{ + target.draw(mSprite, states); } #endif diff --git a/SFMLEngine/makingAGameTick/aircraft.hpp b/SFMLEngine/makingAGameTick/aircraft.hpp index a2b254f..1343d84 100644 --- a/SFMLEngine/makingAGameTick/aircraft.hpp +++ b/SFMLEngine/makingAGameTick/aircraft.hpp @@ -12,10 +12,12 @@ class Aircraft : public Entity Raptor }; public: - explicit Aircraft(Type type); + explicit Aircraft(Type type, const TextureHolder& textures); + virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const; private: Type mType; + sf::Sprite mSprite; }; diff --git a/SFMLEngine/makingAGameTick/app b/SFMLEngine/makingAGameTick/app index 657c183..e0b64d2 100755 Binary files a/SFMLEngine/makingAGameTick/app and b/SFMLEngine/makingAGameTick/app differ diff --git a/SFMLEngine/makingAGameTick/entity.cpp b/SFMLEngine/makingAGameTick/entity.cpp index 6532a2b..4f3e1a4 100644 --- a/SFMLEngine/makingAGameTick/entity.cpp +++ b/SFMLEngine/makingAGameTick/entity.cpp @@ -17,4 +17,9 @@ sf::Vector2f Entity::getVelocity() const return mVelocity; } +void Entity::updateCurrent(sf::Time deltaTime) +{ + move(mVelocity * deltaTime.asSeconds()); // shortcut for setPosition(getPosition() + offset) +} + #endif diff --git a/SFMLEngine/makingAGameTick/entity.hpp b/SFMLEngine/makingAGameTick/entity.hpp index 81cfa89..dee1bac 100644 --- a/SFMLEngine/makingAGameTick/entity.hpp +++ b/SFMLEngine/makingAGameTick/entity.hpp @@ -12,6 +12,7 @@ class Entity : public SceneNode private: sf::Vector2f mVelocity; // default ocnstructor initializes this vector to a zero vector + virtual void updateCurrent(sf::Time deltaTime); }; diff --git a/SFMLEngine/makingAGameTick/game.cpp b/SFMLEngine/makingAGameTick/game.cpp index b86b4d2..aa6e7a7 100644 --- a/SFMLEngine/makingAGameTick/game.cpp +++ b/SFMLEngine/makingAGameTick/game.cpp @@ -12,6 +12,7 @@ + class Game { public: @@ -29,14 +30,14 @@ class Game bool mIsMovingDown = false; private: sf::RenderWindow mWindow; - ResourceHolder mTexture; + TextureHolder mTexture; sf::Sprite mPlayer; }; Game::Game() : mWindow(sf::VideoMode(640, 480), "SFML Application"), mTexture(), mPlayer() { - mTexture.load(Textures::Airplane, PATH_TO_PLAYER_TEXTURE); - mPlayer.setTexture(mTexture.get(Textures::Airplane)); + mTexture.load(Textures::Eagle, PATH_TO_PLAYER_TEXTURE); + mPlayer.setTexture(mTexture.get(Textures::Eagle)); mPlayer.setPosition(PLAYER_X_POSITION, PLAYER_Y_POSITION); } diff --git a/SFMLEngine/makingAGameTick/game.o b/SFMLEngine/makingAGameTick/game.o index e8beb9b..f47628b 100644 Binary files a/SFMLEngine/makingAGameTick/game.o and b/SFMLEngine/makingAGameTick/game.o differ diff --git a/SFMLEngine/makingAGameTick/resources.hpp b/SFMLEngine/makingAGameTick/resources.hpp index a94a191..e032d44 100644 --- a/SFMLEngine/makingAGameTick/resources.hpp +++ b/SFMLEngine/makingAGameTick/resources.hpp @@ -4,9 +4,17 @@ #include // Mostly Chapter 2 // Handles resource management + + + + namespace Textures // This gives us a scope for the enumerators which allows us to write Textures::Airplane instead of just Airplane to avoid name collisions in the global scope { - enum ID { Landscape, Airplane, Missile }; + enum ID + { + Eagle, + Raptor, + }; } template @@ -24,6 +32,8 @@ class ResourceHolder // unique_ptr are class templates that act like pointers, this allows us to work with heavyweight objects without copying them all the time, or we can store classes that are non-cpyable like sf::Shader }; +typedef ResourceHolder TextureHolder; + #include "resources.inl"