Avant d'appliquer l'extrapolation au mouvement de mon sprite, ma collision a parfaitement fonctionné. Cependant, après avoir appliqué une extrapolation au mouvement de mon sprite (pour lisser les choses), la collision ne fonctionne plus.
Voici comment les choses fonctionnaient avant l'extrapolation:
Cependant, après avoir implémenté mon extrapolation, la routine de collision se rompt. Je suppose que c'est parce qu'il agit sur la nouvelle coordonnée qui a été produite par la routine d'extrapolation (qui est située dans mon appel de rendu).
Après avoir appliqué mon extrapolation
Comment corriger ce comportement?
J'ai essayé de mettre un contrôle de collision supplémentaire juste après l'extrapolation - cela semble résoudre beaucoup de problèmes, mais j'ai écarté cela car il n'est pas question de mettre de la logique dans mon rendu.
J'ai également essayé de faire une copie de la position de spritesX, d'extrapoler et de dessiner en utilisant cela plutôt que l'original, laissant ainsi l'original intact pour que la logique reprenne - cela semble une meilleure option, mais cela produit toujours des effets étranges en entrant en collision avec des murs. Je suis presque sûr que ce n'est pas non plus la bonne façon de gérer cela.
J'ai trouvé quelques questions similaires ici, mais les réponses ne m'ont pas aidé.
Voici mon code d'extrapolation:
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);
}
Appliquer l'extrapolation
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);
}
Éditer
Comme je l'ai mentionné ci-dessus, j'ai essayé de faire une copie des coordonnées du sprite spécifiquement pour dessiner avec ... cela a ses propres problèmes.
Tout d'abord, quelle que soit la copie, lorsque le sprite se déplace, il est super lisse, lorsqu'il s'arrête, il oscille légèrement à gauche / à droite - car il extrapole toujours sa position en fonction du temps. Est-ce un comportement normal et pouvons-nous le «désactiver» lorsque le sprite s'arrête?
J'ai essayé d'avoir des drapeaux pour gauche / droite et d'extrapoler uniquement si l'un d'eux est activé. J'ai également essayé de copier les dernières positions et les positions actuelles pour voir s'il y a une différence. Cependant, en ce qui concerne la collision, cela n'aide pas.
Si l'utilisateur appuie sur le bouton droit et que le sprite se déplace vers la droite, lorsqu'il touche un mur, si l'utilisateur continue de maintenir le bouton droit enfoncé, le sprite continuera à s'animer vers la droite, tout en étant arrêté par le mur ( donc pas réellement en mouvement), mais parce que le bon drapeau est toujours positionné et aussi parce que la routine de collision déplace constamment le sprite hors du mur, il semble toujours au code (pas au joueur) que le sprite est toujours en mouvement, et donc l'extrapolation se poursuit. Donc, ce que le joueur verrait, c'est le sprite 'statique' (oui, il est animé, mais il ne se déplace pas réellement sur l'écran), et de temps en temps, il tremble violemment alors que l'extrapolation tente de faire sa chose ..... .. J'espère que cette aide