我完全被这个难住了。我正在为我正在开发的游戏使用 C++ 和 SFML 1.6,但我完全不知道。我如何制作弹丸(如子弹)?我只是不明白。可能是我睡眠不足,但我不知道。
所以我的问题是如何创建一个根据鼠标位置向确定方向移动的 Sprite?(想想用鼠标瞄准的自上而下的射击游戏)
最简单的解决方案:如果鼠标在 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 的情况,以避免在归一化时除以零错误
一种方法是使子弹面向鼠标,然后通过使用三角函数将其移动穿过 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);
}