识别六角形的点击框

我正在做一个涉及喘气六边形的游戏。

目前,我有一个六边形图像,我正在使用(所有的边都是相同的长度…它适合于一个50像素的50px图像)。

我对C#有点新鲜,对XNA来说真的很新,但是有什么简单的方法可以调用,而不是基于点和角度做一个复杂的if语句吗?

六边形是一个带有削角的矩形。 我已经看到了这样做的方式,我听说文明系列这样做与正交地图,是创建一个白色空间(正交或六角形),红色,绿色,蓝色和黄色角。 (或者你喜欢的颜色)

六角: 十六进制面具 要么 在这里输入图像描述

正交: 在这里输入图像描述

然后,只需确定光标所在的矩形,然后testing该位置的像素的颜色。 如果它是白色的,他们在这个空间上盘旋。 每个其他的颜色被映射到一个偏移量,而他们是徘徊在六边形。 这种方法是高效的,几何几何,可用于任意镶嵌的空间。

没有XNA方法可以进行六边形testing。

这篇文章解释了如何编写一个testing函数,并为您提供了以下function:

如何检查点是否在六角形内

这篇文章摘要如下: 六角形单击框

而testing的function是这样的:

  1. testing六边形周围的边界框,如果不与其相交,则尽早进行testing。
  2. 如上所示将点转换为局部象限。
  3. 对局部象限执行以下isInsidetesting。

 public function isInside(pos:Vec2Const):Boolean { const q2x:Number = Math.abs(pos.x - _center.x); const q2y:Number = Math.abs(pos.y - _center.y); if (q2x > _hori || q2y > _vert*2) return false; return 2 * _vert * _hori - _vert * q2x - _hori * q2y >= 0; } 

请参阅文章的完整细节。


以下是其他一些有用的相关资源:

  • 基于内六角平铺地图的坐标

  • 是正六边形内的一个点吗?

在这里,我得到了一个方法,可以用来检测任何多边形内的点击:

 public bool PointInPolygon( Vector2 p, Vector2[] poly ) { Vector2 p1, p2; bool inside = false; if( poly.Length < 3 ) { return inside; } Vector2 oldPoint = new Vector2( poly[poly.Length - 1].X, poly[poly.Length - 1].Y ); for( int i = 0; i < poly.Length; i++ ) { Vector2 newPoint = new Vector2( poly[i].X, poly[i].Y ); if( newPoint.X > oldPoint.X ) { p1 = oldPoint; p2 = newPoint; } else { p1 = newPoint; p2 = oldPoint; } if( ( newPoint.X < pX ) == ( pX <= oldPoint.X ) && ( (long)pY - (long)p1.Y ) * (long)( p2.X - p1.X ) < ( (long)p2.Y - (long)p1.Y ) * (long)( pX - p1.X ) ) { inside = !inside; } oldPoint = newPoint; } return inside; } 

你需要给你的六角形的一个vector2数组(聚)和点击位置(p)的方法。