【发布时间】:2011-06-18 09:52:08
【问题描述】:
我完全被这个难住了。我正在为我正在开发的游戏使用 C++ 和 SFML 1.6,但我完全不知道。我如何制造弹丸(如子弹)?我只是不明白。可能是我睡眠不足,但我不知道。
所以我的问题是如何创建一个根据鼠标位置向确定方向移动的 Sprite? (想想一个用鼠标瞄准的自上而下的射击游戏)
【问题讨论】:
我完全被这个难住了。我正在为我正在开发的游戏使用 C++ 和 SFML 1.6,但我完全不知道。我如何制造弹丸(如子弹)?我只是不明白。可能是我睡眠不足,但我不知道。
所以我的问题是如何创建一个根据鼠标位置向确定方向移动的 Sprite? (想想一个用鼠标瞄准的自上而下的射击游戏)
【问题讨论】:
最简单的解决方案: 如果鼠标在 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,你会开枪打自己的脚。
一种方法是让子弹面向鼠标,然后通过使用三角函数将它移动到 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);
}
【讨论】: