This repository has been archived on 2019-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
dungeon-gunner/source/abstract/Sprite.cpp

149 lines
3.3 KiB
C++
Raw Normal View History

/*
* Sprite.cpp
*
2012-12-23 14:50:49 +00:00
* Created on: 11.08.2012
* Author: Felix
*/
#include "Sprite.h"
2012-12-23 14:50:49 +00:00
#include <Thor/Vectors.hpp>
#include "../util/Loader.h"
#include "../util/Log.h"
2012-12-23 14:50:49 +00:00
#include "../util/ResourceManager.h"
Sprite::Sprite(const sf::Vector2f& position, Category category,
unsigned short mask, const sf::Vector2f& size,
const std::string& texture, const sf::Vector2f& direction) :
mCategory(category),
mMask(mask),
mDelete(false) {
mShape.setSize(size);
mShape.setOrigin(size / 2.0f);
mShape.setTextureRect(sf::IntRect(sf::Vector2i(), sf::Vector2i(size)));
setPosition(position);
setDirection(direction);
try {
mTexture = ResourceManager::i().acquire(Loader::i()
.fromFile<sf::Texture>(texture));
mShape.setTexture(&*mTexture, false);
2013-03-30 12:38:25 +00:00
}
catch (thor::ResourceLoadingException&) {
LOG_W("Failed to load texture " << texture << ", coloring red.");
mShape.setFillColor(sf::Color(255, 0, 0));
2013-04-04 19:50:52 +00:00
}
2012-12-23 14:50:49 +00:00
}
/**
* Returns the position of the sprite (center).
*/
2012-12-23 14:50:49 +00:00
sf::Vector2f
Sprite::getPosition() const {
return mShape.getPosition();
2012-12-23 14:50:49 +00:00
}
/**
* Returns the movement speed of the sprite.
*/
sf::Vector2f
Sprite::getSpeed() const {
return mSpeed;
}
/**
* Returns the angle of the sprite.
*/
sf::Vector2f
Sprite::getDirection() const {
return thor::rotatedVector(sf::Vector2f(1, 0), mShape.getRotation());
2012-12-23 14:50:49 +00:00
}
/**
* Returns true if this object should be deleted.
*/
bool
Sprite::getDelete() const {
return mDelete;
}
/**
* Returns the Category of this object.
*/
Sprite::Category
Sprite::getCategory() const {
return mCategory;
}
/**
* Returns the size of the sprite as a vector (bottom left to top right),
* does not consider rotation.
*/
sf::Vector2f
Sprite::getSize() const {
sf::FloatRect bounds = mShape.getLocalBounds();
2012-12-23 14:50:49 +00:00
return sf::Vector2f(bounds.width, bounds.height);
}
void
Sprite::draw(sf::RenderTarget& target, sf::RenderStates states) const {
target.draw(mShape, states);
2013-03-03 20:27:40 +00:00
}
/**
* Returns true if collisions with that category are enabled through mask.
*/
bool
Sprite::collisionEnabled(Category category) const {
return (category & mMask) != 0;
2012-12-23 14:50:49 +00:00
}
bool
Sprite::isInside(const sf::FloatRect& rect) const {
return rect.intersects(mShape.getGlobalBounds());
}
2012-12-23 14:50:49 +00:00
/**
* Called when a collision with another Sprite occured. Override this method
* to manage collision events.
*
* @param other The other Sprite in the collision.
*/
void
2013-03-03 20:27:40 +00:00
Sprite::onCollide(std::shared_ptr<Sprite> other) {
2012-12-23 14:50:49 +00:00
}
2012-12-23 14:50:49 +00:00
/**
* Set to true to mark this object for deletion from the world.
*/
void
Sprite::setDelete(bool value) {
mDelete = value;
}
2012-12-23 14:50:49 +00:00
/**
* Sets movement speed and direction of the Sprite. Set either value to zero to stop movement.
*
* @param direction The direction the Sprite moves in, does not have to be normalized.
* @param speed Movement speed in pixels per second.
*/
void
Sprite::setSpeed(sf::Vector2f direction, float speed) {
2013-04-04 21:13:08 +00:00
if (direction != sf::Vector2f())
2012-12-23 14:50:49 +00:00
thor::setLength(direction, speed);
mSpeed = direction;
}
void
Sprite::setDirection(const sf::Vector2f& direction) {
2013-04-04 21:13:08 +00:00
if (direction != sf::Vector2f())
mShape.setRotation(thor::polarAngle(direction) + 90);
2012-12-23 14:50:49 +00:00
}
/**
* Sets the position of thr Sprite.
*/
void
Sprite::setPosition(const sf::Vector2f& position) {
mShape.setPosition(position);
2013-03-19 19:51:56 +00:00
}