0

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

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

4

2 回答 2

2

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

现在规范化 D (这意味着缩放它使其长度为一):

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 的情况,以避免在归一化时除以零错误

于 2011-01-31T08:02:19.343 回答
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);
}
于 2016-04-30T10:11:59.737 回答