나는 헐떡 거림 육각형 과 관련된 게임을 만들고 있습니다.
현재 사용중인 육각 이미지가 있습니다 (모든면의 길이는 동일합니다 ... 50 x 50px 이미지에 맞습니다).
나는 C #에 다소 익숙하지 않고 실제로 XNA에 익숙하지 않지만 점과 각도를 기반으로 복잡한 if 문을 수행하는 대신 호출 할 수있는 쉬운 방법이 있습니까?
나는 헐떡 거림 육각형 과 관련된 게임을 만들고 있습니다.
현재 사용중인 육각 이미지가 있습니다 (모든면의 길이는 동일합니다 ... 50 x 50px 이미지에 맞습니다).
나는 C #에 다소 익숙하지 않고 실제로 XNA에 익숙하지 않지만 점과 각도를 기반으로 복잡한 if 문을 수행하는 대신 호출 할 수있는 쉬운 방법이 있습니까?
답변:
육각형은 모서리가 잘린 사각형입니다. 내가 본 것을 보았고 문명 시리즈가 직교 맵 으로이 작업을 수행하는 것을 들었습니다. 공백 또는 직교 또는 육각형 공백과 빨강, 녹색, 파랑 및 노랑이있는 비트 맵을 만드는 것입니다 모서리. (또는 원하는 색상)
육각형 : 또는
직교 :
그런 다음 커서가있는 사각형을 결정하고 해당 위치의 픽셀 색상을 테스트하십시오. 흰색이면 그 공간을 가리키고 있습니다. 서로 다른 색상은 오프셋에 매핑되며 대신 해당 육각형 위로 가져갑니다. 이 방법은 효율적이며 형상이 거의 필요 없으며 임의의 테셀레이션 공간에 사용할 수 있습니다.
육각형 히트 테스트를 수행하는 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 배열 (폴리)과 클릭 한 위치 (p)로 메서드에 제공해야합니다.