SFML community forums
Help => Graphics => Topic started by: BorisDieKlinge on July 14, 2010, 12:30:26 am
-
Hey.
I'm sorry but i couldn't think of a better subject.
Here is my Porblem:
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow App(sf::VideoMode(800,600),"lala");
App.UseVerticalSync(true);
sf::Event Event;
sf::Image Image;
Image.LoadFromFile("E:/again_i_try_to/test/bin/Debug/x.bmp");
sf::Sprite Sprite;
Sprite.SetImage(Image);
while(App.IsOpened())
{
while(App.GetEvent(Event))
{
if((Event.Type== sf::Event::KeyPressed) && (Event.Key.Code==sf::Key::Escape))
App.Close();
if(Event.Type==sf::Event::Closed)
App.Close();
}
App.Clear(sf::Color(120,21,34));
Sprite.SetPosition(Event.MouseMove.X,Event.MouseMove.Y);
App.SetCursorPosition(100,100);
App.Draw(Sprite);
App.Display();
}
return EXIT_SUCCESS;
}
For some reason the cursor is moving around if you move your mouse. Thats not very surprising since I move it before I Set it back to (100,100). But why can I actually SEE this? Is there a way to fix this problem? Maybe a Buffersystem like in SDL?
I'm aware of the the fact, that I simly could delete the liene "Sprite.SetPosition(Event.MouseMove.X,Event.MouseMove.Y);" but i would like to fix this problem rather to learn than to produce a working code.
Thank you all.
-
Your code produces an undefined behaviour, because you use Event.MouseMove outside the event loop; its members may contain anything.
You should use App.GetInput().GetMouseX/Y() instead.
-
I replaced the line where I moved the corsur by
Sprite.SetPosition(App.GetInput().GetMouseX(),App.GetInput().GetMouseY());
But the problem remains.
I don't have a clue why...
Maybe somebody may compile my code to see what i mean?
-
But why can I actually SEE this?
Your application runs at X frames per second, whereas the mouse sends its position to the system Y times per second. In your case, X is probably lesser than Y.
-
...
But....
well. I understand your argumentation. But see:
App.Clear();
Clears the Screen. This means that the stuff actually displayed on screen is the stuff from the last frame.
App.Draw(Sprite);
Drwas the Sprite onto the Buffer.
App.Display();
Displays the content of the Buffer at the screen.
I actually don't get why the framerates X and Y have something to do with this, as the there should be nothing displayed what happens between App.Clear(); and App.Display();
So...
The Problem is gone as I suddenly, by writing this post, understand what happens :D
When you call
Sprite.SetPosition(Event.MouseMove.X,Event.MouseMove.Y);
the position of your cursor might be P(100,110).
This means that the Sprite will be drawn at this point P.
App.SetCursorPosition(100,100);
resets the cursor back to P(100,100). But during the time between this App.SetCursorPosition(100,100); and the next Sprite.SetPosition(Event.MouseMove.X,Event.MouseMove.Y); the position of the cursor might chang again to, e.g. P(132,83).
Well, thats it.
Maybe some other noobs like me can make use of my Problem :P
Thank you for your help
greetings BorisDieKlinge
[/code]