Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Freyer

Frischling

  • »Freyer« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Hannover

  • Private Nachricht senden

1

02.07.2011, 19:33

[SFML 2.0] Sprite bewegt sich unsauber

Hallo Forum!

Ich beschäftige mich gerade etwas mit der SFML 2.0, doch will die nicht ganz so, wie ich will.
Ich lasse ein Quadrat zeichnen, welches sich über die Pfeiltasten steuern lässt. Funktioniert auch,
nur stottert die Bewegung zwischendurch extrem. Das Quadrat scheint teilweise mehrere 100 Pixel
zu überspringen. Außerdem bleibt es bei einem schnellen Richtungswechsel eine kurze Zeit unbewegt.
Habe ich irgendwas nicht beachtet?

Folgender Code (zur Erklärung: ich versuche dabei,
eine feste Anzahl Logikframes unabhängig von den visuellen Frames zu bekommen):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <SFML/Graphics.hpp>
#include <string>
#include <sstream>

using std::string;
using std::stringstream;

const int LOGIC_FPS = 100;
const int TIME_BETWEEN_UPDATES = 1000 / LOGIC_FPS;
const int BOX_MOVEMENT = 500 / LOGIC_FPS; // 500 Pixel per Sekunde

string FloatToStr( float f )
{
    stringstream ss;
    ss << f;
    return ss.str();
}

int main()
{
    sf::RenderWindow window( sf::VideoMode( 800, 600 ), "SFML-Window" );
    sf::Event event;
    const sf::Input& input = window.GetInput();

    sf::Image image;
    image.Create( 50, 50 , sf::Color( 0, 0xAA, 0xFF ) );
    sf::Sprite box( image );
    box.SetPosition( 375, 275 );

    sf::Text boxCoords;

    sf::Clock clock;
    unsigned int updateTime = clock.GetElapsedTime();


    while( window.IsOpened() )
    {
        while( clock.GetElapsedTime() > updateTime )
        {
            while( window.PollEvent( event ) )
            {
                if( event.Type == sf::Event::Closed )
                    window.Close();

            }

            if( input.IsKeyDown( sf::Key::Left ) )
                box.Move( -BOX_MOVEMENT, 0 );
            if( input.IsKeyDown( sf::Key::Right ) )
                box.Move( BOX_MOVEMENT , 0 );
            if( input.IsKeyDown( sf::Key::Up ) )
                box.Move( 0, -BOX_MOVEMENT );
            if( input.IsKeyDown( sf::Key::Down ) )
                box.Move( 0, BOX_MOVEMENT );
            
            boxCoords.SetString( string( "box.x = " ) + FloatToStr( box.GetPosition().x ) +
                    string( " box.y = " ) + FloatToStr( box.GetPosition().y ) );

            updateTime += TIME_BETWEEN_UPDATES;
        }

        window.Clear();
        window.Draw( box );
        window.Draw( boxCoords );
        window.Display();
    }
}


OS ist Ubuntu 10.04, gcc 4.4.3, falls das relevant ist.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Freyer« (02.07.2011, 19:44)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

02.07.2011, 21:14

Willkommen im Forum.
GetElapsedTime() scheint nicht die richtige Zeit zurück zu geben.
Ist wahrscheinlich ein Bug. Bei mir funktioniert es auch nicht.(Windows XP und VSExpress 2010)
Ich schau mal ob ich den Fehler find.

edit: Lad dir hier den neusten Snapshot und Rebuilde. Dort ist der Fehler behoben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (02.07.2011, 21:19)


Freyer

Frischling

  • »Freyer« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Hannover

  • Private Nachricht senden

3

02.07.2011, 21:39

Willkommen im Forum.

Danke!

edit: Lad dir hier den neusten Snapshot und Rebuilde. Dort ist der Fehler behoben.

Ist bereits der Neuste (heute nachmittags gedownloadet).

Zitat von »Nachoman«


GetElapsedTime() scheint nicht die richtige Zeit zurück zu geben.

Wenn ich mir die Werte ausgeben lasse, kommen da realistische Zahlen raus.

4

02.07.2011, 22:00

Ich hatte damals genau dasselbe Problem - im IRC wurde mir dann gesagt, dass das Problem sei, dass SFML in der derzeitigen Version bei jedem Frame immer die komplette Szene lösche und die Objekte in jedem Frame auch wieder erzeugen müsse. Es werde in der neuen Version an einer Lösung gearbeitet.

=> Kann es sein, dass es in SFML mittelerweile eine Variante ohne komplettes Löschen gibt und dieser Weg nurnoch aus Gründen der Abwärtskompatibilität existiert? (lange nixmehr damit gemacht)


MfG
dispy

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

02.07.2011, 22:14

Bei mir funktioniert dein Code mit der neusten Version. Allerdings unter Windows XP.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Freyer

Frischling

  • »Freyer« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Hannover

  • Private Nachricht senden

6

02.07.2011, 23:38

Ich kann es mir nicht erklären, aber nach einem Neustart funktionierte es plötzlich einwandfrei.
Trotzdem danke an euch.

Werbeanzeige