Où s'arrêtera mon personnage?

12

Il y a plusieurs années, j'ai codé de l'IA pour un jeu pseudo-3d à petit budget. Il y avait un calcul que je n'ai jamais vraiment trouvé la meilleure façon de faire, et c'était de calculer où l'ennemi finirait s'il s'arrêtait maintenant. Par exemple:

  • L'ennemi est actuellement à X = 540,0.
  • L'ennemi se déplace à droite à 10 pixels par image.
  • Lorsque l'ennemi veut s'arrêter, sa vitesse diminue de 1 pixel par image jusqu'à ce qu'elle atteigne zéro.

Existe-t-il une formule simple qui me permettrait de retrouver la position où l'ennemi se retrouve lorsqu'il est complètement arrêté? J'ai fini par précalculer et coder en dur l'offset qui fonctionnait pour mes besoins mais qui devait être calculé séparément pour les ennemis avec des vitesses différentes.

Kaivosukeltaja
la source

Réponses:

7

Je suis généralement d'accord avec la réponse de John. Je vais proposer une formule légèrement modifiée (qui ajoute un V / 2 supplémentaire à sa valeur):

D = V / A * (V + A) / 2 

Avec V = 10et A = 1, cela donne D = 55. C’est exactement le résultat de

10 + 9 + 8 + 7 + .... + 3 + 2 + 1

qui est le mouvement image par image de l'ennemi.

Voici comment vous vous y prendrez.

  1. V : vitesse actuelle = 10 pixels / image, A : accélération actuelle = 1 pixels / image ^ 2
  2. T : Temps pour s'arrêter = V / A = 10 images.
  3. Distance parcourue en 10 images = image1 + image2 + image3 + ... = V + (VA) + (V-2 * A) + ...
  4. Ceci est égal à T * V - A / 2 * T * (T-1), ce qui simplifie l'équation ci-dessus.
Jimmy
la source
+1 Je ne vois aucun défaut logique dans votre solution et je ne me souviens vraiment pas comment j'ai trouvé ma solution. Donc mon expression doit être fausse et je n'ai probablement pas remarqué en raison de la petite différence et du manque de tests détaillés? Est-ce que mon expression deviendrait correcte si j'ajoutais simplement la moitié de la vitesse?
John McDonald du
J'ai répondu à ma propre question en utilisant power calc. Prendre mon expression + (v / 2) semble toujours égaler votre expression pour tout v et a donné.
John McDonald du
Merci à @John et à vous, cela m'aurait fait économiser beaucoup d'efforts à l'époque! J'accepte cette réponse, car elle est plus simple et plus efficace, mais la réponse de John est également très appréciée. Acclamations gars!
Kaivosukeltaja
6

J'ai eu exactement le même problème lorsque je travaillais sur mon jeu, et il m'a fallu une éternité pour bien calculer (bleh). Voici donc:

minDistanceToStop = 0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0);

Réécrit en mathématiques régulières:

(Acceleration / 2) * (linearVelocity / Acceleration)^2

Où l'accélération dans votre cas est 1 et la vitesse linéaire est 10:

(1 / 2) * (10 / 1)^2
= 50 units to stop

ÉDITER

Le résultat et l'explication de Jimmy sont tous deux corrects. Ma formule exige que vous ajoutiez également la moitié de la vitesse.

minDistanceToStop = (0.5 * acceleration * Math.Pow(velocityLinear() / acceleration, 2.0)) + (velocityLinear() / 2);

ou

((Acceleration / 2) * (linearVelocity / Acceleration)^2) + (linearVelocity / 2)
((1 / 2) * (10 / 1)^2) + (10 / 2)
= 55
John McDonald
la source
2
Juste pour mémoire, Math.Pow () est une idée terrible, terrible ici. Il peut cas particulier de l'exposant '2.0' s'il est assez intelligent, mais de toute façon vous le découpez, réécrire cette expression en '0.5 * linearVelocity * linearVelocity / Acceleration' devrait être une énorme victoire.
Steven Stadnicki
4

Les calculs sur les changements de vitesse sont le point entier du calcul. Je ne l'ai pas fait depuis un moment donc je ne me souviens pas du haut de ma tête, mais je pense que votre situation prend simplement l'intégrale de -1 (c'est-à-dire la décélération).

jhocking
la source
0

N'est-ce pas ce mouvement d'accélération constante?

X = Xi + V*t + (1/2) * a * (t^2)

Où:
X: Dernière position
Xi: Position initiale
V: Vitesse
t: Temps
a: Accélération

La seule partie délicate ici est de savoir comment déterminer "t", car nous ralentissons avec une accélération de -1, puis nous pouvons calculer t = V / a, puis t est 10.

donc,
Xi: 540
V: 10
t: 10
a: -1

Mettez tout sur:

X = 540 + 10*10 + (1/2) * (-1) * (10 ^ 2) 
X = 540 + 100 + (-50) 
X = 540 + 50 
X = 590

La formule vient en prenant l'intégration de l'accélération: Vérifiez ici

tesla
la source