如何使子弹以始终相同的速度向鼠标光标的方向移动?

时间:2019-04-29 12:18:42

标签: go 2d-games bulletphysics

我的游戏有问题。这是一个自上而下的射击游戏,如果我按下鼠标,则子弹应该朝着鼠标所在的方向射击。 问题是,通过我的尝试,当播放器和鼠标之间的距离较大时,子弹会更快,而当距离较小时,子弹会更慢。无论如何我都希望速度保持恒定。

这是我到目前为止的逻辑:

在构造函数中,给项目符号一个xDir和一个yDir: b.xDir = (float64(mouseX) - b.x) b.yDir = (float64(mouseY) - b.y)

然后在更新函数中,将其乘以deltaTime和子弹运动速度,并将其添加到相应的位置轴: b.x += b.movementSpeed * dt * b.xDir b.y += b.movementSpeed * dt * b.yDir

采用这种逻辑,子弹速度取决于鼠标和播放器之间的距离。我希望得到这样的答案:它不会影响速度,但仍然会在鼠标单击的方向上起作用。

预先感谢:)

2 个答案:

答案 0 :(得分:0)

类似的东西行吗?想法是为该方向创建一个0到1的值。为此,您将两个值除以两者中的最大值。然后,您可以将其乘以子弹的速度。我没有详细介绍playerPosition函数,但希望您可以推断出它会做什么。

func Max(x, y float64) float64 {
    if x < y {
        return y
    }
    return x
}
type Bullet struct {
  x, y, xDir, yDir float64
}
func getDirection(b *Bullet) {
  directionX = float64(mouseX) - playerPosition().x
  directionY = float64(mouseY) - playerPosition().y
  greatest = Max(mouseX, mouseY)
  b.xDir = directionX / greatest
  b.yDir = directionY / greatest
}

语法可能有点偏离,我主要是js开发人员;(

答案 1 :(得分:0)

问题是您的b.xDir和b.yDir值是直接根据距离计算得出的,因此鼠标距播放器的点击距离越远,该值就越高。将它们乘以dt可以使它们移动得更快。

您需要的是normalize向量,因此您只有一个方向,而没有从原始点击距离继承下来的幅度。您可能想使用向量库,但是如果要从头开始,它将看起来像这样:

magnitude := math.Sqrt(b.XDir * b.xDir + y.xDir * y.xDir)
b.xDir /= magnitude
b.yDir /= magnitude

此时,您的变量值仅是一个方向,乘以速度和dt将产生预期的效果。