Sign in to follow this  
Followers 0
thefollower

SFML Mouse event

1 post in this topic

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:

[b][u]For some reason, i cannot get the code to display properly... can a mod please check if this is a bug.[/u][/b]

[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 [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img] Edited by thefollower
0

Share this post


Link to post
Share on other sites
You can't use [i]event.mouseMove.x[/i] and [i]event.mouseMove.y[/i] outside of your "[i]while(window.pollEvent(event))[/i]" loop.

You can [b]*only*[/b] use those member variables within the loop, and [b]*only*[/b] if "[i]event.type == sf::Event::MouseMoved[/i]" for that specific iteration of the loop.
[url="http://www.sfml-dev.org/tutorials/2.0/window-events.php"]SFML 2.0 tutorial: Window events[/url]

How about adding a "[i]UpdateMousePos(int mouseX, int mouseY)[/i]" function to your button class to read and store the location of the mouse?
Then [u]within your poll-event loop[/u], and only when "event.type == sf::Event::MouseMoved", you could call [i]button.[/i][i]UpdateMousePos[/i][i](event.mouseMove.x, event.mouseMove.y); [/i]to update the button's view of the last known mouse position.

Or you could just use the global function [url="http://www.sfml-dev.org/documentation/2.0/classsf_1_1Mouse.php"]sf::Mouse::getPosition()[/url] within your button, without worrying about all that - it'd be the easiest option.
2

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0