現在、ゲーム プロジェクトで使用する 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: OK、問題を解決しました。サーフェスの 1 つが .jpg ファイルから読み込まれ、何らかの理由で jpg sdl ライブラリ ファイルが破損していました。そのため、JPG サポートは実行時に初期化されず、jpg ファイルをロードしようとすると exe がクラッシュしていました。プロジェクト フォルダー内の .dll を置き換えると、問題が解決しました。現在、すべてが期待どおりに機能しています。