Comment faire bouger une entité dans une direction?


11

J'ai une Entityinstance qui est mise à jour à chaque tick du jeu. Supposons simplement que l'entité progresse constamment. Je voudrais pouvoir donner l'angle de l'entité à une fonction qui la fait bouger dans cette direction:

moveForward(90);devrait les faire bouger vers la droite. Si j'ai déclaré ma rotation en tant que global int, alors faire

moveForward(rotation);
rotation++;

lui ferait tracer un petit cercle avec son mouvement.

Comment puis-je faire ceci? Je suppose que cela implique des mathématiques vectorielles; Je n'en connais pas, donc une brève explication serait bien.

Réponses:


16

Eh bien, dans le sens le plus simple, vous avez quelque chose comme ça.

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

La vitesse est cependant rapide que l'ennemi est, et vous pouvez déterminer combien ils doivent se déplacer dans la direction x et combien ils se déplacent dans la direction y en prenant le péché ou le cos de l'angle et en multipliant par la vitesse. Parce que...

 sin(a) = x / speed

Donc:

 x = speed * sin(a)

Et:

cos(a) = y / speed

Donc:

y = speed * cos(a)

Dans votre exemple, moveForward(90)cela donnerait speed * sin(90)ou speed * 1dans la direction x et speed * cos(90)ou 0dans la direction y (il devrait se déplacer vers la droite comme vous l'avez spécifié). Cela devrait vous aider à démarrer dans le sens de base.

Rendre général:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

Ahh, c'est beaucoup plus simple que ce que j'imaginais, merci beaucoup :)
Shaun Wild

Je suis sûr que vous devez changer les y et les x. sin (alpha) = b / c.
jcora

@Bane il correspond au dessin que j'ai fait SOH-CAH-TOA, le péché est opposé à l'hypoténuse qui dans le dessin est x / vitesse. Si l'angle était de l'autre côté du triangle, il serait inversé (et si c'est plus pratique à des fins de conception de jeu, je pourrais le changer, mais je pense que tout est arbitraire).
Kevin DiTraglia

Je suis sur mon téléphone portable, donc c'était assez difficile à interpréter. Je viens de
survoler

C'est un très joli triangle que tu as là. +1
Bro Kevin D.18

3

L'autre réponse est erronée à partir de maintenant, pour vous déplacer correctement le long d'un plan basé sur une rotation, vous procédez comme suit:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

Cependant, je vous recommande de créer une variable pour cos / sin que vous ne mettez à jour que lorsque la rotation change afin de ne pas la calculer 4 fois par tick.

La strafeSpeed ​​se déplacerait d'un côté à l'autre, la forwardSpeed ​​pour avancer le long de votre rotation.

edit: tesselode fait la même chose sauf qu'il n'a pas de mouvement latéral.


2

Vous avez dit que la mise à jour est cochée, donc je suppose que vous n'avez pas de fréquence d'images variable. Si c'est le cas:

x + = vitesse * math.cos (angle)

y + = vitesse * math.sin (angle)

Si vous utilisez une fréquence d'images variable, vous devez également multiplier par le temps delta.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.