1

我的班级中有一个函数可以加载 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 张图像,这肯定不利于性能吗?

希望你能帮忙:)

4

2 回答 2

2

您应该做的是将加载的图像存储为可以在主循环中访问的变量。例如,如果您的主循环在一个类中,sf::Texture button;则向它添加成员变量。当您加载程序时,加载这两个图像,然后您可以在循环的每次迭代中执行检查以查看是否绘制它们。这里的关键是加载一次并将它们存储在内存中,在需要时选择使用它们。如果您注意到在您玩的大多数游戏中,通常在地图开始时,它的所有资源(例如纹理、声音等)都会在“加载屏幕”中加载,此时它们会一直保存在内存中,直到它们被使用(注意不是所有游戏都是这样,但这只是一个例子)。

于 2012-11-07T00:30:28.663 回答
0

为什么不先测试条件然后加载图像?例如,

编辑:您需要将加载从主循环中拉出来。在您的类中有两个按钮变量,并将以下代码放入您的构造函数中。

if (button.loadFromFile("button.png")) {
  exit(4);
}

if (button_on.loadFromFile("button.png")) {
  exit(4);
}

在主循环中,您不需要一次又一次地加载文件。

于 2012-11-07T00:32:46.103 回答