I have a function in my class which loads 2 images but only displays once based on a certain condition.
The problem is i have to load the images first before the condition, this is occurring in my main loop. And I am not sure if that is wise so was wondering what i can do to make it slightly more elegant….
This is what i have:
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);
}
One solution i had was use fixed numbers of button size, but then that restricts the ability to change image sizes at a later date.
But also im loading 2 images in my main loop every time, surely this is bad for perfrmance?
Hope you can help 🙂
What you should do is store the loaded images as variables that can be accessed in your main loop. For example if your main loop is inside a class, add
sf::Texture button;member variables to it. When you load the program, load those two images, and then you can perform your checks every iteration of the loop to see whether or not the draw them. The key here is to load once and store them in memory, choosing to use them when you need to. If you notice in most games you play, typically at the start of a map, all of its resources such as textures, sounds etc are loaded at the “loading screen”, at which point they sit in memory until they are used (note not all games are like this, but its just an example).