9

我知道这个问题已经被问过几次了,我已经阅读了很多关于这个的帖子。但是我正在努力让它发挥作用。

    bool isClicked()
    {
        Vector2 origLoc = Location;
        Matrix rotationMatrix = Matrix.CreateRotationZ(-Rotation);
        Location = new Vector2(0 -(Texture.Width/2), 0 - (Texture.Height/2));
        Vector2 rotatedPoint = new Vector2(Game1.mouseState.X, Game1.mouseState.Y);
        rotatedPoint = Vector2.Transform(rotatedPoint, rotationMatrix);

        if (Game1.mouseState.LeftButton == ButtonState.Pressed &&
            rotatedPoint.X > Location.X &&
            rotatedPoint.X < Location.X + Texture.Width &&
            rotatedPoint.Y > Location.Y &&
            rotatedPoint.Y < Location.Y + Texture.Height)
        {
            Location = origLoc;
            return true;
        }
        Location = origLoc;
        return false;
    }
4

2 回答 2

25

设点P(x,y)和 矩形A(x1,y1), B(x2,y2), C(x3,y3), D(x4,y4).

  • 计算△APD, △DPC, △CPB,的面积之和△PBA

  • 如果这个和大于矩形的面积:

    • 然后点P(x,y)在矩形之外。
    • 否则它在矩形内或矩形上。

每个三角形的面积可以仅使用以下公式的坐标计算:

假设三点是: A(x,y), B(x,y), C(x,y)...

Area = abs( (Bx * Ay - Ax * By) + (Cx * By - Bx * Cy) + (Ax * Cy - Cx * Ay) ) / 2
于 2013-06-17T11:26:15.517 回答
1

我假设这Location是矩形的旋转中心。如果没有,请用适当的数字更新您的答案。

您要做的是在矩形的本地系统中表示鼠标位置。因此,您可以执行以下操作:

bool isClicked()
{
    Matrix rotationMatrix = Matrix.CreateRotationZ(-Rotation);
    //difference vector from rotation center to mouse
    var localMouse = new Vector2(Game1.mouseState.X, Game1.mouseState.Y) - Location;
    //now rotate the mouse
    localMouse = Vector2.Transform(localMouse, rotationMatrix);

    if (Game1.mouseState.LeftButton == ButtonState.Pressed &&
        rotatedPoint.X > -Texture.Width  / 2 &&
        rotatedPoint.X <  Texture.Width  / 2 &&
        rotatedPoint.Y > -Texture.Height / 2 &&
        rotatedPoint.Y <  Texture.Height / 2)
    {
        return true;
    }
    return false;
}

此外,如果鼠标被按下,您可能希望将检查移动到方法的开头。如果未按下,则不必计算转换等。

于 2013-06-17T10:26:37.547 回答