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.

Shaun Wild
la source

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);
}
Kevin DiTraglia
la source
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.

teh8bits
la source
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.

tesselode
la source