SFML community forums

Help => Graphics => Topic started by: BorisDieKlinge on July 14, 2010, 12:30:26 am

Title: Would a buffer help me?
Post 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:

Code: [Select]

#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.
Title: Would a buffer help me?
Post by: Laurent on July 14, 2010, 11:22:29 am
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.
Title: Would a buffer help me?
Post by: BorisDieKlinge on July 14, 2010, 12:46:53 pm
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?
Title: Would a buffer help me?
Post by: Laurent on July 14, 2010, 02:49:36 pm
Quote
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.
Title: Would a buffer help me?
Post by: BorisDieKlinge on July 14, 2010, 03:49:06 pm
...
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]