SDL中的动态纹理加载

时间:2009-09-25 08:41:12

标签: c++ string sdl textures bmp

我在SDL中打开纹理时遇到了问题。我有一个函数来读取bmp文件,优化它们并添加colorkey:

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中的函数的单个函数调用来释放所有加载的纹理。

2 个答案:

答案 0 :(得分:1)

您可能希望使用SDL_image官方库来加载jpg,png,tiff等: http://www.libsdl.org/projects/SDL_image/

答案 1 :(得分:0)

可能更好的解决方案是使用您的资源创建存档文件并在其中迭代文件。

优点: 1.您不需要创建csv文件。 2.您存档的bmp尺寸较小。 3.您可以为achive文件设置密码,以保护您的资源不被用户使用。

其他链接:

http://www.zlib.net/

What libraries should I use to manipulate archives from C++?