0

SDL でテクスチャを開く際に問題が発生しました。bmp ファイルを読み取り、最適化し、カラーキーを追加する機能があります。

SDL_Surface* SDLStuff::LoadImage( char* FileName ) {
printf( "Loading texture: \"%s\"\n", FileName );

SDL_Surface* loadedImage = 0;
SDL_Surface* optimizedImage = 0;

loadedImage = SDL_LoadBMP( FileName );
optimizedImage = SDL_DisplayFormat( loadedImage );
SDL_FreeSurface( loadedImage );

Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 255, 0, 255 );
SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, colorkey );

//SDL_SetColorKey(Tiles[0].Texture, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(Tiles[0].Texture->format, 255, 0 ,255));

Cache.push_back( optimizedImage );

return optimizedImage;

}

これはうまくいきます。次に、すべてのテクスチャを次のようにロードすると、これも機能します。

Objects[0].Texture = SDLS.LoadImage( "data/mods/default/sprites/house.bmp" );
Objects[1].Texture = SDLS.LoadImage( "data/mods/default/sprites/wall0.bmp" );
Objects[2].Texture = SDLS.LoadImage( "data/mods/default/sprites/wall1.bmp" );
Selector.Texture = SDLS.LoadImage( "data/mods/default/selector.bmp" );
Tiles[0].Texture = SDLS.LoadImage( "data/mods/default/tiles/grass.bmp" );
Tiles[1].Texture = SDLS.LoadImage( "data/mods/default/tiles/dirt.bmp" );
Tiles[2].Texture = SDLS.LoadImage( "data/mods/default/tiles/black.bmp" );

しかし、ある種のデータファイルを介してこれを制御できるようにしたいと考えています。だから私はcsvファイルを解析する関数を書いた。次に、値を取得し、次のように bmp ファイルを読み取ろうとします。

void DataFile( std::string Mod, std::string FileName, std::string Separator = "\t" ) {
ini dataf;
dataf.Init();
dataf.LoadFile( "data/mods/" + Mod + "/" + FileName );
std::vector< std::vector< std::string > > MData = dataf.LoopCSV( Separator );

for ( unsigned int Row = 0; Row < MData.size(); Row++ ) {
    if ( MData.at( Row ).size() > 0 ) {
        if ( MData.at( Row )[0] == "TILE" ) {
            if ( MData.at( Row ).size() == 4 ) {
                std::string a = "data/mods/" + Mod + "/" + MData.at( Row )[3];
                WriteLog( a.c_str() );
                Tileset TTile;
                TTile.WalkCost = String2Int( MData.at( Row )[2] );
                TTile.Texture = SDLS.LoadImage( a.c_str() );
                Tiles[String2Int(MData.at( Row )[1])] = TTile;
            } else {
                WriteLog( "Wrong number of arguments passed to TILE\n" );
            }
        }
    }
}

dataf.Destroy();

}

これは完全にうまく機能し、実際に存在するファイルへのパスをログに記録します。すべてのファイルを再確認しました。しかし、とにかく SDLS.LoadImage() 呼び出しが失敗し、プログラムがクラッシュします。その行をコメントアウトすると、タイルがあるべき場所に何もレンダリングされないことを除いて、すべて完璧に機能します。しかし、ファイルはそこにあり、手動でロードすると機能し、SDL_DisplayFormat() を呼び出す前に sdl が初期化されるため、これの何が問題なのかわかりません :(

編集:人々を混乱させないためのメモです。SDLStuff クラスは、テクスチャへのポインターのキャッシュを使用します。そうすれば、キャッシュをループして、SDLStuff の関数を 1 回呼び出すだけで、ロードされたすべてのテクスチャを解放できます。

4

2 に答える 2

1

SDL_image 公式ライブラリを使用して jpg、png、tiff などを読み込むことができます: http://www.libsdl.org/projects/SDL_image/

于 2010-04-21T11:34:17.833 に答える
0

より良い解決策は、リソースを含むアーカイブ ファイルを作成し、その中でファイルを反復することです。

利点: 1. csv ファイルを作成する必要はありません。2. アーカイブされた bmp のサイズが小さくなります。3.アーカイブファイルにパスワードを設定して、リソースをユーザーから保護できます。

追加のリンク:

http://www.zlib.net/

C++ からアーカイブを操作するには、どのライブラリを使用すればよいですか?

于 2010-04-21T11:33:08.000 に答える