私はあえぎ六角形を含むゲームに取り組んでいます。
現在、私は使用している六角形の画像を持っています(すべての辺は同じ長さです... 50x50ピクセルの画像に収まります)。
私はC#にやや新しい、XNAには本当に新しいですが、ポイントと角度に基づいた複雑なifステートメントを実行するのではなく、呼び出すことができる簡単な方法がありますか?
私はあえぎ六角形を含むゲームに取り組んでいます。
現在、私は使用している六角形の画像を持っています(すべての辺は同じ長さです... 50x50ピクセルの画像に収まります)。
私はC#にやや新しい、XNAには本当に新しいですが、ポイントと角度に基づいた複雑なifステートメントを実行するのではなく、呼び出すことができる簡単な方法がありますか?
回答:
六角形は、角が切り取られた長方形です。私がこれを見て、Civilizationシリーズが直交マップでこのように行うことを聞いた方法は、ホワイトスペース(直交または六角形)と赤、緑、青、黄色のビットマップを作成することですコーナー。(またはあなたが好きな色。)
六角形:または
直交:
次に、カーソルがどの長方形の上にあるかを判断し、その場所のピクセルの色をテストします。それが白い場合、彼らはそのスペースの上に浮かんでいます。他の各色はオフセットにマッピングされ、代わりにその六角形の上に移動します。この方法は効率的で、ジオメトリをほとんど必要とせず、任意のテッセレーション空間に使用できます。
六角ヒットテストを行うXNAメソッドはありません。
この記事では、テストを行う関数の作成方法を説明し、その関数を提供します。
その記事の要約は次のとおりです。
そして、テストを行う関数は次のようになります。
isInside
ローカル象限に対して次のテストを実行します。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 < p.X ) == ( p.X <= oldPoint.X )
&& ( (long)p.Y - (long)p1.Y ) * (long)( p2.X - p1.X )
< ( (long)p2.Y - (long)p1.Y ) * (long)( p.X - p1.X ) )
{
inside = !inside;
}
oldPoint = newPoint;
}
return inside;
}
六角形の角をvector2配列(poly)とクリックした位置(p)でメソッドに与える必要があります。