Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#pragma once #include <map> #include <memory> #include <SFML/Graphics/Texture.hpp> class ResourceManager { public: enum ID {Background, Terrain, Base, BaseDestroyed, Missile, SpriteCircle, SpriteSmoke, SpriteSmokeLight}; ResourceManager(); ~ResourceManager(); sf::Texture* getTexture(ID id); private: std::map<ID, std::unique_ptr<sf::Texture> > textureMap; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include "ResourceManager.hpp" ResourceManager::ResourceManager() { textureMap.insert(std::make_pair(Background, nullptr)); textureMap.insert(std::make_pair(Terrain, nullptr)); textureMap.insert(std::make_pair(Base, nullptr)); textureMap.insert(std::make_pair(BaseDestroyed, nullptr)); textureMap.insert(std::make_pair(Missile, nullptr)); textureMap.insert(std::make_pair(SpriteCircle, nullptr)); textureMap.insert(std::make_pair(SpriteSmoke, nullptr)); textureMap.insert(std::make_pair(SpriteSmokeLight, nullptr)); } ResourceManager::~ResourceManager() { } sf::Texture* ResourceManager::getTexture(ID id) { std::unique_ptr<sf::Texture>& tex = textureMap.at(id); /* tex is a nullptr when the texture hasn't been loaded yet. In this case, load the texture. Return the pointer with the loaded texture after loading. Otherwise, return it without doing anything, since the texture is already loaded. */ if (tex == nullptr) { tex = std::unique_ptr<sf::Texture>(new sf::Texture()); switch (id) { case Background: tex->loadFromFile("res/img/BG.png"); break; case Terrain: tex->loadFromFile("res/img/Terrain.png"); break; case Base: tex->loadFromFile("res/img/Base64.png"); break; case BaseDestroyed: tex->loadFromFile("res/img/BaseDes64.png"); break; case Missile: tex->loadFromFile("res/img/Missile.png"); break; case SpriteCircle: tex->loadFromFile("res/img/SpriteCircle.png"); break; case SpriteSmoke: tex->loadFromFile("res/img/SpriteSmoke.png"); break; case SpriteSmokeLight: tex->loadFromFile("res/img/SpriteSmokeLight.png"); } } return tex.get(); } |
Community-Fossil
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Was heißt "meldet sich ab?". Die Texture kennt das Sprite doch überhaupt nicht. Das Sprite referenziert dann lediglich eine ungültige Textur. Gerendert wird dann Müll, wenn die Textur vorzeitig gelöscht wird. Dort also mit Shared-Pointern zu hantieren kann ganz schnell ganz böse enden - in kaputten Grafiken.Ich glaube sf::Texture meldet sich automatisch beim Sprite ab, wenn es gelöscht wird.
Community-Fossil
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#pragma once #include <map> #include <memory> #include <iostream> #include <SFML/Graphics/Texture.hpp> class ResourceManager { public: //enum ID {Background, Terrain, Base, BaseDestroyed, Missile, SpriteCircle, SpriteSmoke, SpriteSmokeLight}; ResourceManager(); ~ResourceManager(); sf::Texture* getTexture(const std::string& filename); private: std::map<std::string, std::unique_ptr<sf::Texture> > textureMap; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include "ResourceManager.hpp" ResourceManager::ResourceManager() { textureMap.insert(std::make_pair("BG", nullptr)); textureMap.insert(std::make_pair("Terrain", nullptr)); textureMap.insert(std::make_pair("Base64", nullptr)); textureMap.insert(std::make_pair("BaseDes64", nullptr)); textureMap.insert(std::make_pair("Missile", nullptr)); textureMap.insert(std::make_pair("SpriteCircle", nullptr)); textureMap.insert(std::make_pair("SpriteSmoke", nullptr)); textureMap.insert(std::make_pair("SpriteSmokeLight", nullptr)); } ResourceManager::~ResourceManager() { } sf::Texture* ResourceManager::getTexture(const std::string& filename) { std::unique_ptr<sf::Texture>& tex = textureMap.at(filename); /* tex is a nullptr when the texture hasn't been loaded yet. In this case, load the texture. Return the pointer with the loaded texture after loading. Otherwise, return it without doing anything, since the texture is already loaded. */ if (tex == nullptr) { tex = std::unique_ptr<sf::Texture>(new sf::Texture()); try { if (!(tex->loadFromFile("res/img/" + filename + ".png"))) throw filename; } catch (const std::string& filename) { std::cout << ("The file \"" + filename + "\" can not be found!") << std::endl; } } return tex.get(); } |
Community-Fossil
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (12.03.2014, 21:36)
Alter Hase
Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy
Der Inhalt des Konstruktors ist überflüssig und du solltest eine Referenz zurückgeben. Der Nutzer sollte die Endung und den Pfad selbst bestimmen können. Die Endung ist abhängig von der Datei, sollte also im Parameter "filename" stehen. Den Pfad würde ich im Konstruktor entgegennehmen. Das Werfen und Auffangen der Exception kannst du dir doch sparen. Gib einfach die Fehlermeldung aus, wirf die Exception ohne sie gleich wieder aufzufangen oder mach beides. Den Destruktor kannst du auch löschen.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#pragma once #include <map> #include <memory> #include <SFML/Graphics/Texture.hpp> class ResourceManager { public: //enum ID {Background, Terrain, Base, BaseDestroyed, Missile, SpriteCircle, SpriteSmoke, SpriteSmokeLight}; ResourceManager(const std::string& resourcePath); sf::Texture* getTexture(const std::string& filename); private: std::string resourcePath; std::map<std::string, std::unique_ptr<sf::Texture> > resourceMap; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include "ResourceManager.hpp" ResourceManager::ResourceManager(const std::string& resourcePath) { this->resourcePath = resourcePath; } sf::Texture* ResourceManager::getTexture(const std::string& filename) { std::unique_ptr<sf::Texture> tex = std::move(resourceMap.at(filename)); /* tex is a nullptr when the texture hasn't been loaded yet. In this case, load the texture. Return the pointer with the loaded texture after loading. Otherwise, return it without doing anything, since the texture is already loaded. */ if (tex == nullptr) { tex = std::unique_ptr<sf::Texture>(new sf::Texture()); if (!(tex->loadFromFile(resourcePath + filename))) throw ("The file \"" + filename + "\" can not be found at " + resourcePath + "!"); resourceMap.insert(std::make_pair(filename, std::move(tex))); } return tex.get(); } |
Community-Fossil
C-/C++-Quelltext |
|
1 2 |
sf::Texture& ResourceManager::getTexture(const std::string& filename) return *tex; // oder return *(tex.get()); ist lang her^^ |
Ich glaube das wird dann erstmal überhaupt nicht funktionieren. Wenn der in getTexture übergebene Dateiname der textureMap-Map nicht bekannt ist, gibt das ne Exception ...
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (12.03.2014, 22:22)
Werbeanzeige