2015-07-25 5 views
3

Je travaille sur un petit projet de jeu et je suis venu en problème en essayant de déplacer l'objet du point A au point B avec une vitesse de mouvement solide et un chemin de mouvement linéaire.prise de jeu - Mouvement linéaire entre les 2 objets (VB.NET/Tout langage de programmation)

Avec mes recherches, j'ai trouvé un morceau de code pour ce faire, mais il ne semble pas fonctionner parfaitement que la vitesse semble être différente en fonction de l'angle, il se déplace vers.

Ce code au moment:

Dim x As Single, y As Single 
    Dim sngInc As Single 
    Dim lStepValue As Long 

    Dim PT1X = pObj.Left 
    Dim PT1Y = pObj.Top 
    Dim PT2X = pTarget.Left 
    Dim PT2Y = pTarget.Top 
    If PT1Y = PT2Y Then 
     sngInc = 1 
     If PT2X > PT1X Then 
      lStepValue = 1 
     Else 
      lStepValue = -1 
     End If 
     y = PT1Y 
     x = PT1X 
     x += lStepValue * sngInc 
     pObj.Left = x 
     pObj.Top = y 
    Else 
     If PT2Y > PT1Y Then 
      lStepValue = 1 
     Else 
      lStepValue = -1 
     End If 
     sngInc = (PT2X - PT1X)/Math.Abs(PT1Y - PT2Y) 

     x = PT1X 
     y = PT1Y 
     y += lStepValue 
     x = x + sngInc * Math.Abs(lStepValue) 
     pObj.Left = x 
     pObj.Top = y 
    End If 

À mon projet de test, il est sous une minuterie avec une tique de 30ms. Je l'ai traduit à partir d'un code VB6 que j'ai trouvé quelque part. Le problème est que je l'ai dit plus haut, est que la vitesse de déplacement ne sera pas exactement la valeur de 1, mais quelque chose près de lui en fonction de l'angle. Est-ce que quelqu'un peut me fournir un correctif ou un exemple dans un autre langage de programmation comment cela se fait, parce que je n'ai pas trouvé d'aide de Google attendre le code VB6 que j'ai trouvé et je n'ai aucune expérience sur ce sujet. Je ne suis même pas sûr si on l'appelle mouvement linéaire entre 2 objet.

Merci beaucoup :)

Répondre

2

Votre code est une variante de l'analyseur différentiel numérique, qui est utilisé pour tramer une ligne. Mais ce n'est pas ce que tu veux. Voici une alternative:

Étant donné un point source (PT1X, PT1Y) et un point cible (PT2X, PT2Y), vous devez d'abord initialiser la direction du mouvement. Il semble que vous n'êtes pas familier avec les mathématiques vecteur, alors j'essaie de l'expliquer à un faible niveau. Mais je vous suggère de vous pencher sur l'arithmétique des vecteurs tôt ou tard. Cela rend la vie beaucoup plus facile.

La direction du mouvement est tout simplement la différence des deux points:

Dim dirX As Single = PT2X - PT1X 
Dim dirY As Single = PT2Y - PT1Y 

Nous pouvons calculer la longueur de cette direction (distance des deux points) avec le théorème de Pythagore:

Dim l = Math.Sqrt(dirX * dirX + dirY * dirY) 

Si on divise les composants de direction par cette longueur, nous obtenons une direction qui pointe vers la cible et a une longueur de 1. Ie si nous ajoutons cette direction à un point, le point se déplace exactement d'une unité dans la direction de la cible. Mais nous voulons probablement spécifier une certaine vitesse v. Par conséquent, on multiplie par que:

dirX = dirX * v/l 
dirY = dirY * v/l 

Toutes les étapes ci-dessus peuvent être exécutées avant tout mouvement. Maintenant, la mise à jour dans chaque trame est simplement:

pObj.Left += dirX 
pObj.Top += dirY 
+0

Merci, cela fonctionne comme je le veux :) –