2017-08-28 56 views
1

我有一個擊中盒在我遊戲中的各種實體由Vector數組的定義,爲什麼我的旋轉矩陣不起作用?

我的實體之一緩慢地旋轉,以跟隨玩家的動作很自然,我需要命中框也轉動。

當我畫每個頂點到屏幕時,我的代碼會產生扭曲和扭曲的線條。我的實體大小爲64 x 64,所以+ 32表示對象的中心。

public void rotateVertices(Vector2[] vertices, double angle) { 

    double cos = Math.cos(angle); 
    double sin = Math.sin(angle); 

    for(int i = 0; i < vertices.length; i++){ 
     Vector2 v = vertices[i]; 
     vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32); 
     vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32); 
    } 

} 

我的構造函數:

public EnemyTriBall(Handler handler, float x, float y) { 
    super(handler, x, y, 3, 6); 

    vertices[0] = new Vector2(x + 25, y + 13); 
    vertices[1] = new Vector2(x + 64, y + 33); 
    vertices[2] = new Vector2(x + 25, y + 53); 

} 

回答

1

這裏:

Vector2 v = vertices[i]; 

你不把舊的載體的拷貝,你只是參考vectices[i]。所以,當你這樣做:

vertices[i].x = ((v.x - (x + 32)) * cos - (v.y - (y + 32)) * sin) + (x + 32); 

修改的原始載體的x。然後在下一行:

vertices[i].y = ((v.x - (x + 32)) * sin + (v.y - (y + 32)) * cos) + (y + 32); 

您使用舊v.y但新v.x,讓你奇怪的結果。最簡單的解決將是獲得xy,而是使用它們:

float vx = vertices[i].x; 
    float vy = vertices[i].y; 
    vertices[i].x = ((vx - (x + 32)) * cos - (vy - (y + 32)) * sin) + (x + 32); 
    vertices[i].y = ((vx - (x + 32)) * sin + (vy - (y + 32)) * cos) + (y + 32); 

可能有其他問題,我沒有檢查公式,但我想這一個開始。

+0

我會在下班後試試這個,但是我想這就是一直堅持回來的,謝謝 – Alex

+0

我的頂點不再偏斜,但是當我每一幀都通過旋轉的頂點時,它們會旋轉太多,你會知道要解決這個問題? – Alex

+0

@Alex您可能會遇到一些公式問題,如果不進行調試就診斷它非常困難。我會爲已知的輸入和輸出編寫幾個單元測試,並檢查出現了什麼問題。這應該不難。 – lexicore