利用三角函数来计算鼠标位置确定运动角度。

我正在使用Lua编写一款游戏(即使您不知道Lua,由于其适用于任何编程语言,您也可以帮助我)。我的问题是我已经在玩家的表中定义了x和y变量:

player = {}
player.x = 10
player.y = 10
player.velocity = 50

我的目标是让玩家朝着屏幕上鼠标的位置移动。我目前已经设置了根据鼠标位置每次更新增加/减少x值和y值。我的代码类似于:

function update(delta_time)  -- delta_time是自上次更新以来的毫秒数
  if mouse.x > screen.width and mouse.y < screen.height then
    player.x = player.x + player.velocity * delta_time
    player.y = player.y + player.velocity * delta_time
end

那只是我定义的一个方向的例子。我的问题是我不想使用巨大的流程控制块来检查鼠标的x和y位置处于什么象限,并相应地调整玩家的x和y位置。我希望有一个流畅的360度检测,可以将玩家移动到鼠标相对于中心的角度。

我还有一个问题,当我将玩家移动到屏幕的右侧时,我只会增加x值,但当我将玩家移动到屏幕的东北侧时,我将增加x值和y值。这意味着玩家的速度将根据移动角度的精度增加2倍。当我将东北方向和西北方向分别变为东和西时,玩家现在会以3倍的速度前进,因为我将y增加/减少2,而将x增加/减少1。我不知道如何解决这个问题。我在数学和三角学方面非常擅长,但我很难将其应用到我的游戏中。我只需要有人为我打开灯,我就能明白了。如果您真的读完了这一切,感谢您的时间。

点赞
用户205508
用户205508

从玩家位置到鼠标位置计算出一个向量。对此向量进行归一化(即除以其长度),然后乘以player.velocity,然后将其添加到player.x和player.y上。这样,速度保持恒定,在所有方向上都可以获得平稳的移动。

-- 定义差异向量
vec = {}
vec.x = mouse.x - player.x
vec.y = mouse.y - player.y

-- 计算长度,以进行归一化
vec_len = math.pow(math.pow(vec.x, 2) + math.pow(vec.y, 2), 0.5)

-- 归一化
vec.x = vec.x / vec_len
vec.y = vec.y / vec_len

-- 移动玩家
player.x = player.x + vec.x * player.velocity * delta_time
player.y = player.y + vec.y * player.velocity * delta_time
2015-10-07 20:57:06