矩形的相交测试代码不需要非常完善。我们需要的矩形只有按钮,而按钮总是会与轴对齐。这样,代码就比处理任意对齐的矩形时简单了很多。
如果点在矩形左边的右侧,右边的左侧,上边的下侧,底边的上侧,那么该点在矩形内。可以采取与圆的示例相似的方法从视觉上显示矩形与点的关系。
class RectangleIntersectionState : IGameObject
{
Input _input;
Rectangle _rectangle = new Rectangle(new Vector(0,0,0), new Vector
(200, 200,0));
public RectangleIntersectionState(Input input)
{
_input = input;
}
#region IGameObject Members
public void Update(double elapsedTime)
{
if (_rectangle.Intersects(_input.MousePosition))
{
_rectangle.Color = new Color(1, 0, 0, 1);
}
else
{
// If the circle's not intersected turn it back to white.
_rectangle.Color = new Color(1, 1, 1, 1);
}
}
public void Render()
{
_rectangle.Render();
}
#endregion
}
这个状态与之前关于圆的示例的状态很类似。记住,要使它作为默认状态加载。矩形本身和圆一样,是使用线循环构成的。
public class Rectangle
{
Vector BottomLeft { get; set;}
Vector TopRight { get; set; }
Color _color = new Color(1, 1, 1, 1);
public Color Color
{
get { return _color; }
set { _color = value; }
}
public Rectangle(Vector bottomLeft, Vector topRight)
{
BottomLeft = bottomLeft;
TopRight = topRight;
}
public void Render()
{
Gl.glColor3f(_color.Red, _color.Green, _color.Blue);
Gl.glBegin(Gl.GL_LINE_LOOP);
{
Gl.glVertex2d(BottomLeft.X, BottomLeft.Y);
Gl.glVertex2d(BottomLeft.X, TopRight.Y);
Gl.glVertex2d(TopRight.X, TopRight.Y);
Gl.glVertex2d(TopRight.X, BottomLeft.Y);
}
Gl.glEnd();
}
}
rectangle类可以创建和绘制矩形。唯一还缺少的函数是最重要的intersect函数。
public bool Intersects(Point point)
{
if (
point.X >= BottomLeft.X &&
point.X <= TopRight.X &&
point.Y <= TopRight.Y &&
point.Y >= BottomLeft.Y)
{
return true;
}
return false;
}
运行程序,将光标移入矩形。与圆的示例一样,矩形会变成红色,表明相交性代码起作用了。