2015-07-25 8 views
3

Я работаю над небольшим проектом игры, и я столкнулся с проблемой, пытающейся переместить объект из точки A в точку B с твердой скоростью движения и линейный путь движения.Игра - Линейное Движение между 2 объектами (VB.NET/Любой язык программирования)

С моим исследованием я нашел фрагмент кода, чтобы сделать это, но он, похоже, не работает отлично, поскольку скорость, кажется, отличается в зависимости от угла, к которому он движется.

Это код на данный момент:

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 

На моем тестовом проекте, это под таймер с тик 30мс. Я перевел его из кода VB6, который я нашел где-то. Проблема в том, что, как я сказал выше, заключается в том, что скорость движения не будет точно равна 1, а что-то рядом с ней в зависимости от угла.

Может кто-нибудь предоставить мне исправить или привести пример на любом другом языке программирования, как это делается, потому что я не мог найти правильной помощи от Google, ожидая, что код VB6 я нашел, и у меня нет опыта по этому вопросу. Я даже не уверен, называется ли это линейным движением между двумя объектами.

Большое спасибо :)

ответ

2

Ваш код вариант цифрового дифференциального анализатора, который используется для растрирования линии. Но это не то, что вы хотите. Вот альтернатива:

Учитывая исходный пункт (PT1X, PT1Y) и целевую точку (PT2X, PT2Y), сначала необходимо инициализировать направление движения. Кажется, что вы не знакомы с векторной математикой, поэтому я пытаюсь объяснить ее на низком уровне. Но я предлагаю вам заглянуть в векторную арифметику рано или поздно. Это облегчает жизнь.

Направление движения просто разность двух точек:

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

Мы можем вычислить длину этого направления (расстояние между двумя точками) с теоремой Pythagora в:

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

Если мы разделим компоненты направления на эту длину, получим направление, указывающее на цель и имеющее длину 1. Т.е. если мы добавим это направление в точку, точка перемещается ровно на одну единицу в направлении цели. Но мы, вероятно, хотим указать определенную скорость v. Следовательно, умножим на это:

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

Все вышеуказанные шаги могут быть выполнены перед любым движением. Теперь обновление в каждом кадре просто:

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

Спасибо, это работает так, как я хочу, чтобы он работал :) –