旋转精灵时如何更新矩形对撞机

时间:2013-12-05 22:43:07

标签: c# math xna rotation

在你提到之前,我知道在这个网站上有很多其他问题,但是我只能找到一个可以用于XNA的问题。我完全不了解它们中的任何一个。

基本上发生的事情是当我旋转精灵时,即使桨叶旋转,桨叶和球仍然会发生碰撞。我假设这是由于边界框没有更新。

此外,当我旋转球拍时,没有任何程度的参考它没有旋转,当然理论上但是在实际程序中我想要打印以筛选球拍已经旋转的度数,因此,当桨叶朝上或水平时,我需要一个初始值为0。

我查看了矩阵等(使用谷歌,所以你不能说去看看谷歌),但我不确定如何在我的情况下使用矩阵。我的意思是我需要使用旋转矩阵旋转边界框,然后以某种方式更新边界框位置,所以我需要将矩阵结果转换为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))); 
}

1 个答案:

答案 0 :(得分:1)

您的碰撞矩形和实际图像基本上是单独的对象,可以单独旋转。您需要在矩形的4个点上进行一些简单的三角法,以确定旋转后的新位置。

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

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

获得新顶点后,将矩形的中心转换回原始位置。

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