【发布时间】:2009-09-25 08:41:11
【问题描述】:
我在 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 中的一个函数来释放所有加载的纹理。
【问题讨论】:
-
在使用相对路径并从不同文件夹运行可执行文件时,我有类似的程序。您是否从正确的位置运行 .exe?
-
抱歉回复晚了。但是,是的,我从正确的文件夹中运行它。从我的 IDE 或直接从资源管理器运行它没有区别 :(
-
在
SDL_LoadBMP失败后检查SDL_GetError的值
标签: c++ string sdl textures bmp