2012-11-06 16 views
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张图片,这对于表现来说肯定是不好的?

希望你能帮助:)

回答

2

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

0

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

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

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

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

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

+0

因为我需要知道图像的尺寸,以便知道鼠标是否处于或超过“​​按钮”的位置。所以我必须先得到它的局部范围。 – Sir