我目前正在测试我将在我的游戏项目中使用的 TextureManager 类,但我遇到的问题是当我尝试将 2d 纹理加载到 std::map 时 .exe 崩溃。我需要的是我有一个指向 SDL_Textures 的指针映射,以标准字符串为键
std::map<std::string, SDL_Texture*>Textures;
SDL 和 SDL_image 初始化正常(控制台中的 printfs 成功),但是一旦调用 load() 函数,纹理映射就会启动并且程序崩溃。下面实现函数
void TextureManager::load( std::string path, std::string id )
{
SDL_Surface* TempSurface = IMG_Load( path.c_str() );
if( TempSurface == NULL )
{
printf( "Failed to load %s: error: %s\n", path.c_str(), IMG_GetError() );
}
/* add color coding if necessary here
SDL_SetColorKey( TempSurface, SDL_TRUE, SDL_MapRGB( TempSurface->format, 0, 0xFF, 0xFF ) );
*/
SDL_Texture* newTexture = SDL_CreateTextureFromSurface( renderer, TempSurface );
if( newTexture == NULL )
{
printf( "Failed to create a texture %s: error: %s\n", id.c_str(), SDL_GetError() );
}
SDL_FreeSurface( TempSurface );
Textures[ id ] = newTexture;
printf( "Texture %s mapped successfully", id.c_str() );
//possible error - not the cause of the described error
//SDL_DestroyTexture( newTexture );
}
自然,纹理贴图是 TextureManager 类的私有成员。函数是由 TextureManager 的构造函数调用,还是稍后由指向 TextureManager 的指针调用并不重要——结果相同。这个加载器的先前版本没有映射纹理,根本没有使用贴图,它工作得很好。那么地图是罪魁祸首吗?这是版本之间的唯一区别...
编辑:我在最后一行代码中添加了额外的注释并将其“注释”掉,因为在我测试了建议后这是错误的原因,程序的行为没有改变,所以它必须是其他的。
EDIT2:好的,我已经解决了这个问题 - 碰巧其中一个表面是从 .jpg 文件加载的,并且由于某种原因 jpg sdl 库文件已损坏。因此,JPG 支持在运行时未初始化,并且尝试加载 jpg 文件会使 exe 崩溃。替换项目文件夹中的 .dll 已解决问题 - 现在一切正常