SFML Mouse event

Started by
0 comments, last by Servant of the Lord 11 years, 5 months ago
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;&amp;amp; (mouseX < m_x + m_w))
&amp;amp;&amp;amp; ((mouseY > m_y) &amp;amp;&amp;amp; (mouseY < m_y + m_h ) ) ) {
return true;
} else {
return false;
}
}

void RenderBttn(sf::RenderWindow &amp;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 smile.png
Advertisement
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.

This topic is closed to new replies.

Advertisement