Fixed masking.
This commit is contained in:
parent
637ea180c3
commit
f51b8a1aaa
2 changed files with 49 additions and 21 deletions
|
@ -39,18 +39,23 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
|
||||||
float radius = config.get(KEY_RADIUS, 0.0f);
|
float radius = config.get(KEY_RADIUS, 0.0f);
|
||||||
sf::Vector2f size = config.get(KEY_SIZE, sf::Vector2f());
|
sf::Vector2f size = config.get(KEY_SIZE, sf::Vector2f());
|
||||||
if (radius != 0.0f) {
|
if (radius != 0.0f) {
|
||||||
mShape = std::unique_ptr<sf::Shape>(new sf::CircleShape(radius));
|
mShape.type = Shape::Type::CIRCLE;
|
||||||
|
mShape.shape = std::unique_ptr<sf::Shape>(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()) {
|
else if (size != sf::Vector2f()) {
|
||||||
mShape = std::unique_ptr<sf::Shape>(new sf::RectangleShape(size));
|
mShape.type = Shape::Type::RECTANGLE;
|
||||||
|
mShape.shape = std::unique_ptr<sf::Shape>(new sf::RectangleShape(size));
|
||||||
|
mShape.shape->setOrigin(size / 2.0f);
|
||||||
|
mShape.shape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(size)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LOG_E("Could not read size or radius from " << config.getFilename());
|
LOG_E("Could not read size or radius from " << config.getFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
mShape->setOrigin(sf::Vector2f(getSize().x / 2, getSize().y / 2));
|
mShape.shape->setTexture(&*mTexture, false);
|
||||||
mShape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(getSize())));
|
|
||||||
mShape->setTexture(&*mTexture, false);
|
|
||||||
|
|
||||||
setPosition(data.position);
|
setPosition(data.position);
|
||||||
setAngle(data.angle);
|
setAngle(data.angle);
|
||||||
|
@ -66,11 +71,11 @@ Sprite::~Sprite() {
|
||||||
* Initializes container.
|
* Initializes container.
|
||||||
*/
|
*/
|
||||||
Sprite::Data::Data(const sf::Vector2f& position, float angle,
|
Sprite::Data::Data(const sf::Vector2f& position, float angle,
|
||||||
Category category, unsigned short maskExclude) :
|
Category category, unsigned short mask) :
|
||||||
position(position),
|
position(position),
|
||||||
angle(angle),
|
angle(angle),
|
||||||
category(category),
|
category(category),
|
||||||
mask(maskExclude) {
|
mask(mask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,7 +83,7 @@ Sprite::Data::Data(const sf::Vector2f& position, float angle,
|
||||||
*/
|
*/
|
||||||
sf::Vector2f
|
sf::Vector2f
|
||||||
Sprite::getPosition() const {
|
Sprite::getPosition() const {
|
||||||
return mShape->getPosition();
|
return mShape.shape->getPosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -94,7 +99,7 @@ Sprite::getSpeed() const {
|
||||||
*/
|
*/
|
||||||
float
|
float
|
||||||
Sprite::getAngle() const {
|
Sprite::getAngle() const {
|
||||||
return mShape->getRotation();
|
return mShape.shape->getRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -119,13 +124,21 @@ Sprite::getCategory() const {
|
||||||
*/
|
*/
|
||||||
sf::Vector2f
|
sf::Vector2f
|
||||||
Sprite::getSize() const {
|
Sprite::getSize() const {
|
||||||
sf::FloatRect bounds = mShape->getLocalBounds();
|
sf::FloatRect bounds = mShape.shape->getLocalBounds();
|
||||||
return sf::Vector2f(bounds.width, bounds.height);
|
return sf::Vector2f(bounds.width, bounds.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sprite::draw(sf::RenderTarget& target, sf::RenderStates states) const {
|
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.
|
* @param other The other Sprite in the collision.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Sprite::onCollide(Sprite& other) {
|
Sprite::onCollide(std::shared_ptr<Sprite> other) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -165,7 +178,7 @@ Sprite::setSpeed(sf::Vector2f direction, float speed) {
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Sprite::setAngle(float angle) {
|
Sprite::setAngle(float angle) {
|
||||||
mShape->setRotation(angle);
|
mShape.shape->setRotation(angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -173,5 +186,5 @@ Sprite::setAngle(float angle) {
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
Sprite::setPosition(const sf::Vector2f& position) {
|
Sprite::setPosition(const sf::Vector2f& position) {
|
||||||
mShape->setPosition(position);
|
mShape.shape->setPosition(position);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,8 @@ public:
|
||||||
*/
|
*/
|
||||||
class Data {
|
class Data {
|
||||||
public:
|
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;
|
const sf::Vector2f& position;
|
||||||
float angle;
|
float angle;
|
||||||
Category category;
|
Category category;
|
||||||
|
@ -48,8 +49,8 @@ public:
|
||||||
* Common collision masking values.
|
* Common collision masking values.
|
||||||
*/
|
*/
|
||||||
enum Mask : unsigned short {
|
enum Mask : unsigned short {
|
||||||
MASK_NONE = 0xffff, //< Disables any collisions.
|
MASK_ALL = 0xffff, //< Enables all collisions.
|
||||||
MASK_ALL = 0 //< Enables all collisions.
|
MASK_NONE = 0 //< Disables any collisions.
|
||||||
};
|
};
|
||||||
|
|
||||||
// Public functions.
|
// Public functions.
|
||||||
|
@ -64,8 +65,9 @@ public:
|
||||||
Category getCategory() const;
|
Category getCategory() const;
|
||||||
sf::Vector2f getSize() const;
|
sf::Vector2f getSize() const;
|
||||||
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) 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<Sprite> other);
|
||||||
|
|
||||||
// Public variables.
|
// Public variables.
|
||||||
public:
|
public:
|
||||||
|
@ -75,16 +77,29 @@ public:
|
||||||
|
|
||||||
// Protected functions.
|
// Protected functions.
|
||||||
protected:
|
protected:
|
||||||
friend class World;
|
|
||||||
|
|
||||||
void setDelete(bool value);
|
void setDelete(bool value);
|
||||||
void setSpeed(sf::Vector2f direction, float speed);
|
void setSpeed(sf::Vector2f direction, float speed);
|
||||||
void setAngle(float angle);
|
void setAngle(float angle);
|
||||||
void setPosition(const sf::Vector2f& position);
|
void setPosition(const sf::Vector2f& position);
|
||||||
|
|
||||||
|
// Private types.
|
||||||
|
private:
|
||||||
|
class Shape {
|
||||||
|
public:
|
||||||
|
enum class Type {
|
||||||
|
CIRCLE,
|
||||||
|
RECTANGLE
|
||||||
|
};
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
std::shared_ptr<sf::Shape> shape;
|
||||||
|
};
|
||||||
|
|
||||||
// Private variables.
|
// Private variables.
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<sf::Shape> mShape;
|
friend class World;
|
||||||
|
|
||||||
|
Shape mShape;
|
||||||
std::shared_ptr<sf::Texture> mTexture;
|
std::shared_ptr<sf::Texture> mTexture;
|
||||||
sf::Vector2f mSpeed;
|
sf::Vector2f mSpeed;
|
||||||
Category mCategory;
|
Category mCategory;
|
||||||
|
|
Reference in a new issue