Vb.net 两个对象之间的线性移动

Vb.net 两个对象之间的线性移动,vb.net,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

我正在做一个小游戏项目,我遇到了一个问题,就是试图用一个稳定的移动速度和一个线性的移动路径将物体从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代码的解决方案,我没有这方面的经验。我甚至不确定它是否被称为两个对象之间的线性运动。

您的代码是用于光栅化线条的数字微分分析仪的变体。但那不是你想要的。这里有一个替代方案:

给定源点
(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