Improved error handling and fallbacks.
This commit is contained in:
parent
0c29dac282
commit
12441076c0
3 changed files with 38 additions and 17 deletions
|
@ -29,11 +29,22 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
|
||||||
mMask(data.mask),
|
mMask(data.mask),
|
||||||
mDelete(false) {
|
mDelete(false) {
|
||||||
std::string texture = config.get<std::string>(KEY_TEXTURE, "");
|
std::string texture = config.get<std::string>(KEY_TEXTURE, "");
|
||||||
if (texture == "") {
|
if (texture != "") {
|
||||||
LOG_E("Failed to read texture from YAML file " << config.getFilename());
|
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);
|
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());
|
||||||
|
@ -41,8 +52,13 @@ Sprite::Sprite(const Data& data, const Yaml& config) :
|
||||||
mShape.type = Shape::Type::CIRCLE;
|
mShape.type = Shape::Type::CIRCLE;
|
||||||
mShape.shape = std::unique_ptr<sf::Shape>(new sf::CircleShape(radius));
|
mShape.shape = std::unique_ptr<sf::Shape>(new sf::CircleShape(radius));
|
||||||
mShape.shape->setOrigin(radius, 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()) {
|
else if (size != sf::Vector2f()) {
|
||||||
mShape.type = Shape::Type::RECTANGLE;
|
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->setOrigin(size / 2.0f);
|
||||||
mShape.shape->setTextureRect(sf::IntRect(sf::Vector2i(0, 0), sf::Vector2i(size)));
|
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);
|
setPosition(data.position);
|
||||||
setDirection(data.direction);
|
setDirection(data.direction);
|
||||||
|
|
|
@ -11,13 +11,18 @@
|
||||||
#include "../abstract/Singleton.h"
|
#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 functions.
|
||||||
private:
|
private:
|
||||||
friend class Singleton<ResourceManager>;
|
friend class Singleton<ResourceManager>;
|
||||||
ResourceManager() = default;
|
ResourceManager() {
|
||||||
|
setLoadingFailureStrategy(thor::Resources::ThrowException);
|
||||||
|
setReleaseStrategy(thor::Resources::AutoRelease);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DG_RESOURCEMANAGER_H_ */
|
#endif /* DG_RESOURCEMANAGER_H_ */
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
|
|
||||||
#include <SFML/System.hpp>
|
#include <SFML/System.hpp>
|
||||||
|
|
||||||
|
#include "Log.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface to a YAML file.
|
* Interface to a YAML file.
|
||||||
*/
|
*/
|
||||||
|
@ -42,6 +44,7 @@ private:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stream output operators to specialize Yaml::get for other types.
|
* Stream output operators to specialize Yaml::get for other types.
|
||||||
|
* Error handling is done in Yaml::get.
|
||||||
*/
|
*/
|
||||||
namespace {
|
namespace {
|
||||||
void operator>>(const YAML::Node& node, sf::Vector2i& vector) {
|
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.
|
* @param key The string by which to select the return value.
|
||||||
* @tparam T The type of the return value.
|
* @tparam T The type of the return value.
|
||||||
|
@ -64,12 +67,14 @@ namespace {
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T Yaml::get(const std::string& key, const T& defaultValue) const {
|
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;
|
T value;
|
||||||
*node >> value;
|
*node >> value;
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
else {
|
catch (YAML::InvalidScalar&) {
|
||||||
|
LOG_W("Failed to get key " << key << " from " << mFolder << mFilename);
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Reference in a new issue