summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2022-11-17 13:00:52 +0100
committerEkaitz Zarraga <ekaitz@elenq.tech>2022-11-17 13:00:52 +0100
commitf2068ddb2fbed6c6bf6bffc3648327435886e603 (patch)
treea2325d5b9b94f61aa26deb20625c824032d9195c
parent1c2a216055a107c1ce8d9d6845be80df0e0764f4 (diff)
Add a simple resource manager
-rw-r--r--src/main.cpp21
-rw-r--r--src/resourceManager.h54
2 files changed, 72 insertions, 3 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 94bf125..bd330fc 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5,6 +5,7 @@
#include "graphics/animation.h"
#include "entity.h"
+#include "resourceManager.h"
namespace gph = Graphics;
@@ -34,8 +35,8 @@ class Unit: Entity{
sf::Vector2f speed;
- Unit(){
- spritesheet_.loadFromFile("assets/img/Player/Player Angle 1 Sheet.png");
+ Unit(sf::Texture& spritesheet){
+ spritesheet_ = spritesheet;
standing_animation = gph::Animation(spritesheet_, 6, 60, 44, 48, 0);
walking_animation = gph::Animation(spritesheet_, 8, 60, 44, 48, 1);
shooting_animation = gph::FlippedAnimation<gph::OneShotAnimation>(spritesheet_, 6, 60, 44, 48, 2);
@@ -66,16 +67,30 @@ class Unit: Entity{
sprite.setScale(8,8);
sprite.setTextureRect(current_animation->next(dt));
sprite.setPosition(position.x, position.y);
+ sprite = sprite;
}
};
+
+enum class TextureId{
+ Angle1,
+ Angle2,
+ Front,
+ Back,
+ Side
+};
+
int main()
{
sf::RenderWindow renderWindow(sf::VideoMode(640, 480), "Demo Game");
sf::Event event;
sf::Clock clock;
- Unit unit;
+
+ ResourceManager<sf::Texture, TextureId> TextureManager;
+ TextureManager.load( TextureId::Angle1, "assets/img/Player/Player Angle 1 Sheet.png");
+
+ Unit unit = Unit(TextureManager.get(TextureId::Angle1));
renderWindow.setFramerateLimit(60);
diff --git a/src/resourceManager.h b/src/resourceManager.h
new file mode 100644
index 0000000..be6e250
--- /dev/null
+++ b/src/resourceManager.h
@@ -0,0 +1,54 @@
+#ifndef RESOURCE_MANAGER_H
+#define RESOURCE_MANAGER_H
+
+#include <map>
+#include <string>
+#include <memory>
+#include <stdexcept>
+#include <cassert>
+
+template <typename Resource, typename Identifier>
+class ResourceManager{
+ private:
+ std::map<Identifier,std::unique_ptr<Resource>> resourceMap;
+ public:
+ void load(Identifier id, const std::string& path);
+ Resource& get(Identifier id);
+ const Resource& get(Identifier id) const;
+};
+
+template <typename Resource, typename Identifier>
+void
+ResourceManager<Resource, Identifier>::load(Identifier id,
+ const std::string& path){
+ auto resource = std::make_unique<Resource>();
+ if( !resource->loadFromFile(path) ){
+ throw("ResoureManager::load - Failed to load filename: " + path);
+ }
+ auto inserted = resourceMap.insert(
+ std::make_pair(id, std::move(resource))
+ );
+ assert(inserted.second);
+}
+
+template <typename Resource, typename Identifier>
+Resource&
+ResourceManager<Resource, Identifier>::get(Identifier id)
+{
+ auto found = resourceMap.find(id);
+ assert(found != resourceMap.end());
+
+ return *found->second;
+}
+
+template <typename Resource, typename Identifier>
+const Resource&
+ResourceManager<Resource, Identifier>::get(Identifier id) const
+{
+ auto found = resourceMap.find(id);
+ assert(found != resourceMap.end());
+
+ return *found->second;
+}
+
+#endif // RESOURCE_MANAGER_H