我如何制造射弹?

时间:2011-01-31 06:47:58

标签: c++ sfml

我对这一点感到非常难过。我正在使用C ++和SFML 1.6来开发我正在开发的游戏,而且我没有血腥的想法。我如何制造射弹(如子弹)?我只是不明白。可能是我的睡眠不足但我不知道。

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

2 个答案:

答案 0 :(得分:2)

最简单的解决方案: 如果鼠标位于Mx,My和船位于Sx,Sy则计算从船到鼠标的方向: DX = SX-MX 的Dy = SY-我

现在规范化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的情况,以避免在规范化上被零除错

答案 1 :(得分:0)

一种方法是使子弹面向鼠标,然后使用三角法从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);
}