如何在旋转精灵时更新矩形碰撞器



在你提到之前,我知道这个网站上还有很多其他类似的问题,但我只能找到一个关于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))); 
}

碰撞矩形和实际图像本质上是单独旋转的独立对象。你需要在矩形的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));

一旦有了新的verts,就将矩形的中心平移回其原始位置。

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

最新更新