Improved error handling and fallbacks.

This commit is contained in:
Felix Ableitner 2013-03-30 13:38:25 +01:00
parent 0c29dac282
commit 12441076c0
3 changed files with 38 additions and 17 deletions

View file

@ -29,11 +29,22 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
mMask(data.mask),
mDelete(false) {
std::string texture = config.get<std::string>(KEY_TEXTURE, "");
if (texture == "") {
LOG_E("Failed to read texture from YAML file " << config.getFilename());
if (texture != "") {
try {
mTexture = ResourceManager::i().acquire(Loader::i()
.fromFile<sf::Texture>(texture));
mShape.shape->setTexture(&*mTexture, false);
}
catch (thor::ResourceLoadingException&) {
LOG_W("Failed to load texture " << texture << ", coloring red.");
mShape.shape->setFillColor(sf::Color(255, 0, 0));
}
}
else {
LOG_W("Failed to read texture file name from YAML file " <<
config.getFilename() << ", coloring red.");
mShape.shape->setFillColor(sf::Color(255, 0, 0));
}
mTexture = ResourceManager::i().acquire(Loader::i()
.fromFile<sf::Texture>(texture));
float radius = config.get(KEY_RADIUS, 0.0f);
sf::Vector2f size = config.get(KEY_SIZE, sf::Vector2f());
@ -41,8 +52,13 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
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)));
mShape.shape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0),
sf::Vector2i(radius * 2, radius * 2)));
}
else if (size == sf::Vector2f()) {
LOG_E("Failed to read size or radius from " << config.getFilename() <<
", using texture size.");
size = sf::Vector2f(mTexture->getSize());
}
else if (size != sf::Vector2f()) {
mShape.type = Shape::Type::RECTANGLE;
@ -50,11 +66,6 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
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.shape->setTexture(&*mTexture, false);
setPosition(data.position);
setDirection(data.direction);

View file

@ -11,13 +11,18 @@
#include "../abstract/Singleton.h"
/**
* Loads and manages all resources by providing Singleton access to Thor ResourceManager.
* Loads and manages all resources by providing Singleton access to
* Thor ResourceManager.
*/
class ResourceManager : public thor::MultiResourceCache, public Singleton<ResourceManager> {
class ResourceManager : public thor::MultiResourceCache,
public Singleton<ResourceManager> {
// Private functions.
private:
friend class Singleton<ResourceManager>;
ResourceManager() = default;
ResourceManager() {
setLoadingFailureStrategy(thor::Resources::ThrowException);
setReleaseStrategy(thor::Resources::AutoRelease);
};
};
#endif /* DG_RESOURCEMANAGER_H_ */

View file

@ -15,6 +15,8 @@
#include <SFML/System.hpp>
#include "Log.h"
/**
* Interface to a YAML file.
*/
@ -42,6 +44,7 @@ private:
/**
* Stream output operators to specialize Yaml::get for other types.
* Error handling is done in Yaml::get.
*/
namespace {
void operator>>(const YAML::Node& node, sf::Vector2i& vector) {
@ -56,7 +59,7 @@ namespace {
};
/**
* Gets a value of a specified type by key. Throws exception if key not found.
* Gets a value of a specified type by key. Returns default value on error.
*
* @param key The string by which to select the return value.
* @tparam T The type of the return value.
@ -64,12 +67,14 @@ namespace {
*/
template <typename T>
T Yaml::get(const std::string& key, const T& defaultValue) const {
if (const YAML::Node* node = mNode.FindValue(key)) {
try {
const YAML::Node* node = mNode.FindValue(key);
T value;
*node >> value;
return value;
}
else {
catch (YAML::InvalidScalar&) {
LOG_W("Failed to get key " << key << " from " << mFolder << mFilename);
return defaultValue;
}
};