SFML - obiekt dynamiczny
Ostatnio zmodyfikowano 2015-11-10 22:43
Crax Temat założony przez niniejszego użytkownika |
SFML - obiekt dynamiczny » 2015-11-10 19:51:16 Jeżeli mogę kogoś poprosić aby mi wytłumaczył jak poruszać obiektem w SFML. Dokładnie chodzi mi oto że mam grę pseudo rpg gdzie poruszam przeciwnikiem na mapie kafelkowej, ruch o 32 dwa piksele. (z jednego kafla na drugi "monster.move(0.32))
Problem jest taki że gdy napiszę funkcję poruszającą obiektem, mój obiekt porusza się z jednego punktu do drugiego bez żadnego ograniczenia prędkości czyli tyle ile procesor pozwala. Szukałem informacji jak to ograniczyć i ogólnie o budowie funkcji ruchu.
Nie którzy polecają mi uzależnienie szybkości ruchu od czasu podobnie jak tutaj: http://forum.miroslawzelent.pl/76595/sfml-clock-move
Problem jest taki że obiekt porusza się tak jak chciałem nie za szybko z jednego punktu do drugiego. Porusza się jednak o jeden piksel a nie tak jak ja chciałem z kafla na kafel czyli o 32. Niektórzy też proponują mi zastosowanie wektorów przesunięcia.
Najprościej ujmując chodzi mi oto aby obiekt przesunąć zatrzymać na chwilę w miejscu i przesunąć dalej. Myślałem na zastosowaniu zegara który co np sekundę przesuwa by obiekt dalej. To rozwiązanie wydaje mi się jednak nie profesjonalne.
Prosił bym o pomoc w zrozumieniu jak zbudowana może być taka funkcja ruch poza metodą move.
|
|
Gibas11 |
» 2015-11-10 22:43:09 Napiszę jak ja to rozwiązałem (długość skoku w jednej klatce odwrotnie proporcjonalna do czasu jej trwania). 1. Na początek nałóż limit fps. window.setFramerateLimit( 60 ); - Nie polecam, może prowadzić do tearingu i innych przykrości. window.setVerticalSyncEnabled( true ); - Wg. mnie najlepsze rozwiązanie, synchronizuje FPS z monitorem. Tutaj zauważysz już poprawę, przy stałej ilości FPS obiekt będzie poruszać się płynnie i bez skoków. Ma to jednak wady: a. Na innym komputerze monitor będzie pracował z inną częstotliwością odświeżania ekranu i doprowadzi to do zmiany prędkości obiektu. b. Przy spadku FPS zmienia się prędkość obiektu. Dlatego przyda się jeszcze sprawdzanie ile trwała klatka: sf::Time iterationTime = controlClock.getElapsedTime(); timeModifier = iterationTime.asSeconds() / perfectFrameTime; controlClock.restart();
Oczywiście gdzieś indziej musisz utworzyć timer, określić ile wynosi u ciebie perfectFrameTime (u mnie: float perfectFrameTime = 1.f / 60; ) i utworzyć zmienną timeModifier przechowującą stosunek trwania obecnej klatki do tego perfekcyjnego. Potem gdziekolwiek czymś ruszasz, mnóż prędkość przez timeModifier , wygląda to mniej-więcej tak: someSprite.move( sf::Vector2f( 1, 0 ) * speed * timeModifier );
Dzięki tym zabiegom someSprite będzie poruszać się w prawo ze stałą prędkością. |
|
« 1 » |