[SFML] płynność ruchu w grze
Ostatnio zmodyfikowano 2012-09-15 18:18
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: 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 ); 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. |
|
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. |
|
m4tx |
» 2012-09-15 14:44:42 |
|
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: void KlasaSprite::HandleKeys( const sf::Input & in ) { if( in.IsKeyDown( sf::Key::Up ) && timer.GetElapsedTime() >= TimeToResetClock ) { pozycja.y--; timer.Reset(); } }
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 |
|
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()). |
|
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ć. |
|
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): if( in.IsKeyDown( sf::Key::Up ) && timer.GetElapsedTime() >= TimeToResetClock ) { pozycja.y--; timer.Reset(); } 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ę) |
|
RazzorFlame |
» 2012-09-15 15:07:42 Okej masz racje. Pisząc multiplier (czy jakoś tak) masz na myśli prędkość? |
|
« 1 » 2 |