From f51b8a1aaa2be320ca43285b607050c423839c90 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Sun, 3 Mar 2013 21:27:40 +0100 Subject: [PATCH] Fixed masking. --- source/abstract/Sprite.cpp | 41 +++++++++++++++++++++++++------------- source/abstract/Sprite.h | 29 ++++++++++++++++++++------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/source/abstract/Sprite.cpp b/source/abstract/Sprite.cpp index f980c4d..8db86b5 100755 --- a/source/abstract/Sprite.cpp +++ b/source/abstract/Sprite.cpp @@ -39,18 +39,23 @@ Sprite::Sprite(const Data& data, const Yaml& config) : float radius = config.get(KEY_RADIUS, 0.0f); sf::Vector2f size = config.get(KEY_SIZE, sf::Vector2f()); if (radius != 0.0f) { - mShape = std::unique_ptr(new sf::CircleShape(radius)); + mShape.type = Shape::Type::CIRCLE; + mShape.shape = std::unique_ptr(new sf::CircleShape(radius)); + mShape.shape->setOrigin(radius, radius); + mShape.shape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(radius * 2, radius * 2))); + } else if (size != sf::Vector2f()) { - mShape = std::unique_ptr(new sf::RectangleShape(size)); + mShape.type = Shape::Type::RECTANGLE; + mShape.shape = std::unique_ptr(new sf::RectangleShape(size)); + mShape.shape->setOrigin(size / 2.0f); + mShape.shape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(size))); } else { LOG_E("Could not read size or radius from " << config.getFilename()); } - mShape->setOrigin(sf::Vector2f(getSize().x / 2, getSize().y / 2)); - mShape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(getSize()))); - mShape->setTexture(&*mTexture, false); + mShape.shape->setTexture(&*mTexture, false); setPosition(data.position); setAngle(data.angle); @@ -66,11 +71,11 @@ Sprite::~Sprite() { * Initializes container. */ Sprite::Data::Data(const sf::Vector2f& position, float angle, - Category category, unsigned short maskExclude) : + Category category, unsigned short mask) : position(position), angle(angle), category(category), - mask(maskExclude) { + mask(mask) { } /** @@ -78,7 +83,7 @@ Sprite::Data::Data(const sf::Vector2f& position, float angle, */ sf::Vector2f Sprite::getPosition() const { - return mShape->getPosition(); + return mShape.shape->getPosition(); } /** @@ -94,7 +99,7 @@ Sprite::getSpeed() const { */ float Sprite::getAngle() const { - return mShape->getRotation(); + return mShape.shape->getRotation(); } /** @@ -119,13 +124,21 @@ Sprite::getCategory() const { */ sf::Vector2f Sprite::getSize() const { - sf::FloatRect bounds = mShape->getLocalBounds(); + sf::FloatRect bounds = mShape.shape->getLocalBounds(); return sf::Vector2f(bounds.width, bounds.height); } void Sprite::draw(sf::RenderTarget& target, sf::RenderStates states) const { - target.draw(*mShape, states); + target.draw(*mShape.shape, states); +} + +/** + * Returns true if collisions with that category are enabled through mask. + */ +bool +Sprite::collisionEnabled(Category category) const { + return (category & mMask) != 0; } /** @@ -135,7 +148,7 @@ Sprite::draw(sf::RenderTarget& target, sf::RenderStates states) const { * @param other The other Sprite in the collision. */ void -Sprite::onCollide(Sprite& other) { +Sprite::onCollide(std::shared_ptr other) { } /** @@ -165,7 +178,7 @@ Sprite::setSpeed(sf::Vector2f direction, float speed) { */ void Sprite::setAngle(float angle) { - mShape->setRotation(angle); + mShape.shape->setRotation(angle); } /** @@ -173,5 +186,5 @@ Sprite::setAngle(float angle) { */ void Sprite::setPosition(const sf::Vector2f& position) { - mShape->setPosition(position); + mShape.shape->setPosition(position); } diff --git a/source/abstract/Sprite.h b/source/abstract/Sprite.h index 3a7896e..aff4b90 100755 --- a/source/abstract/Sprite.h +++ b/source/abstract/Sprite.h @@ -37,7 +37,8 @@ public: */ class Data { public: - Data(const sf::Vector2f& position, float angle, Category category, unsigned short maskExclude); + Data(const sf::Vector2f& position, float angle, Category category, + unsigned short mask); const sf::Vector2f& position; float angle; Category category; @@ -48,8 +49,8 @@ public: * Common collision masking values. */ enum Mask : unsigned short { - MASK_NONE = 0xffff, //< Disables any collisions. - MASK_ALL = 0 //< Enables all collisions. + MASK_ALL = 0xffff, //< Enables all collisions. + MASK_NONE = 0 //< Disables any collisions. }; // Public functions. @@ -64,8 +65,9 @@ public: Category getCategory() const; sf::Vector2f getSize() const; virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const; + bool collisionEnabled(Category category) const; - virtual void onCollide(Sprite& other); + virtual void onCollide(std::shared_ptr other); // Public variables. public: @@ -75,16 +77,29 @@ public: // Protected functions. protected: - friend class World; - void setDelete(bool value); void setSpeed(sf::Vector2f direction, float speed); void setAngle(float angle); void setPosition(const sf::Vector2f& position); +// Private types. +private: + class Shape { + public: + enum class Type { + CIRCLE, + RECTANGLE + }; + + Type type; + std::shared_ptr shape; + }; + // Private variables. private: - std::unique_ptr mShape; + friend class World; + + Shape mShape; std::shared_ptr mTexture; sf::Vector2f mSpeed; Category mCategory;