저는 현재 C#을 배우고 일반적으로 게임 디자인을 배우려고 노력하는 경험이 거의없는 프로그래머입니다.충돌 감지를 더 효율적으로 만들기 (C# XNA)
저는 Microsoft의 XNA 프레임 워크를 사용하여 Galaga-esque Scrolling Shooter 게임을 제작하고 있습니다. 내가 엉성한 OOP 구조로 고심하고 몇 가지 나쁜 디자인 선택을 한 약간의 거친 시련 끝에, 마침내 엔진의 훌륭한 출발을 생각해 냈습니다.
현재 게임을 방해하지 않는 충돌 감지에 문제가 있습니다. 현재 엔진은 모든 활성 게임 객체를 List 객체에 유지하고 각 객체를 순환하여 서로 다른 객체와 충돌하는지 확인합니다. 말할 것도없이 훨씬 더 좋을 수 있습니다.
여기 내 충돌 검사가 ObjectHandler 클래스에서 수행되었습니다.
public override void Update(GameTime gameTime)
{
...
//Handle collisions
foreach (GameObject obj in Objects)
{
ICollideable e = obj as ICollideable;
//Check if the object implements ICollideable
if (e != null)
{
//Check collision with each other object
foreach (GameObject obj2 in Objects)
{
//Check if the second object implements ICollideable
ICollideable e2 = obj2 as ICollideable;
//check if they are in the same sector
if (e2 != null && SameSector(e.Sector,e2.Sector))
{
//Check if the collision masks interesect
//if so call each object's collision event
if (e.Mask.Intersects(e2.Mask))
{
e.CollisionEvent(e2);
e2.CollisionEvent(e);
}
}
}
}
}
...
}
다음은 SameSector 기능입니다.
private bool SameSector(Point p1, Point p2)
{
if (Math.Abs(p1.X-p2.X)<=1 && Math.Abs(p1.Y-p2.Y)<=1)
return true;
else
return false;
}
"마스크"는 XNA 프레임 워크의 일부인 Rectangle 개체입니다. 보시다시피 저는 일종의 공간 분할 시스템을 구현했습니다. 각 개체는 60x60 제곱으로 설정되어 있습니다. 그러나 실제로 유용한 지 확인한 것은 아닙니다. 두 개체는 충돌 여부를 확인하는 것과 동일한 섹터 (또는 인접 섹터)에 있습니다.
나는 이와 비슷한 질문을 이미 보았지만, 내 질문에 만족하지 못했습니다. 그것으로부터 시간 관리 시스템이 유용하다는 것을 모았습니다. 최종적으로 구현하려고 노력할 것입니다. 그러나 아직 프로그래밍에 익숙하지 않으므로보다 진보 된 설계를 탐구하기 전에 충돌 검사 자체를 최적화하고 싶습니다.
그래서 현재의 충돌 검사를 효과적으로 최적화 할 수 있을까요? 아니면 처음부터 어떻게해야할까요?