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

SFML - obiekt dynamiczny

Ostatnio zmodyfikowano 2015-11-10 22:43
Autor Wiadomość
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.

P-139902
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:
C/C++
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:
C/C++
someSprite.move( sf::Vector2f( 1, 0 ) * speed * timeModifier );
Dzięki tym zabiegom
someSprite
 będzie poruszać się w prawo ze stałą prędkością.
P-139906
« 1 »
  Strona 1 z 1