2014-01-31 86 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