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

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

1

13.01.2009, 20:26

[sfml] bewegen

hab mal ne frage bei meiner bewegung von meinem player:

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
if(g_pVerwaltung->GetApp()->GetEvent(Event))
    {
    
        if(Event.Type == sf::Event::KeyPressed)
        {
            switch(Event.Key.Code)
            {
            case sf::Key::Up : yVel = -5; break;
            case sf::Key::Down : yVel = 5; break;
            case sf::Key::Right : xVel = 5; break;
            case sf::Key::Left : xVel = 5; break;
            }
        }
        if(Event.Type == sf::Event::KeyReleased)
        {
            switch(Event.Key.Code)
            {
            case sf::Key::Up : yVel = 0; break;
            case sf::Key::Down : yVel = 0; break;
            case sf::Key::Right : xVel = 0; break;
            case sf::Key::Left : xVel = 0; break;
            }
        }
    }


was is daran falsch..... ich post noch render :

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
    Xposi = xVel; 
       
    //If the square went too far to the left or right or has collided with the wall

    //if( ( Xposi <= 0 ) || ( Xposi + SQUARE_WIDTH > SCREEN_WIDTH )|| ( CheckCollision()) ) 

    //{

        //Move back

        //Xposi -= xVel;//* g_pTimer->GetElapsed ();

    //}

    
    //Move the square up or down

    Yposi = yVel;
    
    //If the square went too far up or down or has collided with the wall

    //if( ( Yposi <= 0 ) || ( Yposi + SQUARE_HEIGHT > SCREEN_HEIGHT )|| ( CheckCollision()) ) 

    //{

        //Move back

        //Yposi += yVel;//* g_pTimer->GetElapsed ();

    //}   

    cout<< "Render ging";
    m_pSpritePlayer->SetPosi(Xposi, Yposi);
    m_pSpritePlayer->Render();
    cout<< "Render ging";

manchmal bewegt sich noch mein player die ganze zeit weida dann hab ich halt xVel und yVel in den konstruktor getan und auf null gesetzt aber der bewegt sich immer noch weiter ohne dass ich was drück..dann hab ichs aus dem konstruktor wieda naus getan und war immer noch so und wenn ich z.b. nach links drück reagiert er erst nach 1 sekunde. Also eine Sekunde Delay....sagt wenn ich noch was posten soll...
New Project: Operation CityRacer

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

2

13.01.2009, 20:41

Quellcode

1
2
3
4
            case sf::Key::Up : yVel = -5; break;
            case sf::Key::Down : yVel = 5; break;
            case sf::Key::Right : xVel = 5; break;
            case sf::Key::Left : xVel = 5; break;


Da fehlt dir einmal ein Minus, sonst ist mir auf den ersten Blick nichts Verdächtiges aufgefallen.

3

13.01.2009, 20:43

Ich hatte das Problem mal wo ich die Bewegung in einer Eventschleife hatte. Als ich das Ganze dann außerhalb der Eventschleife abgefragt hatte, gings.

Aber wie ich sehe hast du überhaupt keine Event Schleife, oder? Sondern machst das mit if / switch-case. Das könnte natürlich den gleichen Effekt haben.

Also einfach mal

C-/C++-Quelltext

1
if (App.GetInput().IsKeyDown(sf::Key::Up))  Sprite.Move(0, +100 * App.GetFrameTime());

(natürlich auf dein Code übertragen gesehen)
außerhalb von dem if/switch Konstrukt ausprobieren.

Achja, es ist sinnvoll bei Bewegungen die Zeit mit ein zu kalkulieren.

4

13.01.2009, 21:24

Jo, die Nachrichtenbehandlung dürfte Schuld sein.
Ich könnte ja mal raten und sagen, du hast einen Nachritenstack und GetEvent hohlt die nächste Nachricht. Dann hast du vielleicht ncoh eien feste Framerate.
Wenn jetzt mal 100 Ereignisse kommen, die keine Tastendrücke sind, wird eins nach dem anderen abgearbeitet, aber immer nur 1 pro Frame. Das würde Verzögerungen erklären.
Außerdem sind es eventuell nur KeyUp und KeyDown Events, und keine Abfrage ob die Raste jetzt gerade gedrückt ist oder eben nicht.
Lieber dumm fragen, als dumm bleiben!

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

5

13.01.2009, 21:40

Zitat

Achja, es ist sinnvoll bei Bewegungen die Zeit mit ein zu kalkulieren


hab ich nur rausgemacht wegen um zu testen obs dann geht....

:roll: ok ich versuchs mal mit raxors variante

thx für die hilfe
New Project: Operation CityRacer

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

6

13.01.2009, 21:47

eine Frage noch wie kann ich des xVel wieda auf null stzen weil es gibt ja keine funktion die IsKeyUp heißt

Edit: k habs gelöst, indem ich einfach nach der Render funktion xVel oder yVel auf null setze
New Project: Operation CityRacer

7

13.01.2009, 21:51

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
if(App.GetInput().IsKeyDown(sf::Key::Left))
{
//bla

} else if(App.GetInput().IsKeyDown(sf::Key::Right))
{
//mehr bla

} else
{
xVel = 0;
}
Dann wird bei gleichzeitigem drücken zwar links bevorzugt, aber das macht meist nicht viel. Ansonsten säh es halt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
if(App.GetInput().IsKeyDown(sf::Key::Left))
{
//bla

}
if(App.GetInput().IsKeyDown(sf::Key::Right))
{
//mehr bla

}
if(!(App.GetInput().IsKeyDown(sf::Key::Right)||App.GetInput().IsKeyDown(sf::Key::Left)))
{
xVel = 0;
}

8

14.01.2009, 00:03

Zitat von »"Genion"«

Ansonsten säh es halt so aus:

Oder einfacher:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
const float WalkSpeed = 2.21245f;

vx = 0.f;

if (App.GetInput().IsKeyDown(sf::Key::Left))
{
    vx -= WalkSpeed;
}

if (App.GetInput().IsKeyDown(sf::Key::Right))
{
    vx += WalkSpeed;
}


Zitat von »"Jonathan_Klein"«

Wenn jetzt mal 100 Ereignisse kommen, die keine Tastendrücke sind, wird eins nach dem anderen abgearbeitet, aber immer nur 1 pro Frame. Das würde Verzögerungen erklären.

Deshalb sollte man auch

C-/C++-Quelltext

1
while (App.GetEvent(Event))
und nicht

C-/C++-Quelltext

1
if (App.GetEvent(Event))
schreiben.

Nexxtron

Alter Hase

  • »Nexxtron« ist der Autor dieses Themas

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

9

14.01.2009, 19:32

bei while gings auch nich.... aber habs jetzt mit dem IsKeyDown gelöst
New Project: Operation CityRacer

10

15.01.2009, 00:16

Zitat von »"Nexxtron"«

bei while gings auch nich....
Das war nur so eine Anmerkung, damit dir auch in Zukunft keine Events verloren gehen. ;)

Die GetEvent()-Funktion ist für einmalige Events, für Echtzeitabfragen hat man eben GetInput().

Werbeanzeige