2016-04-28 91 views
0

我從這個論壇搜索和實施的東西,它不出來的權利。 我想要實現的是計算玩家子彈相對於他的positionrotationspawnPoint如何從角度和距離中計算出一個點?

spawnPoint應該和他X + his width(玩家設置爲指向默認右)y + height/2和(從他的中心產卵在Y軸)。

這是我從這個論壇得到:

this.bulletSpawn.x = (float)(this.position.x + this.width/2 + this.width * Math.cos(rotation)); 
this.bulletSpawn.y = (float)(this.position.y + this.height/2 + this.height/2 * Math.sin(rotation)); 

rotation爲弧度。 thisPlayer類。

圖像,顯示了我所期望的發生:

紅點是spawnPoint我想知道計算玩家positionrotation。 玩家Sprite是旋轉的東西,它旋轉與他的中心x和y有關,這是用lib完成的,我沒有這些變量。整個箭頭將是玩家,箭頭方向是玩家指向的地方,紅點將是子彈點(或預期點)

使用我貼的代碼,子彈似乎是產卵從別的地方。即使在開始時他們有一個偏移量,當我旋轉播放器時,spawnPoint似乎與我所期望的不同。

這是子彈位置代碼:

position.x = holder.bulletSpawn.x - (float)(this.width/2 * holder.rotation); 
position.y = holder.bulletSpawn.y - (float)(this.height/2 * holder.rotation); 

這是Bullet類的內部。 position變量是的Vector2,並且holder是玩家實例。此代碼僅僅是爲了讓子彈在其自身尺寸的中心產生偏移

我添加了一些與註釋相關的修復,但子彈仍然有一個微小的偏移,在某些角度看起來不對。 基本上我想得到的距離是玩家的寬度,他的中心y是高度/ 2。

+0

他旋轉哪個點?箭頭的開始?第二張圖片的旋轉會是什麼? – Keiwan

+1

跳到我頭上的第一件事是,第一個代碼段使用'this.width',但第二個使用'this.width/2'。似乎你有一個不同的參考點。 – andand

+0

此外,確切瞭解其對於給定角度和位置的行爲將會很有用。 – andand

回答

0

我們的初始位置是X0, Y0,旋轉約爲中心點CX, CY,旋轉角度爲Theta。因此,旋轉後的新位置是:

NX = CX + (X0-CX) * Cos(Theta) - (Y0-CY) * Sin(Theta) 
NY = CY + (X0-CX) * Sin(Theta) + (Y0-CY) * Cos(Theta) 

這個方程描述關於中心點任意點的旋轉仿射變換,並且仿射矩陣是平移,旋轉,以及反向翻譯矩陣的組合。

關於中心CX,CY - 你寫

它旋轉與他的X和Y起源於他的左下

關於初始點座標 - 對子彈它似乎是

X + Width, Y + Height/2 
+0

請添加一些解釋,我不喜歡複製粘貼。當你說初始位置時,誰的初始位置?玩家? bulletspawn?如果你指的是你指的是他的抽籤點, (意思是他在精靈矩形上的0,0)。更重要的是,如果你可以將它與我發佈的代碼聯繫起來,它會更好。 – rufoDev

+0

實際上,Sprite在矩形的中心旋轉,但我沒有這個變量,它從庫中這樣做。我所擁有的是從左下角座標繪製的原點。所以我現在需要的是計算矩形的中心,包括它的旋轉,所以我可以在你的CX和CY中使用它。我有精靈左邊,底部coorindate在屏幕上,旋轉角度,我有它的寬度和高度 – rufoDev

+0

基本上與您的解決方案我需要計算CX和CY,我也需要幫助,如果你可以借我一隻手 – rufoDev