Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.

SFML Mouse event

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 thefollower   Members   -  Reputation: 197


Posted 06 November 2012 - 05:09 PM


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 Posted Image

Edited by thefollower, 06 November 2012 - 05:24 PM.


#2 Servant of the Lord   Crossbones+   -  Reputation: 20365


Posted 06 November 2012 - 10:58 PM

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.
It's perfectly fine to abbreviate my username to 'Servant' rather than copy+pasting it all the time.
All glory be to the Man at the right hand... On David's throne the King will reign, and the Government will rest upon His shoulders. All the earth will see the salvation of God.
Of Stranger Flames - [indie turn-based rpg set in a para-historical French colony] | Indie RPG development journal

[Fly with me on Twitter] [Google+] [My broken website]

[Need web hosting? I personally like A Small Orange]

Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.