2017-04-26 2 views
0

Je commence à créer un jeu 2D et j'ai une certaine confusion quant à savoir si je devrais effectuer une rotation dans la fonction de mise à jour ou de rendu.Effectuer la rotation des vertices 2D dans la fonction de mise à jour ou la fonction de rendu

Le problème est le suivant: J'ai un triangle composé de trois sommets. Le triangle a une valeur de rotation en degrés.

Si je fais pivoter les sommets dans la fonction de mise à jour, le triangle tourne à l'infini car chaque mise à jour applique la rotation encore et encore.

Par conséquent, j'ai décidé de ne pas faire pivoter les sommets dans la fonction de mise à jour et d'effectuer plutôt la rotation, basée sur les sommets d'origine, dans la fonction de rendu.

Cela fonctionne, mais maintenant j'ai un problème différent. Les sommets ne sont pas réellement là où ils semblent être. Je ne peux donc pas utiliser les vertices pour effectuer une détection de collision, etc.

La seule idée que j'ai pour résoudre ceci est que je pourrais effectuer la rotation dans la fonction de mise à jour mais avoir deux ensembles de sommets; un pour les sommets d'origine, un des sommets tournés. Ensuite, utilisez les sommets pivotés dans les calculs de détection de collision - cela sent hacky et inefficace bien!

J'ai assemblé un codepen démontrant l'application de la rotation dans la fonction de rendu; https://codepen.io/anon/pen/pPRjLq

Use arrow keys to rotate 

Alors, dois-je tourner en rendre ou mettre à jour? Si rendu alors comment maintenir les sommets à jour? Si mise à jour alors comment puis-je empêcher les rotations infinies?

Toute aide de personnes expérimentées serait grandement appréciée - merci!

Répondre

0

Avoir la rotation se produire dans la méthode update que vous mettez à jour la rotation de l'acteur. Vous n'avez pas besoin de vous souvenir de deux sommets non plus, ce serait une meilleure alternative que d'avoir les sommets actuels de l'acteur et la rotation en radians, les sommets originaux n'ont pas besoin d'être mémorisés. En pensant à l'avenir, la détection de collision ne devrait pas dépendre des vecteurs de position d'un acteur, mieux encore, avoir un rectangle/AABB défini à la place, qui devrait être mis à jour/redimensionné lorsque la rotation est appliquée à l'acteur . Si vous avez utilisé un AABB personnalisé pour la détection, il peut être réglé par défaut sur la position du vecteur d'acteur, mais en séparant les constructions, il ouvre beaucoup de potentiel, par exemple en changeant les limites d'acteurs x/y/width/longueur à l'exécution il ne devrait pas être couplé avec l'acteur x/y/width/height qui devrait se rapporter à la représentation graphique de celui-ci.

Pour arrêter la rotation infinie, vous pouvez avoir un boolean pour indiquer si vous avez laissé la touche enfoncée et une autre pour la touche droite, et quelque chose comme ci-dessous;

update(delta) { 

    if(keyLeftDown) { 
     // apply rotation as rotation * delta/desiredFPS 
    } else if (keyRightDown) { 
     // 
    } 
} 

Espérons que cela aide.