【发布时间】:2013-12-05 22:43:07
【问题描述】:
在你提到之前,我知道这个网站上还有很多其他类似的问题,但是我只能找到一个关于 XNA 的问题。我真的不完全了解其中的任何一个。
基本上,当我旋转我的精灵时,即使桨已经旋转,桨和球仍然会发生碰撞。我假设这是由于边界框未更新。
另外,当我旋转桨叶时,没有关于它旋转的度数的参考,当然理论上有,但在实际程序中我想打印以筛选桨叶旋转的度数,因此,当桨朝上或水平时,我需要一个初始值 0。
我查看过矩阵等(使用 Google,所以你不能说去 Google 上查看),但我不确定在我的情况下如何使用矩阵。我的意思是我需要使用旋转矩阵旋转边界框,然后以某种方式更新边界框位置,所以我需要将矩阵结果转换为Vector2?另外我不知道这个结果应该赋值为什么,(框的X值,对不起,我在做RUBBISH)
如果其中任何一个有意义并且任何人都可以提供帮助,那就太好了。非常感谢!
哦,我应该包含代码,这会有点帮助:
float pRotationSpeed;
float circle = MathHelper.Pi * 2;
float RotationAngle;
float RotationAngledegrees;
public void Update(GameTime gameTime)
{
RotationAngle %= circle;
RotationAngledegrees = MathHelper.ToDegrees(RotationAngle);
pRectangle = new Rectangle((int)pPosition.X, (int)pPosition.Y, pWidth, pHeight);
HandleInput();
}
public void HandleInput()
{
if (Keyboard.GetState().IsKeyDown(Keys.Left))
{
pRotationSpeed -= 0.1f;
RotationAngledegrees = (float)Math.Cos(pRotationSpeed);
}
if (Keyboard.GetState().IsKeyDown(Keys.Right))
{
pRotationSpeed += 0.1f;
RotationAngledegrees = (float)Math.Cos(pRotationSpeed);
}
}
哦,顺便说一句,对于rotationAngle 等,我在搞乱,所以代码可能会被删除,我的意思是如果你建议的话。 (因为我不是很了解,只是试验并尝试将一些输出显示到屏幕上)。
编辑:
public void CalcVertices()
{
Vertex.Add(new Vector2(0, 0)); //top-left corner.
Vertex.Add(new Vector2(pRectangle.Width, 0)); //top-right corner.
Vertex.Add(new Vector2(0, pRectangle.Height)); //bottom-left corner.
Vertex.Add(new Vector2(pRectangle.Width, pRectangle.Height)); //bottom-right corner.
rotVertex.Add(new Vector2((0 * Math.Cos(rotAngle)) - (0 * Math.Sin(rotAngle)));
}
【问题讨论】:
-
XNA 中的边界框是轴对齐的 (AABB),这意味着它们永远不会有任何旋转。您可以创建一个完全包含旋转桨的边界框,但这可能不是您想要的,因为当桨旋转时它会比桨本身大得多。您需要自己进行碰撞检测。
-
哦,好吧,我确实经常遇到 AABB ......而且有人在其他帖子中提到过轴对齐。我想这还不错,以至于我不知道如何旋转边界框...大声笑,如果它不能完成,或者可以但是以一种凌乱的方式...感谢您的快速响应
-
在你添加的最后一段代码中将
Sin和Cos乘以0是什么意思?它永远为零! -
提示:如果你缩放你的精灵边界框保持相同的大小。旋转和缩放不影响边界框。