登录
首页 >  Golang >  Go问答

实现子弹始终以恒定速度朝向鼠标光标的方法

来源:stackoverflow

时间:2024-03-12 23:36:27 121浏览 收藏

golang学习网今天将给大家带来《实现子弹始终以恒定速度朝向鼠标光标的方法》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!

问题内容

我的游戏遇到问题。这是一个自上而下的射击游戏,如果我按下鼠标,子弹应该朝鼠标所在的方向射击。 问题是,根据我的尝试,当玩家和鼠标之间的距离较大时,子弹会更快,而当距离较小时,子弹会变慢。无论如何,我希望速度保持不变。

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

在构造函数中,我为项目符号指定了 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

按照这个逻辑,子弹速度取决于鼠标和玩家之间的距离。我希望得到一个不会影响速度但仍会沿着鼠标单击方向的答案。

提前致谢:)


解决方案


问题是你的b.xdir和b.ydir值是直接根据距离计算的,所以鼠标点击距离玩家越远,值就越高。当它们乘以 dt 时,它们会移动得更快。

您需要的是 normalize 您的矢量,因此您只有一个方向,而不是从原始点击距离继承的大小。您可能想使用矢量库,但如果您要从头开始,它会如下所示:

magnitude := math.sqrt(b.xdir * b.xdir + y.xdir * y.xdir)
b.xdir /= magnitude
b.ydir /= magnitude

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

这样的东西有效吗?这个想法是为方向创建一个 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 开发者;(

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>