鼠标在Xna游戏中选择旋转精灵

时间:2012-02-17 18:54:46

标签: c# c#-4.0 xna rotation mouse

我正在开发一款简单的游戏,你可以在它们消失前点击方形精灵。我决定变得喜欢并让正方形旋转。现在,当我点击方块时,它们并不总是响应点击。我认为我需要围绕矩形(正方形)的中心旋转点击位置,但我不知道该怎么做。这是我点击鼠标的代码:

    if ((mouse.LeftButton == ButtonState.Pressed) &&
    (currentSquare.Contains(mouse.X , mouse.Y )))

这是轮换逻辑:

    float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;

        RotationAngle += elapsed;
        float circle = MathHelper.Pi * 2;
        RotationAngle = RotationAngle % circle;

我是Xna的新手和一般的编程,所以任何帮助都表示赞赏。

非常感谢,

比尔

3 个答案:

答案 0 :(得分:1)

所以你试图确定一个点是否在矩形中,但是当旋转矩形时?

Contains()方法仅在当前旋转为0时有效(我猜currentSquare是一个表示图像位置而不旋转的矩形?)。

您需要做的是在鼠标坐标上执行图像的反向旋转(鼠标坐标应围绕图像的原点旋转),然后计算新位置是否在currentSquare。你应该能够使用向量完成所有这些。 (未测试)

bool MouseWithinRotatedRectangle(Rectangle area, Vector2 tmp_mousePosition, float angleRotation)
{
    Vector2 mousePosition = tmp_mousePosition - currentSquare.Origin;
    float mouseOriginalAngle = (float)Math.Atan(mousePosition.Y / mousePosition.X);
    mousePosition = new Vector2((float)(Math.Cos(-angleRotation + mouseOriginalAngle) * mousePosition.Length()), 
                                (float)(Math.Sin(-angleRotation + mouseOriginalAngle) * , mousePosition.Length()));
    return area.Contains(mousePosition);
}

答案 1 :(得分:1)

如果您不需要像素完美检测,您可以像这样为每个片段创建边界球体。

        var PieceSphere = new BoundingSphere()
                         {
                             Center =new Vector3(new Vector2(Position.X + Width/2, Position.Y + Height/2), 0f),
                             Radius = Width / 2
                         };

然后在鼠标指针周围创建另一个边界球。对于位置使用鼠标坐标和半径1f。由于鼠标指针将移动,因此它将更改其坐标,因此您还必须在每次更新时更新球体的中心。

检查点击次数非常简单。

foreach( Piece p in AllPieces )
{
    if ((mouse.LeftButton == ButtonState.Pressed) && p.BoundingSphere.Intersects(MouseBoundingSphere))
    {
        //Do stuff 
    }
} 

答案 2 :(得分:0)

如果你像我一样懒,你可以做一个圆形距离检查。

假设mouse和box.center是Vector2

#gets us C^2 according to the pythagorean Theorem
var radius = (box.width / 2).squared() + (box.height / 2).square 

#distance check
(mouse - box.center).LengthSquared() < radius

不完全准确,但是用户会很难注意到并且不准确会导致命中箱略微过大总是被原谅。更不用说检查速度非常快,只需在创建正方形时计算半径即可。