2009-11-01 11 views
2

나는 Beat'em Up 게임 (Castle Crashers는 내가 Beat'em Up 또는 Brawler 게임이라고 부르는 게임)을 위해 2D 엔진을 만드는 과정에 있습니다.게임 공간 관리를이기 죠?

2D 스프라이트와 2D 입자 이미 터를 지원합니다. 이것은 모두 엔진에서 지금 완료됩니다.

alt text http://img337.imageshack.us/img337/9162/spacingprototype1.png

내 생각을 :하지만 내가 조언을 부탁드립니다 문제에 온 것은이 그림과 같이

그것은 "공간"관리에 관하여

, 내가 생각하는 뭔가를했습니다 파티클 이미 터/2D 스프라이트가 살 수있는지면의 그리드 (Spatial Hash 또는 Grid)를 만드는 것입니다. 내 그림에서,이 슬롯을 1에서 N으로 열거했습니다 (35 일 필요는 없으며 단지 보여주기위한 것입니다). 내 생각은 "GameElements"(스프라이트/이미 터)를 0부터 N까지 순서대로 그립니다 (버킷 0에서 버켓 N으로 이동). 그러면 화면에 올바르게 겹쳐서 표시되도록합니다 (앞으로 앞으로).

각 요소의 아래쪽 Y 축을 비교하고 "퀵 소트"를 수행하여 수행 할 수 있음을 알고 있지만 그리드를 사용하면 더 나은 방식으로 충돌 감지를 수행 할 수 있습니다. 어떤 종류의 인공 지능을 구현하기 위해 * 나도 도움이 될 수 있습니다. 당신은 당신이 서로에 대해 테스트 할 필요가 개체의 수에 대한 최적화의 일종을 가지고 싶다면

+1

게임의 오브젝트가 그리드에 스냅됩니까? 아니면 어디에서나 자유롭게 움직일 수 있습니까? – Jack

+3

무엇이 문제입니까? –

+1

@Jackk : 안녕하세요, 아니요, 어디든 자유롭게 이동할 수 있습니다. @Wcoenen : 문제는이 방법이 충분히 좋은지 또는 내가 볼 수없는 내 문제를 더 스마트하고/훨씬 쉽게 해결할 수있는 방법이 있는지입니다. 미안 내가 그 명확하게하지 않았다면 :) – Goles

답변

5

, 당신은 쿼드 트리 아이디어의 화면을 분할하는 것입니다 http://en.wikipedia.org/wiki/Quadtree

를 사용하는 방법에 대해 생각 할 수 있습니다 4 개의 노드가 속해있는 노드에 모든 항목을 배치 한 다음, 테스트 할 필요가있는 스프라이트/항목/그 밖의 것이 있으면 다른 방 4에서 만든 노드를 나눕니다. 한 노드에있는 특정 크기 나 양의 항목에 도달 할 때까지이 작업을 계속하십시오.

그러면 최상위 노드에 테스트 할 항목이 있는지 묻습니다. 이 노드는 자식 노드에 항목이 포함되어 있는지 물어보고, 차례대로 자식에게 물어 봅니다. 이렇게하면 화면의 대부분이 이미 건너 뛸 수 있습니다 (자식 00에있는 경우 자식 01, 10 및 11을 건너 뛸 수 있음). 그런 다음 원하는 경우 특정 충돌 감지를 수행하는 항목 목록을 얻습니다. 는 Z 버퍼에

alt text http://geodata.ethz.ch/geovite/tutorials/L2GeodataStructuresAndDataModels/en/images/quadtree.gif

+0

안녕하세요, 응답 주셔서 감사합니다 :), 당신은 올바른 충돌 감지 최적화에 대해 이야기하고 있습니까? 이 방법은 정적 격자보다 문제가 적은 다른 크기의 2D 스프라이트를 처리 할 수 ​​있기 때문에 매우 유용 할 것으로 생각합니다. – Goles

+0

사실, 항상 그렇듯이 : 성급하게 최적화하지 마십시오! 먼저 업무를 수행하십시오. 아마도 그러한 시스템이 필요하지 않더라도 결정할 사항은 귀하에게 달려 있습니다. 또한이 시스템에서는 고급 그리드를 이동할 수 있으므로 항목이 한 상자 안에 잘 맞지 않으면 상자를 더 높게 배치해야합니다. 기본 quadtree의 최악의 시나리오에서는 최상위 상자 (상자 00과 01 사이의 겹치는 부분)로 끝까지 이동해야했습니다. 이를 위해서는 매번 해당 객체에 대해 충돌 감지가 필요합니다 (단 하나 인 경우 불필요한 것은 아닙니다). –

1

화재 그들을 그것에 대해 걱정하자 : 당신이 시각적으로 만들 것 인 경우에

, 그것은 조금 같을 것이다.

미래에 프로파일 링이 너무 느리다면 (분명히 프로파일 링을 통해) 최적화를 살펴보십시오.

가장 간단한 해결책을 선택하십시오.

1

그리드의 같은 상자에 두 개의 스프라이트가있는 경우 사용자의 방법이 실패합니다. 두 상자가 같은 상자에 서 있다고 가정 해보십시오. 하나는 다른 하나 앞에 약간 서 있습니다. 먼저 어느 것을 그립니다? 스프라이트를 그리드로 나누는 두 개의 알고리즘과 주어진 그리드 박스의 모든 스프라이트의 z 좌표를보고 그 값을 기반으로 그리는 두 개의 알고리즘이 필요합니다.

훨씬 간단한 방법은 모든 스프라이트의 단일 모음을 만드는 것입니다. 그것은 모든 z 좌표에 따라 정렬 된 모든 스프라이트를 저장해야합니다 (목록의 맨 앞에있는 스크린의 뒤쪽에서 뒤의 스크린의 앞까지). 컬렉션을 반복하고 각각의 스프라이트를 그립니다.스프라이트가 화면 안팎으로 움직일 때 (즉, Z 좌표가 변경된 경우), 콜렉션 내에서 단일 스프라이트를 이동시키는 아주 간단한 정렬을 수행 할 수 있습니다. 다음 스프라이트의 z 좌표가 변경된 스프라이트의 좌표보다 크거나 적을 때까지 목록의 다음 스프라이트와 계속 교환하십시오.

+0

그래, 그게 더 간단하고 많은 감각을 가지고 ...하지만 스프라이트의 대부분은 대부분의 시간을 움직이게 될 경우 어떻게됩니까? 충분히 효율적이라고 생각하십니까? – Goles

+0

당신이하고있는 일은 최대 6 개의 포인터를 교환하는 것뿐입니다. 비용은 본질적으로 무시할 수 있어야합니다. – Ant