2012-10-19 4 views
1

저는 Cocos2D를 사용하여 캐주얼 그리드 기반 2D iPhone 게임을 만들고 있습니다. 격자는 균일 한 크기의 디스크로 구성된 "시차"된 육각형 모양의 격자입니다. this과 비슷합니다.2D 육각 격자에서 충돌 감지

나는 그리드를 2D 배열에 저장했다. 또한 "주변"그리드 셀 개념이 있습니다. 즉, 특정 셀을 둘러싼 여섯 개의 그리드 셀 (여섯 개 미만을 가질 수있는 경계를 제외하고).

어쨌든 일부 충돌 감지를 테스트 중이며 계획 한대로 작동하지 않습니다. 그리드 셀 이동 셀의 XY 위치를 사용하여 주변 그리드의

  • 가져 오기 목록을 세포 이동에 가장 가까운의

    1. 계산 IJ 좌표 : 저는 여기에 현재 디스크의 고정 그룹에 접근하는 것 움직이는 디스크의 충돌 감지를 할 방법 ij- 좌표를 사용하는 셀
    2. 주변 셀을 검사하십시오. 공백이 없으면 충돌이 없음
    3. 비어 있지 않은 주변 셀이있는 경우 충돌에 필요한 최소 거리와 디스크 센터 간의 거리를 비교하십시오.
    4. 충돌이 발생하면 움직이는 디스크를 넣습니다 표 셀 ij

    이렇게 작동하지만 너무 좋지는 않습니다. 나는 게임 루프의 각 단계에서 움직이는 디스크와 고정 된 디스크를 비교하는 잠재적 인 단순한 무차별 대입 방식을 고려했습니다. 이것은 정지 된 디스크 수가 300 max이므로 성능면에서 아마도 가능할 것입니다. 그렇지 않으면 공간 분할 데이터 구조를 사용할 수 있지만 너무 복잡합니다.

    이와 같은 게임에서 충돌 감지에 대한 일반적인 접근 방식과 모범 사례는 무엇입니까?

  • 답변

    2

    저는 움직이는 디스크의 xy 좌표를 가장 가까운 셀로 정확하게 매핑 할 수 있어야한다고 생각합니다.

    +------+-------+-------+ odd rows 
        |  |  |  | 
        |  |  |  | 
    +---|--+---|---+---|----+ | 
    | +--|---+---|---+----|--+ 
    |  | x  |  | <- even rows 
    | +--|---+---|---+----|--+ odd rows 
    +---|--+---|-y-+---|----+ | 
        |  |  |  | 
        |  |  |  | 
        +------+-------+-------+ 
    

    포인트 X는 even_row에서 찾아 [0] [1] 동안가 odd_row에 에 위치하고 Y 포인트 [1] [1]와 동시에 even_row에 [0] [1]. 최대 2 개 장소가 있으며 그 중 어느 것이 가장 가까운 지 계산할 수 있습니다. & 홀수 행을 다른 배열로 유지할 이유가 없습니다.

    y를 홀수 행과 짝수 행으로 매핑하는 수식을 도출 할 수 있어야합니다.

    +0

    사실 나는 이것을 수행했습니다. 이것은 주변 셀 목록을 가져 오기 전에 단계로 충돌 감지 알고리즘 초기에 발생합니다. – SundayMonday