2011-01-31 104 views
0

我完全沉迷於這一個。我正在使用C++和SFML 1.6來開發我正在開發的遊戲,並且我沒有任何血腥的想法。我如何製造投射物(如子彈)?我只是不明白這一點。這可能是我缺乏睡眠,但我不知道。如何製作投射物?

所以我的問題是如何創建一個精靈,在確定的方向移動的基礎上,鼠標是哪裏? (認爲​​自上而下射手用鼠標瞄準)

回答

2

最簡單的解決方案: 如果鼠標在MX中,我和船舶在SX,SY然後計算從船到鼠標的方向: DX = SX -MX 鏑= SY-我

現在歸d(這意味着,以便它的長度尺度是一個):

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

現在DX是要移動在x軸上子彈的距離以獲得子彈速度1.

因此,每個幀在移動子彈像這樣(子彈的位置:BX,子彈通過速度:燒烤[在每毫秒像素]幀時間呎[在毫秒])

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

這給你一個子彈以與鼠標方向或遊戲幀率無關的速度朝向鼠標位置移動。

編輯:由於@MSalters說,你需要檢查的DLEN == 0的情況下,當鼠標直接在上面的船,以避免被零個誤差的規範化

+1

當然,當'的Mx == SX &&我== Sy`,你就開槍你自己在腳下。 – MSalters 2011-01-31 11:40:31

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); 
}