You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

俯视角射击游戏:如何让子弹沿鼠标方向保持恒定速度移动?

解决俯视角射击游戏子弹速度随鼠标距离变化的问题

这个问题其实很典型——你现在的方向向量是直接用玩家到鼠标的位置差,这个向量的长度会随鼠标距离变化,所以乘上速度后,自然距离越远子弹越快,反之越慢。核心解决思路就是把方向向量归一化(转换成单位向量),这样不管距离多远,方向向量的长度都是1,子弹的移动速度就会保持恒定了。

具体修改步骤:

  1. 替换方向向量的计算逻辑
    原来的代码直接用位置差作为方向,现在需要先计算这个向量的长度,再用位置差除以长度得到单位向量。还要注意处理鼠标正好在玩家位置的情况(避免除以0)。

    把构造函数里的代码改成这样:

    import "math"
    
    // 计算玩家到鼠标的偏移量
    dx := float64(mouseX) - b.x
    dy := float64(mouseY) - b.y
    
    // 计算偏移向量的长度(勾股定理)
    vecLength := math.Sqrt(dx*dx + dy*dy)
    
    // 归一化方向向量,同时避免除以0
    if vecLength > 0 {
        b.xDir = dx / vecLength
        b.yDir = dy / vecLength
    } else {
        // 当鼠标和玩家位置重合时,设置一个默认方向(比如向上)
        b.xDir = 0
        b.yDir = -1
    }
    
  2. 保留原有的更新逻辑
    更新函数里的代码不需要改动,因为现在xDiryDir是单位向量,乘上movementSpeed * dt后,子弹的移动速度就会始终保持恒定,方向也完全指向鼠标点击的位置:

    b.x += b.movementSpeed * dt * b.xDir
    b.y += b.movementSpeed * dt * b.yDir
    

原理说明:

单位向量的长度是1,所以不管原来的位置差有多大,归一化后向量的长度都固定为1。这样子弹每帧的移动距离就是movementSpeed * dt,完全不受鼠标与玩家的距离影响,同时方向始终正确。

内容的提问来源于stack exchange,提问作者NullJupiter

火山引擎 最新活动