【问题标题】:How do I make projectiles?如何制作弹丸?
【发布时间】:2011-06-18 09:52:08
【问题描述】:

我完全被这个难住了。我正在为我正在开发的游戏使用 C++ 和 SFML 1.6,但我完全不知道。我如何制造弹丸(如子弹)?我只是不明白。可能是我睡眠不足,但我不知道。

所以我的问题是如何创建一个根据鼠标位置向确定方向移动的 Sprite? (想想一个用鼠标瞄准的自上而下的射击游戏)

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    最简单的解决方案: 如果鼠标在 Mx,My 并且船在 Sx,Sy 然后计算从船到鼠标的方向: Dx=Sx-Mx Dy=Sy-My

    现在对 D 进行归一化(这意味着对其进行缩放以使其长度为 1):

    DLen=sqrt(Dx*Dx + Dy*Dy)
    Dx/=DLen;
    Dy/=DLen;
    

    现在 Dx 是您想要在 x 轴上移动子弹的距离,以获得 1 的子弹速度。

    因此,您移动子弹的每一帧都像这样(子弹的位置:Bx,按子弹的速度:Bs [以每毫秒像素为单位] 帧时间 Ft[以毫秒为单位])

    Bx=Bx+Dx*Bs*Ft
    By=By+Dy*Bs*Ft
    

    这为您提供了一个子弹,它以与鼠标方向或游戏帧速率无关的速度向鼠标位置移动。

    编辑:正如@MSalters 所说,当鼠标直接位于船上方时,您需要检查 DLen==0 的情况,以避免在归一化时除以零错误

    【讨论】:

    • 当然,当Mx==Sx && My==Sy,你会开枪打自己的脚。
    • 好吧,这是有道理的,但是:Arrrrgghhh。数学。不过还是谢谢。
    • 如果你能得到一个二维向量库,那么这些东西的数学和代码就少了一半
    • 我想在这里强调@Elemental 的评论。使用更高级的向量代数将大大简化游戏开发。在 C++ 中,有many vector algebra libraries available。还有Thor 允许您直接使用SFML 的向量类型。
    【解决方案2】:

    一种方法是让子弹面向鼠标,然后通过使用三角函数将它移动到 x 和 y 轴上,从角度找到斜边。我认为我没有很好地解释这一点,所以这里是使精灵从其旋转中移动的代码:

    void sMove(sf::Sprite& input,float toMove, int rotation){
    bool negY = false;
    bool negX = false;
    int newRot = rotation;
    if (rotation <= 90){
        negY = true;
    }
    else if (rotation <= 180){
        //newRot -= 90;
        negY = true;
    }
    else if (rotation <= 360){
        newRot -= 270;
        negY = true;
        negX = true;
    }
    float y = toMove*cos(newRot*PI/180);
    float x = toMove*sin(newRot*PI/180);
    if (negY){
        y = y*-1;
    }
    if (negX){
        x = x*-1
    }
    input.move(x, y);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多