我正在研究一个小游戏项目,我试图将物体从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对象之间的线性运动。
答案 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