Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] płynność ruchu w grze

Ostatnio zmodyfikowano 2012-09-15 18:18
Autor Wiadomość
anonim
Temat założony przez niniejszego użytkownika
[SFML] płynność ruchu w grze
» 2012-09-15 14:37:19
Cześć obsługuję ruch w grze w ten sposób:
C/C++
const sf::Input & input = app.GetInput();
if( input.IsKeyDown( sf::Key::Down ) )
{
    if( ktos.MySprite.GetPosition().y < mapHeight - 64 )
         ktos.MySprite.SetY(( ktos.MySprite.GetPosition().y + ktos.speed ) * Time ); //(Zmienna Time to pozostałośc po skomentowanym GetElapseDTime, równa się ona jeden, więc nie ma różnicy
   
    nowaKlatka = true;
}
if( input.IsKeyDown( sf::Key::Up ) )
{
    if( ktos.MySprite.GetPosition().y > 0 )
         ktos.MySprite.SetY(( ktos.MySprite.GetPosition().y - ktos.speed ) * Time );
   
    nowaKlatka = true;
}
if( input.IsKeyDown( sf::Key::Right ) )
{
    if( ktos.MySprite.GetPosition().x < mapWidth - 64 )
         ktos.MySprite.SetX(( ktos.MySprite.GetPosition().x + ktos.speed ) * Time );
   
    nowaKlatka = true;
}
if( input.IsKeyDown( sf::Key::Left ) )
{
    if( ktos.MySprite.GetPosition().x > 0 )
         ktos.MySprite.SetX(( ktos.MySprite.GetPosition().x - ktos.speed ) * Time );
   
    nowaKlatka = true;
}
Kiedy są jakieś inne zdarzenie(np ruch myszką), to obiekt przyspiesza, co jest niepożądanym skutkiem. Próbowałem też z app.GetElapsedTime(), ale wtedy działy się różne dziwne żeczy.
P-64956
DejaVu
» 2012-09-15 14:40:34
Jeżeli kod, który podałeś jest w pętli zdarzeń to wystąpienie opisanego efektu jest całkiem prawdopodobne.
P-64959
m4tx
» 2012-09-15 14:44:42
żeczy
Hm... ;p
P-64960
RazzorFlame
» 2012-09-15 14:47:50
Tak jak to powiedział @UP nie rób tego w pętli zdarzeń tylko poza. A co do metody jaką kontrolujesz prędkość to czy nie łatwiejszym sposobem będzie dodać do sprita timer (sf::Clock) i później robić np tak:
C/C++
void KlasaSprite::HandleKeys( const sf::Input & in )
{
   
    if( in.IsKeyDown( sf::Key::Up ) && timer.GetElapsedTime() >= TimeToResetClock )
    {
        pozycja.y--; //czy jak tam chcesz go przesuwać
        timer.Reset();
    }
    //inne klawisze
}
Które z tych rozwiązań jest lepsze? Które z nich opłaca się stosować?

Edit:
Ahh m4tx wcisnąłeś mi sie xD
Potwierdzałęm zdanie DejaVu
P-64961
m4tx
» 2012-09-15 14:49:52
@up to też nie jest zbyt dobry pomysł. Wyobraź sobie sytuację, że graczowi się, powiedzmy, system (albo gra) przycina np. na sekundę. I co wtedy? Obiekt przesunie się o max 1 piksel, a powinien się przesunąć, dla przykładu, o 20.
Najlepiej jest co klatkę przesuwać obiekt o multiplier * delta time (aka GetElapsedTime()).
P-64962
RazzorFlame
» 2012-09-15 14:54:36
No dobra spoko rozumiem ale np jeśli sie nie chce tworzyć gry multiplayer to chyba nie ma wielkiego znaczenia. Przecież timer dodaje jakby taki limiter klatek. Jeśli komputer użytkownika nie spełnia nawet podstawowych wymagań to i tak będzie się zacinać.
P-64963
m4tx
» 2012-09-15 15:02:04
Jeśli komputer użytkownika nie spełnia nawet podstawowych wymagań to i tak będzie się zacinać.
Jak już mówiłem - sam system może się też zaciąć, jeśli np. w tle będzie uruchomiona jakaś prockożerna aplikacja.

No dobra spoko rozumiem ale np jeśli sie nie chce tworzyć gry multiplayer to chyba nie ma wielkiego znaczenia.
1. Ma. Patrz wyżej.
2. Co będzie, jeśli autor zrobi grę singleplayer, a potem dorobi multi? :P Zresztą - to z multiplayerem ma niewiele wspólnego.
3. Powiedz mi, które rozwiązanie jest krótsze (i prostsze):
C/C++
if( in.IsKeyDown( sf::Key::Up ) && timer.GetElapsedTime() >= TimeToResetClock )
{
    pozycja.y--; //czy jak tam chcesz go przesuwać
    timer.Reset();
}
C/C++
if( in.IsKeyDown( sf::Key::Up )
pozycja.y - multiplier * timer.GetElapsedTime();
:)
(ofc. w 2. przypadku jeszcze potrzebujemy
timer.Reset()
, ale to wtedy wystarcza raz na klatkę)
P-64964
RazzorFlame
» 2012-09-15 15:07:42
Okej masz racje. Pisząc multiplier (czy jakoś tak) masz na myśli prędkość?
P-64965
« 1 » 2
  Strona 1 z 2 Następna strona