如何让我的子弹始终以相同的速度沿鼠标光标的方向移动?
How do I get my bullets move in the direction of the mouse cursor with always the same speed?
我的游戏有问题。这是一个自上而下的射击游戏,如果我按下鼠标,子弹应该会朝鼠标所在的方向射击。
问题是,在我的尝试中,当玩家和鼠标之间的距离变大时,子弹会更快,而当距离较小时,子弹会变慢。我希望这个速度无论如何都保持不变。
到目前为止我的逻辑是这样的:
在构造函数中,我为子弹指定了一个 xDir 和一个 yDir:
b.xDir = (float64(mouseX) - b.x)
b.yDir = (float64(mouseY) - b.y)
然后在更新函数中,我将它与 deltaTime 和 bullets movementSpeed 相乘,并将其添加到相应的位置轴:
b.x += b.movementSpeed * dt * b.xDir
b.y += b.movementSpeed * dt * b.yDir
按照这个逻辑,子弹速度取决于鼠标和玩家之间的距离。我将不胜感激一个不会影响速度但仍会朝着鼠标点击的方向前进的答案。
提前致谢:)
这样的东西行得通吗?这个想法是为方向创建一个 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 开发人员;(
问题是你的b.xDir和b.yDir值是直接根据距离计算的,所以鼠标点击离玩家越远,值就越高。当它们乘以 dt 时,它们移动得更快。
你需要的是 normalize 你的矢量,所以你只有一个方向,而不是从原始点击距离继承的幅度。你可能想使用矢量库,但如果你打算从头开始,它看起来像这样:
magnitude := math.Sqrt(b.XDir * b.xDir + y.xDir * y.xDir)
b.xDir /= magnitude
b.yDir /= magnitude
此时你的变量值就是一个方向,乘以speed和dt就会达到预期的效果。
我的游戏有问题。这是一个自上而下的射击游戏,如果我按下鼠标,子弹应该会朝鼠标所在的方向射击。 问题是,在我的尝试中,当玩家和鼠标之间的距离变大时,子弹会更快,而当距离较小时,子弹会变慢。我希望这个速度无论如何都保持不变。
到目前为止我的逻辑是这样的:
在构造函数中,我为子弹指定了一个 xDir 和一个 yDir:
b.xDir = (float64(mouseX) - b.x)
b.yDir = (float64(mouseY) - b.y)
然后在更新函数中,我将它与 deltaTime 和 bullets movementSpeed 相乘,并将其添加到相应的位置轴:
b.x += b.movementSpeed * dt * b.xDir
b.y += b.movementSpeed * dt * b.yDir
按照这个逻辑,子弹速度取决于鼠标和玩家之间的距离。我将不胜感激一个不会影响速度但仍会朝着鼠标点击的方向前进的答案。
提前致谢:)
这样的东西行得通吗?这个想法是为方向创建一个 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 开发人员;(
问题是你的b.xDir和b.yDir值是直接根据距离计算的,所以鼠标点击离玩家越远,值就越高。当它们乘以 dt 时,它们移动得更快。
你需要的是 normalize 你的矢量,所以你只有一个方向,而不是从原始点击距离继承的幅度。你可能想使用矢量库,但如果你打算从头开始,它看起来像这样:
magnitude := math.Sqrt(b.XDir * b.xDir + y.xDir * y.xDir)
b.xDir /= magnitude
b.yDir /= magnitude
此时你的变量值就是一个方向,乘以speed和dt就会达到预期的效果。