2014-01-31 83 views
0

我有四個32×32的矩形用於我的遊戲角色(統稱爲船和每個矩形代表具有自己的碰撞檢測的單元格(船艙)系統)。基於鄰接矩形旋轉後矩形的位置

我將這些單元格以2x2格式保存在一起。沿着X軸和Y軸移動'船'一切都很好。但是,當我旋轉「船」時,各個矩形旋轉並面向正確的方向,但它們不再「在一起」。也就是說,矩形A1的右邊框與矩形A2的左邊框不同步,等等......

如何糾正矩形的位置,使它們在旋轉後仍對齊?這是我的第一場比賽,我不是一個數學家,因此我發現自己在這件事上要求您的專業知識!

非常感謝您的幫助。如果您需要更多信息(即代碼),那麼我會提供!

更新:

我終於得到了這個工作!以下是我的代碼。我希望這可以幫助別人!

//The point we want to rotate around (in this example, I was rotating around another ship) 
Vector2 origin = new Vector2(selectedShip.Position.X, selectedShip.Position.Y); 

test1.Position = Vector2.Transform(test1.Position - origin, Matrix.CreateRotationZ(testRot)) + origin; 
test2.Position = Vector2.Transform(test2.Position - origin, Matrix.CreateRotationZ(testRot)) + origin; 
test3.Position = Vector2.Transform(test3.Position - origin, Matrix.CreateRotationZ(testRot)) + origin; 
test4.Position = Vector2.Transform(test4.Position - origin, Matrix.CreateRotationZ(testRot)) + origin; 

// Alter the rotation of the four ship compartments for drawing 
test1.Rotation += testRot; 
test2.Rotation += testRot; 
test3.Rotation += testRot; 
test4.Rotation += testRot; 

// Update rectangle positions 
test1.Rect = new Rectangle((int)test1.Position.X, (int)test1.Position.Y, ship01Texture.Width, ship01Texture.Height); 
test2.Rect = new Rectangle((int)test2.Position.X, (int)test2.Position.Y, ship01Texture.Width, ship01Texture.Height); 
test3.Rect = new Rectangle((int)test3.Position.X, (int)test3.Position.Y, ship01Texture.Width, ship01Texture.Height); 
test4.Rect = new Rectangle((int)test4.Position.X, (int)test4.Position.Y, ship01Texture.Width, ship01Texture.Height); 

theSprite.Draw(ship01Texture, test1.Rect, null, Color.White, test1.Rotation, Vector2.Zero, SpriteEffects.None, 0.0f); 
theSprite.Draw(ship01Texture, test2.Rect, null, Color.White, test2.Rotation, Vector2.Zero, SpriteEffects.None, 0.0f); 
theSprite.Draw(ship01Texture, test3.Rect, null, Color.White, test3.Rotation, Vector2.Zero, SpriteEffects.None, 0.0f); 
theSprite.Draw(ship01Texture, test4.Rect, null, Color.White, test4.Rotation, Vector2.Zero, SpriteEffects.None, 0.0f); 

非常感謝大家的幫助!

+0

轉動而轉動是角度的功能(例如),並指出圍繞你轉的。你確定這個點對於你所有的矩形都是一樣的嗎? – wondra

+0

所有矩形的原點應設置爲已經是旋轉點的矩形的中心。試試這個:RotateAboutOrigin(new Vector2(test1.Width/2,test1.Height/2),Vector2.zero,rotation) – pid

+0

謝謝@pid,我試過了,現在我可以圍繞一個點旋轉我的'ship'。然而,這一點並不是「船」的中心,它不在船上。這很可能是我混淆了我的邏輯。我現在所擁有的,我可能稍後會用它來使'船'軌道成爲一個身體(即一顆行星)。我會用更多信息更新我的問題。此外,感謝您更新您的答案 - 這對我很有幫助,我相信這對於那些其他XNA初學者來說是一個很大的幫助! – user3256944

回答

2

將矩形錨定在其中心,而不是四個頂點之一。

你有一個分層結構:

  • 與翻譯(集合的中心位置)
  • 集合中的每個元素的集合,你將有一個相對位置集合的中心

在這一點上,你必須旋轉矩形的矩形本身這樣的位置和:

  • 在(之前翻譯)原點旋轉元件
  • 相對旋轉位置
  • 添加絕對位置和相對位置
  • 翻譯矩形

這是一個小圖:

+-----+-----+ 
|  |  | 
| e | e | 
|  |  | 
+-----C-----+ 
|  |  | 
| e | e | 
|  |  | 
+-----+-----+ 

C是集合的中心,e是元素的中心。 相對位置是矢量e-C。 這是非常基本的東西,聽起來很難,但它只是添加/減去矢量(位置)並按正確順序將它們旋轉角度的問題。

翻譯/旋轉元素/集合的訂單非常重要。

要繞矩形的中心:

Vector2 p1 = new Vector2(+test1.Width/2, +test1.Height/2) 
Vector2 p2 = new Vector2(+test2.Width/2, -test2.Height/2) 
Vector2 p3 = new Vector2(-test3.Width/2, +test3.Height/2) 
Vector2 p4 = new Vector2(-test4.Width/2, -test4.Height/2) 

的:

RotateAboutOrigin(new Vector2(test1.Width/2, test1.Height/2), Vector2.zero, rotation) 

此時由所述相對位置,這是其中之一(每個矩形一行)翻譯實際的相對翻譯到矩形的映射必須確定,在這裏我只是試圖給出一個想法。通過改變實際的線路向上/向下,正確的組合將很容易找到。

最後,翻譯由集羣的中心:

p1 + c // c is also a Vector2 

所有這些代碼可以事後予以糾正,並通過去除大量多餘的代碼,並在適當的地方保存向量的優化。尤其是內部RotateAboutOriginCreateRotationZ()應緩存,這樣的:

Matrix[] rot = new Matrix[64]; 

for(phi = 0; phi < 64; phi++) 
{ 
    rot[phi] = Matrix.CreateRotationZ(phi/64 * 2 * Math.PI); 
} 

在上述例子中,你會然後有64點矩陣和一個64逐步旋轉。然後,您只能旋轉最小角度的離散倍數1/64 * 2 * Math.PI。這將使功能更快。

+0

謝謝你向我解釋這個。這非常明確,非常有意義,不幸的是,在實施這個過程中,我仍然處於虧損狀態! – user3256944

+0

如果你有一個時刻,你能否看到我更新的問題,並提供進一步的指示? – user3256944

+0

我確定這是我所追求的,所以我將其標記爲答案。但是,它會花費我一些時間將它放在代碼中。基於我提供的代碼的任何樣本都會有很大的幫助。 – user3256944

3

從你的問題,我假設你開始在左邊,最後與中間圖像,而不是右邊。

enter image description here

在中間圖像的矩形都是他們個人的中心,而不是周圍旋轉的圖像之間的差異正在繞同一個點。

here如何圍繞給定的點

+0

是的,這是我的問題。感謝您提供鏈接。請看我編輯的問題,希望你能提供進一步的幫助! – user3256944

+0

我從另一個鏈接寫了這段代碼。在你的實現中,user3256944,你實現它是錯誤的。 「原點」是指所有對象將旋轉的位置(不是旋轉的特定對象的原點)。所以當你旋轉所有4個矩形時,它們都應該傳遞相同的原始值。但是,您爲每個對象發送不同的原始值......並不好。 –

+0

@SteveH感謝您糾正我。我試圖通過獲得「觸及」中心點的單個矩形的角來指向中心點(原點)。換句話說,左上角矩形的中心點是(32,32),左下角是(0,32)等。我現在改變了我的有缺陷的邏輯! – user3256944