XNA中的转向行为无法按预期工作

时间:2014-07-08 16:19:37

标签: vb.net vector xna trigonometry

我正在阅读关于转向AI的以下页面:

http://rocketmandevelopment.com/blog/steering-behaviors-wander/

在底部是一些我试图隐藏在VB.NET + XNA中使用的代码

我的代码如下所示:

Sub AI()
Dim circleRadius As Single = 6.0F
Dim wanderAngle As Single = 0.0F
Dim wanderChange As Single = 1.0F
Dim enemySpeed As Single = 0.3F
Dim enemyPosistion As Vector2 = (1,1)
Dim circleMiddle As Vector2 = enemyPosistion
circleMiddle.Normalize()

circleMiddle = Vector2.Multiply(circleMiddle, circleRadius)

Dim wanderForce As New Vector2
wanderForce = Vector2.Normalize(wanderForce) * 3 ' Set length of vector
wanderForce = AngleToVector(wanderAngle)
Randomize()
wanderAngle += Rnd() * wanderChange - wanderChange * 0.5
Dim force As New Vector2
force = Vector2.Add(circleMiddle, wanderForce)
enemyPosistion += force * enemySpeed
End Sub

Private Function AngleToVector(angle As Single) As Vector2
    Return New Vector2(CSng(Math.Sin(angle)), -CSng(Math.Cos(angle)))
End Function

我意识到我通过将enemyPosistion设置为Vector2.Zero而犯了一个简单的错误,而是将其设置为(1,1)并使敌人飞向右侧。我收录了一段视频:

https://www.youtube.com/watch?v=UZubNaEA9W0

这更符合它应该做的事情:

https://www.youtube.com/watch?v=1wfgPCMdW2U

有谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:0)

您需要跨帧保留一些状态。至少是wanderAngle和速度向量。在游戏开始时只调用一次Randomize()。 circleMiddle应该是velocity * circleRadius。最后用circleMiddle + wanderForce和enemyPosition + = velocity * enemySpeed更新速度。老实说,整个代码看起来有点奇怪,混淆了一些物理概念。力影响身体的加速度(连同质量),加速度影响其速度(连同时间步长),速度影响其位置(连同时间步长)。 - Nico Schertler