Przed zastosowaniem ekstrapolacji do ruchu mojego duszka, moje zderzenie działało idealnie. Jednak po zastosowaniu ekstrapolacji do ruchu mojego duszka (aby wygładzić rzeczy) kolizja nie działa.
Oto jak działało to przed ekstrapolacją:
Jednak po zaimplementowaniu mojej ekstrapolacji procedura kolizji zostaje zerwana. Zakładam, że dzieje się tak, ponieważ działa on na nową współrzędną utworzoną przez procedurę ekstrapolacji (która znajduje się w moim wywołaniu renderowania).
Po zastosowaniu mojej ekstrapolacji
Jak poprawić to zachowanie?
Próbowałem poddać się dodatkowej kontroli kolizji zaraz po ekstrapolacji - wydaje się, że to rozwiązuje wiele problemów, ale wykluczyłem to, ponieważ logika w moim renderowaniu nie wchodzi w rachubę.
Próbowałem również wykonać kopię pozycji spritesX, ekstrapolując ją i rysując używając tego, a nie oryginału, pozostawiając nienaruszony oryginał, aby logika mogła go zaakceptować - wydaje się to lepsza opcja, ale nadal daje dziwne efekty podczas zderzenia ze ścianami. Jestem prawie pewien, że to też nie jest właściwy sposób, aby sobie z tym poradzić.
Znalazłem tutaj kilka podobnych pytań, ale odpowiedzi mi nie pomogły.
To jest mój kod ekstrapolacji:
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
Stosowanie ekstrapolacji
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
Edytować
Jak wspomniałem powyżej, próbowałem wykonać kopię współrzędnych duszka, aby narysować ... to ma swoje problemy.
Po pierwsze, bez względu na kopiowanie, gdy duszek się porusza, jest super gładki, gdy się zatrzymuje, kołysze się lekko w lewo / w prawo - ponieważ wciąż ekstrapoluje swoją pozycję na podstawie czasu. Czy to jest normalne zachowanie i czy możemy je „wyłączyć”, gdy duszek się zatrzyma?
Próbowałem mieć flagi dla lewej / prawej i ekstrapolować tylko, jeśli którakolwiek z nich jest włączona. Próbowałem również skopiować ostatnie i bieżące pozycje, aby zobaczyć, czy jest jakaś różnica. Jednak w przypadku kolizji nie pomagają.
Jeśli użytkownik naciska powiedz, prawy przycisk, a duszek porusza się w prawo, gdy uderza o ścianę, jeśli użytkownik nadal przytrzymuje prawy przycisk, duszek będzie animował w prawo, zatrzymując się przy ścianie ( dlatego tak naprawdę się nie porusza), jednak ponieważ ustawiono prawą flagę, a także dlatego, że procedura kolizji stale przesuwa duszka ze ściany, nadal wydaje się kodowi (nie graczowi), że duszek wciąż się porusza, a zatem ekstrapolacja trwa. Tak więc gracz zobaczy, że duszek jest „statyczny” (tak, animuje, ale tak naprawdę nie porusza się po ekranie) i co jakiś czas trzęsie się gwałtownie, gdy ekstrapolacja próbuje to zrobić… .. Mam nadzieję, że to pomoże