Hey
I'm having an issue trying to get my button to change image when the mouse is hovering over it, i don't know where I am going wrong was hoping some could help.
The button does display, but does not change when the mouse is over it.
My class is like this:
For some reason, i cannot get the code to display properly... can a mod please check if this is a bug.
[source lang="cpp"]
#include <SFML/Graphics.hpp>
#include <string>
class Button
{
private:
int m_x, m_y;
int m_w, m_h;
public:
Button(int x, int y)
{
m_x = x;
m_y = y;
}
bool IsIn( int mouseX, int mouseY )
{
if (((mouseX > m_x) &amp;&amp; (mouseX < m_x + m_w))
&amp;&amp; ((mouseY > m_y) &amp;&amp; (mouseY < m_y + m_h ) ) ) {
return true;
} else {
return false;
}
}
void RenderBttn(sf::RenderWindow &amp;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.loadFromFile(img_on)){
exit(5);
}
sf::Sprite sprite(button);
m_w = sprite.getLocalBounds().width;
m_h = sprite.getLocalBounds().height;
if(IsIn(mouseX,mouseY)){
sf::Sprite sprite(button_on);
} else {
sf::Sprite sprite(button);
}
sprite.setPosition(m_x,m_y);
destination.draw(sprite);
}
};
[/source]
I should note im not sure if my approach is the best way ??
My main loop has:
[source lang="cpp"]
Button btn_quit(window.getSize().y/2, 200);
// Start the loop
while (window.isOpen())
{
// Process events
sf::Event event;
while (window.pollEvent(event))
{
// Close window : exit
if (event.type == sf::Event::Closed) {
window.close();
}
}
// Clear screen
window.clear();
// Draw the background sprites
window.draw(sprite);
window.draw(lsprite);
//render the button also check the mouse position
btn_quit.RenderBttn(window,event.mouseMove.x,event.mouseMove.y);
// Update the window
window.display();
}
[/source]
Hope you can help
SFML Mouse event
You can't use event.mouseMove.x and event.mouseMove.y outside of your "while(window.pollEvent(event))" loop.
You can *only* use those member variables within the loop, and *only* if "event.type == sf::Event::MouseMoved" for that specific iteration of the loop.
SFML 2.0 tutorial: Window events
How about adding a "UpdateMousePos(int mouseX, int mouseY)" function to your button class to read and store the location of the mouse?
Then within your poll-event loop, and only when "event.type == sf::Event::MouseMoved", you could call button.UpdateMousePos(event.mouseMove.x, event.mouseMove.y); to update the button's view of the last known mouse position.
Or you could just use the global function sf::Mouse::getPosition() within your button, without worrying about all that - it'd be the easiest option.
You can *only* use those member variables within the loop, and *only* if "event.type == sf::Event::MouseMoved" for that specific iteration of the loop.
SFML 2.0 tutorial: Window events
How about adding a "UpdateMousePos(int mouseX, int mouseY)" function to your button class to read and store the location of the mouse?
Then within your poll-event loop, and only when "event.type == sf::Event::MouseMoved", you could call button.UpdateMousePos(event.mouseMove.x, event.mouseMove.y); to update the button's view of the last known mouse position.
Or you could just use the global function sf::Mouse::getPosition() within your button, without worrying about all that - it'd be the easiest option.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement