모든 종류의 자산에 대한 포인터와 ResourceHolder라는 ID를 보유하는 템플릿을 만들었지 만이 템플릿의 인스턴스에서 텍스처에 대한 포인터를 사용하여 스프라이트에 텍스처를로드하면 흰색 사각형이됩니다. ResourceHolder.hpp의 코드는 다음과 같습니다.
#ifndef RESOURCEEHOLDER_H
#define RESOURCEHOLDER_H
#include "TexturesId.h"
#include "assert.h"
#include <SFML/Graphics.hpp>
#include <stdexcept>
#include <memory>
#include <string>
#include <map>
using namespace sf;
template<typename Resource,typename Identifier>
class ResourceHolder
{
public:
void load(Identifier id,const std::string &filename);
Resource& get(Identifier id);
const Resource& get(Identifier id) const;
protected:
private:
std::map<Identifier,std::unique_ptr<Resource>> mResourceMap;
};
#endif // TEXTUREHOLDER_H
그런 다음 ResourceHolder.cpp의 코드
#include "ResourceHolder.h"
using namespace sf;
template<typename Resource,typename Identifier>
void ResourceHolder<Resource,Identifier>::load(Identifier id,const std::string& filename)
{
std::unique_ptr<Resource> resource(new Resource());
if(!(resource->loadFromFile(filename)))
{
throw std::runtime_error("TextureHolder failed to load " + filename);
}
auto inserted=mResourceMap.insert(std::make_pair(id,std::move(resource)));
assert(inserted.second);
}
template<typename Resource,typename Identifier>
Resource& ResourceHolder<Resource,Identifier>::get(Identifier id)
{
auto found=mResourceMap.find(id);
assert(found!=mResourceMap.end());
return *found->second;
}
template<typename Resource,typename Identifier>
const Resource& ResourceHolder<Resource,Identifier>::get(Identifier id) const
{
auto found=mResourceMap.find(id);
assert(found!=mResourceMap.end());
return *found->second;
}
template class ResourceHolder<Texture,Textures::ID>;
TextureId.h :
#ifndef TEXTURESID_H_INCLUDED
#define TEXTURESID_H_INCLUDED
namespace Textures
{
enum ID{Landsape,Airplane,Missile};
}
#endif // TEXTURESID_H_INCLUDED
마지막으로 Game.cpp에서
Game::Game(int x,int y,std::string &Name)
:window(VideoMode(x,y),Name),texture(),
mPlayer()
{
ResourceHolder<Texture,Textures::ID> th;
th.load(Textures::ID::Airplane,"plane.png");
Texture texture=th.get(Textures::ID::Airplane);
mPlayer.setTexture(texture);
mPlayer.setPosition(window.getSize().x/2,window.getSize().y/2);
}
문제가있는 코드는 Game.cpp의 코드입니다.
Game::Game(int x,int y,std::string &Name)
:window(VideoMode(x,y),Name),texture(),
mPlayer()
{
ResourceHolder<Texture,Textures::ID> th;
th.load(Textures::ID::Airplane,"plane.png");
Texture texture=th.get(Textures::ID::Airplane);
mPlayer.setTexture(texture);
mPlayer.setPosition(window.getSize().x/2,window.getSize().y/2);
}
ResourceHolder
뿐만 아니라 Texture
전용의 로컬 스코프 내에 존재 Game
생성자. 생성자가 실행되면 rh
및 둘 다 texture
범위를 벗어나고 텍스처에 대한 스프라이트의 참조가 무효화되어 흰색 사각형 문제가 발생 합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다