2014-12-27 23 views
0

我正在製作一款2D戰鬥遊戲,其中包括一架戰鬥機,用於對付太空飛船的導彈,我希望飛船在玩家位置的功能中旋轉,以便他們總是面對玩家頭部」。玩家可以在y和x方向上自由移動。 玩家和宇宙飛船有一個Vector2的pos變量,對應於他們的實際位置。 任何幫助,將不勝感激。旋轉玩家位置功能的紋理

這是我(現在的工作)代碼:

public void render(SpriteBatch sb) { 
    Vector2 temp = new Vector2(); 
    float angle = temp.set(entityManager.getPlayer().pos).sub(pos).angle(); 
    TextureRegion region = new TextureRegion(texture); 
    sb.draw(region, pos.x, pos.y, 0, 0, texture.getWidth(), texture.getHeight(), 1.0f, 1.0f,angle+90); 
} 

敵人飛船旋轉,但他們不總是面向玩家: enter image description here

回答

1

的@ DWN的答案是數學上正確,但是當你處理LibGDX框架,最好使用本地工具。

如果你有敵人和玩家的位置存儲在Vector2 s那麼你可以進行計算有點方便。 例如,要確定具體的敵人和玩家之間的角度:

Vector2 enemyPos; 
Vector2 playerPos; 
Vector2 temp; 

float angle = temp 
       .set(playerPos) 
       .sub(enemyPos) 
       .angle(); 

這會給你你想要什麼。當然,最好將temp矢量放在公共空間的某個地方,以便在衆多計算中使用它。你最好去檢查其他方便的Vector2方法,它會認真的輕鬆你的生活。

祝你好運。

+0

我該如何應用角度來做旋轉? – MMrj

+0

首先你不應該在每個render()調用中實例化Sprite。創建一次,並分別保存在遊戲中的每個單位。 您可以將一些轉換參數應用於每個Sprite。像旋轉,縮放...然後,只需調用spirte.draw(sb) – Metaphore

+0

以及我實際上沒有使用Sprites,每個實體都有一個Vector2 pos和紋理,有沒有什麼方法可以做到這一點而不使用sprite? – MMrj

0

我認爲這應該工作。設置..

v = centerPosOfShip - centerPosOfUFO 

規範化...

v /= sqrt(v.x * v.x + v.y * v.y) 

所以,現在我們可以說,V = [COS(THETA)罪(THETA)];旋轉矩陣是...

[ cos(theta) -sin(theta) ] 
[ sin(theta) cos(theta) ] 

所以我們可以在V-組件方面寫...

[ v.x -v.y centerPosOfUFO.x ][x] 
[ v.y v.x centerPosOfUFO.y ][y] 
[ 0  0  1    ][1] 

其中[X Y]是UFO相對於它的中心上的任何一點。

希望是有道理的