XNA有多边形,比如Rectangle吗?

Nic*_*ner 8 c# xna polygon

我正在制作一个游戏,其中只有一个空间,玩家可以四处移动.我想用某种多边形来表示这个空间.我要问的主要问题是它是否包含给定的点.(赞rect.intersect())

XNA有没有办法做到这一点?

Fin*_*las 8

不.(至少包括版本3)

XNA具有诸如截头锥体盒子之类的边界体积,但它没有多边形的概念.

可以找到一种使用XNA在多边形中执行点的简单,快速且有效的方法 这里.我最近实现了这个,它很棒.

您知道对象的关键点,您需要做的就是创建一个围绕此对象的多边形 - 使用向量将是最好和最简单的方法.然后执行多边形检查中的点.

这是我实现的示例代码.使用XNA中的默认点类.Polygon是一个简单的类,它包含构成多边形的向量集合.

/// <summary>
/// Point in polygon check.
/// </summary>
/// <param name="point">The point.</param>
/// <param name="polygon">The polygon.</param>
/// <returns>True if point is inside, false otherwise.</returns>
/// <see cref="http://local.wasp.uwa.edu.au/~pbourke/geometry/insidepoly/"/>
public bool PointInPolygon(Point point, Polygon polygon) {

       bool inside = false;

       foreach (var side in polygon.Lines) {
            if (point.Y > Math.Min(side.Start.Y, side.End.Y))
                if (point.Y <= Math.Max(side.Start.Y, side.End.Y))
                    if (point.X <= Math.Max(side.Start.X, side.End.X)) {
                        float xIntersection = side.Start.X + ((point.Y - side.Start.Y) / (side.End.Y - side.Start.Y)) * (side.End.X - side.Start.X);
                        if (point.X <= xIntersection)
                            inside = !inside;

       }

       return inside;
}
Run Code Online (Sandbox Code Playgroud)

Polgyon类是非常基本的,半伪形式:

class Polygon 
{
    public List<Line> Lines { get; set; }
}

public class Line   
{
    public Vector2 Start;
    public Vector2 End;
}
Run Code Online (Sandbox Code Playgroud)

多边形类可以非常容易地存储一组向量,但我引入了一个行类,因为其他地方需要行.