我的课程中有一个功能,可以加载2张图像,但只根据特定情况显示一次。
问题是我必须先在条件之前加载图像,这是在我的主循环中发生的。我不确定这是否明智,所以想知道我能做些什么才能让它更优雅......
这就是我所拥有的:
Main Loop
:
btn_quit.RenderBttn(window,mouseX,mouseY);
Class function
void RenderBttn(sf::RenderWindow &destination,int mouseX, int mouseY)
{
std::string img = "button.png";
sf::Texture button;
if (!button.loadFromFile(img)){
exit(4);
}
std::string img_on = "button_on.png";
sf::Texture button_on;
if (!button_on.loadFromFile(img_on)){
exit(5);
}
sf::Sprite sprite(button);
m_w = sprite.getLocalBounds().width; //get dimensions
m_h = sprite.getLocalBounds().height; //get dimensions
sf::Sprite result(IsIn(mouseX,mouseY) ? button_on : button); //check if mouse is over the button
result.setPosition(m_x,m_y);
destination.draw(result);
}
我使用的一个解决方案是使用固定数量的按钮大小,但这限制了以后更改图像大小的能力。
但是我每次都会在我的主循环中加载2张图片,这肯定对于性能不好?
希望你能提供帮助:)
答案 0 :(得分:2)
您应该做的是将加载的图像存储为可在主循环中访问的变量。例如,如果您的主循环位于类中,请向其添加sf::Texture button;
个成员变量。加载程序时,加载这两个图像,然后您可以在循环的每次迭代中执行检查以查看是否绘制它们。这里的关键是加载一次并将它们存储在内存中,选择在需要时使用它们。如果您在大多数游戏中都注意到,通常在地图的开头,它的所有资源(如纹理,声音等)都会在“加载屏幕”中加载,此时它们会一直存放在内存中直到它们被使用(注意不是所有游戏都是这样的,但它只是一个例子。)
答案 1 :(得分:0)
为什么不首先测试条件然后加载图像?如,
编辑:你需要将你的装载拉出主循环。在类中有两个按钮变量,并将以下代码放在构造函数中。
if (button.loadFromFile("button.png")) {
exit(4);
}
if (button_on.loadFromFile("button.png")) {
exit(4);
}
在主循环中,您不需要反复加载文件。