Jump to content

View more

Image of the Day

Adding some finishing touches...
Follow us for more
#screenshotsaturday #indiedev... by #MakeGoodGames https://t.co/Otbwywbm3a
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Sign up now

SFML Mouse event

4: Adsense

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   


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   Members   


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' or 'SotL' 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]

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.