我正在使用SFML 2.2制作小游戏
我将从我的代码开始。由于我已经拥有大约4000行工作代码,因此我制作了一个纹理管理器,用于存储一次使用的所有纹理。我当然早些时候使用过纹理,但我需要一种方法来管理它们。它看起来像这样:
//Declarations
class Manager
{
private:
static map<string, Texture > textures;
public:
static Texture & add(const string & name, const string & directory);
static Texture & resolve(const string & name);
};
//Definitions
Texture & Manager::add(const string & name, const string & directory)
{
// Check, whether a said texture was already maped
map<string, Texture>::const_iterator it = textures.find(name);
if (it != textures.end())
{
cout << "Said element was loaded" << endl;
return textures.at(name);
}
// Adding a new texture
Texture tex;
tex.loadFromFile(directory);
textures[name] = tex;
cout << "Texture added" << endl;
return textures.at(name);
}
Texture & Manager::resolve(const string & name)
{
cout << "Resolved" << endl;
return textures.at(name);
}
map<string, Texture > Manager::textures;
正如你所看到的,我有一个全局地图,有两种方法可供选择。两种方法都返回对某个纹理的引用。因此,当我的项目已经安静了许多纹理时,我决定检查我的管理器是否工作正常,并用方法 add 替换加载一个纹理,并用 resolve 将其绑定到sprite。当我编译代码并运行它时,一切运行良好,直到我回到我的游戏菜单并决定再次播放&#34;。现在,当再次加载纹理时,方法添加正确识别的名称(键)已经使用,方法 resolve 返回正确的纹理。至少&#34;已解决&#34;出现在屏幕上。这就是错误发生的时候。
但是当我从方法中调用 add 时,纹理被用于使用它的类的构造函数,它再次正常工作。它被称为相同的次数;每次玩游戏&#34;。
以下是无效代码:
void Engine::set_up(int & lvl)
{
srm::Manager::add("Loading screen", "data/loading_screen.png");
Sprite spr;
spr.setTexture(srm::Manager::resolve("Loading screen"));
// ...
}
也没有工作代码:
void Engine::set_up(int & lvl)
{
Sprite spr;
spr.setTexture(srm::Manager::add("Loading screen", "data/loading_screen.png");
// ...
}
工作:
//Constructor
Engine(){ srm::Manager::add("Loading screen", "data/loading_screen.png"); }
//Method
void Engine::set_up(int & lvl)
{
Sprite spr;
spr.setTexture(srm::Manager::resolve("Loading screen"));
// ...
}
我觉得我的经理犯了一个错误。这是错误所说的:
Microsoft Visual C++ Runtime Library - Error
使用了词&#34;堆&#34;所以它只是证实了我的错误与我的经理有关。我在网上做了一个研究,我发现了这个:
Debug Assertion Failed: _CrtIsValidHeapPointer(pUserData)
我明白导致错误的原因,但我无法理解错误在哪里。最奇怪的是那些在构造函数中调用 add 的人工作并在其他地方调用它不会!
对不起,如果事情不清楚,我会回答你的问题。
有人知道这个问题的解决方案吗?你能解释一下我的代码中有什么问题吗?提前谢谢!
修改
好的,我在调试模式下跟踪堆栈并找到了罪魁祸首。这些是具有字段值
的sf :: Text对象信息不可用,未加载符号 SFML图形-d-2.DLL
并且在每个测试中它都出现在其他Text对象中。始终存在字符串问题,它始终是&#34;无法读取内存&#34;在我的文本的字符串部分。我不知道为什么,对我而言,它甚至与我的问题无关。但是,当我将代码更改回此时:
void Engine::set_up(int & lvl)
{
//srm::Manager::add("Loading screen", "data/loading_screen.png");
Texture texture;
texture.loadFromFile("data/loading_screen.png");
Sprite spr;
spr.setTexture(texture);
//spr.setTexture(srm::Pojemnik::zwroc("Ekran wczytywania"));
这是一个经典的本地sf::Texture
对象并将其绑定到精灵,一切都完美无缺。
正如我所说,当我把
srm::Manager::add("Loading screen", "data/loading_screen.png");
到构造函数或当我没有使用我的Manager类时,一切正常,当我想使用我的代码时 - 它会挂起。