我制作了一个程序,它具有两种不同的状态,一种用于菜单显示-“菜单状态”,另一种状态用于绘制某些内容-“绘制状态”。
但是我碰到一个奇怪的事情,如果我加载某些png的纹理并将其复制到渲染器进行显示,然后离开“ Menu State”进入“ Draw State”。纹理将以某种方式使矩形颜色无法正确显示(例如,使绿色变暗)。
在我的代码中,切换到新状态(调用MenuState :: onExit())将擦除纹理贴图(使用std :: string进行纹理智能指针索引的贴图)
因此,加载的texutre甚至在“绘图状态”中都不存在。
我不知道出了什么问题。这是我的一些代码
void TextureManager::DrawPixel(int x,int y,int width,int height,SDL_Renderer *pRenderer)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
rect.w = width;
rect.h = height;
SDL_SetRenderDrawColor(pRenderer,255,255);//same color value
SDL_RenderFillRect(pRenderer,&rect);
}
static bool TextureManagerLoadFile(std::string filename,std::string id)
{
return TextureManager::Instance().Load(filename,id,Game::Instance().GetRenderer());
}
bool TextureManager::Load(std::string filename,std::string id,SDL_Renderer *pRenderer)
{
if(m_textureMap.count(id) != 0)
{
return false;
}
SDL_Surface *pTempSurface = IMG_Load(filename.c_str());
SDL_Texture *pTexutre = SDL_CreateTextureFromSurface(pRenderer,pTempSurface);
SDL_FreeSurface(pTempSurface);
if(pTexutre != 0)
{
m_textureMap[id] = std::make_unique<textureData>(pTexutre,0);
SDL_QueryTexture(pTexutre,NULL,&m_textureMap[id]->width,&m_textureMap[id]->height);
return true;
}
return false;
}
void TextureManager::ClearFromTextureMap(std::string textureID)
{
m_textureMap.erase(textureID);
}
bool MenuState::onEnter()
{
if(!TextureManagerLoadFile("assets/Main menu/BTN PLAY.png","play_button"))
{
return false;
}
if(!TextureManagerLoadFile("assets/Main menu/BTN Exit.png","exit_button"))
//replace different png file here will also affect the outcome
{
return false;
}
if(!TextureManagerLoadFile("assets/Main menu/BTN SETTINGS.png","setting_button"))
{
return false;
}
int client_w,client_h;
SDL_GetWindowSize(Game::Instance().getclientWindow(),&client_w,&client_h);
int playBtn_w = TextureManager::Instance().GetTextureWidth("play_button");
int playBtn_h = TextureManager::Instance().GetTuextureHeight("play_button");
int center_x = (client_w - playBtn_w) / 2;
int center_y = (client_h - playBtn_h) / 2;
ParamsLoader pPlayParams(center_x,center_y,playBtn_w,playBtn_h,"play_button");
int settingBtn_w = TextureManager::Instance().GetTextureWidth("setting_button");
int settingBtn_h = TextureManager::Instance().GetTuextureHeight("setting_button");
ParamsLoader pSettingParams(center_x,center_y + (playBtn_h + settingBtn_h) / 2,settingBtn_w,settingBtn_h,"setting_button");
int exitBtn_w = TextureManager::Instance().GetTextureWidth("exit_button");
int exitBtn_h = TextureManager::Instance().GetTuextureHeight("exit_button");
ParamsLoader pExitParams(10,10,exitBtn_w,exitBtn_h,"exit_button");
m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pPlayParams,s_menuToPlay));
m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pSettingParams,s_menuToPlay));
m_gameObjects.push_back(std::make_shared<MenuUIObject>(&pExitParams,s_menuExit));
//change order of the 3 line code above
//or replace different png for exit button,will make the rectangle color different
std::cout << "Entering Menu State" << std::endl;
return true;
}
bool MenuState::onExit()
{
for(auto i : m_gameObjects)
{
i->Clean();
}
m_gameObjects.clear();
TextureManager::Instance().ClearFromTextureMap("play_button");
TextureManager::Instance().ClearFromTextureMap("exit_button");
TextureManager::Instance().ClearFromTextureMap("setting_button");
std::cout << "Exiting Menu State" << std::endl;
return true;
}
void Game::Render()
{
SDL_SetRenderDrawColor(m_pRenderer,255);
SDL_RenderClear(m_pRenderer);
m_pGameStateMachine->Render();
SDL_RenderPresent(m_pRenderer);
}
Menu State Figure
Correct Color
Wrong Color
编辑:此外,我发现这种奇怪的现象仅在使用'SDL_RENDERER_accELERATED'标志和-1或0驱动程序索引(即SDL_CreateRenderer(m_pWindow,1,SDL_RENDERER_accELERATED);
或{{ 1}}工作正常!