2个对象之间的线性移动

时间:2015-07-25 10:43:09

标签: vb.net

我正在研究一个小游戏项目,我试图将物体从A点移动到B点,并且具有稳定的移动速度和线性移动路径。

通过我的研究,我找到了一段代码来做到这一点,但它似乎并不完美,因为速度似乎根据它移动的角度而有所不同。

这是目前的代码:

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,而是接近它的值 取决于角度。

我只找到了使用VB6代码的解决方案,我找不到这方面的经验。我甚至不确定它是否被称为2对象之间的线性运动。

1 个答案:

答案 0 :(得分:2)

您的代码是数字微分分析仪的变体,用于栅格化线。但那不是你想要的。这是另一种选择:

给定源点(PT1X, PT1Y)和目标点(PT2X, PT2Y),首先需要初始化移动方向。你似乎不熟悉矢量数学,所以我试着在低级别上解释它。但我建议你迟早研究矢量算术。它让生活更轻松。

移动方向只是两点的差异:

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

我们可以用毕达哥拉定理计算这个方向的长度(两点的距离):

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

如果我们将方向分量除以这个长度,我们得到一个指向目标的方向,长度为1。如果我们将此方向添加到某个点,则该点会在目标方向上移动一个单位。但我们可能想要指定一定的速度v。因此,我们乘以:

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

以上所有步骤都可以在任何移动之前执行。现在,每个框架中的更新都是:

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