【问题标题】:How to update Rectangle collider when rotating a sprite旋转精灵时如何更新矩形碰撞器
【发布时间】: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 ......而且有人在其他帖子中提到过轴对齐。我想这还不错,以至于我不知道如何旋转边界框...大声笑,如果它不能完成,或者可以但是以一种凌乱的方式...感谢您的快速响应
  • 在你添加的最后一段代码中将SinCos乘以0是什么意思?它永远为零!
  • 提示:如果你缩放你的精灵边界框保持相同的大小。旋转和缩放不影响边界框。

标签: c# math xna rotation


【解决方案1】:

您的碰撞矩形和实际图像本质上是分开的对象,可以单独旋转。您需要对矩形的 4 个点做一些简单的三角函数来计算它们在旋转后的新位置。

要做到这一点:将每个顶点从矩形的中心转换为一个向量(或者更确切地说,将该旋转点转换为原点)。然后,对于每个角点(表示为 [x,y]),您可以使用简单的三角函数旋转它们。为此,公式为:

new_x = (old_x * cos(rot_angle)) - (old_y * sin(rot_angle));
new_y = (old_y * cos(rot_angle)) + (old_x * sin(rot_angle));

获得新顶点后,将矩形的中心平移回其原始位置。

编辑:这是假设您的碰撞边界不必与轴对齐。这是否有效取决于您如何处理碰撞。

【讨论】:

  • 嗨。非常感谢 v 的帖子... tbh 我真的不明白您将每个顶点转换为“矩形中心”的向量是什么意思...(对不起... :()。我会更新我的上面的主要帖子是我用你的方式添加的代码...... :) 谢谢......(另外,我什至不知道我的代码中的 rotAngle 是什么,我的意思是我从一个在这里发帖我想只是为了试验一些东西......)
  • 对不起,我想我在这方面有点数学。 “顶点”只是矩形的一个角的另一个名称。将顶点转换为向量与将矩形的中心移动到原点(0,0)相同。如果您要从 0,0 到每个顶点绘制一个箭头,那么这些箭头中的每一个都是一个“向量”。矢量可以是 2D 的,就像你的一样,也可以是 3D 的,带有 x、y 和 z 坐标。这就是我们在计算中表示空间点的方式,并且通过许多规则可以很容易地对它们进行数学运算。这是一个很棒的入门教程:chortle.ccsu.edu/vectorlessons/vectorindex.html
  • 感谢您的回复。是的 dw 我知道顶点是什么,并且对向量有点了解,但我非常感谢您的帮助...我会阅读您提供的链接...再次感谢 :)
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2018-07-12
相关资源
最近更新 更多