2011-05-08 5 views
1

저는 타워 방어 게임을하고 있습니다. 방어하는 포탑이 그 범위 내에서 가장 멀리있는 공격 유닛에서 쏘고 싶습니다. 나는 그것을 자바에서 프로그래밍하고 유닛을 보유하기 위해 ArrayLists를 사용한다.경로의 단위 목록을 순서대로 유지하려면 어떻게합니까?

지금까지 경로가 각기 다른 블록으로 나뉘어져 있으며 각 블록의 단위 목록이 있습니다. 유닛이 블록을 떠날 때 경로의 다음 블록으로 전달됩니다. 단위가 모두 같은 속도로 이동하면 목록에서 첫 번째 단위가되기 때문에 어떤 단위가 가장 먼지 쉽게 추적 할 수 있습니다. 그러나 유닛들이 다른 속도로 움직일 수 있기를 바랍니다.

유닛이 블록에 추가되면 arraylist의 끝에 추가됩니다. 따라서 이전에 추가 된 유닛은 목록의 앞에 있고 최근에 추가 된 유닛은 목록의 끝에 있습니다.

나의 원래 생각은 각 유닛이 arraylist에서 유닛보다 더 낮은 유닛을 경로를 따라 더 멀리 있는지 확인하도록하는 것이 었습니다. 그럴 경우 arraylist를 올바른 지점으로 이동합니다. 이런 종류의 블록은 블록을위한 많은 추가 작업처럼 보입니다. 그리고 게임이 많이 느려지는 것이 아닌가 걱정됩니다.

좋은 생각인가요? 아니면 다른 것을 시도해야합니까? 도움이 될만한 코드가 있으면 게시 할 수 있습니다.

답변

2

ArrayList가 최선의 방법인지 잘 모르겠습니다. 나는 게임의 모든 "진드기"를 추측합니다. 각 유닛은 지정된 거리만큼 이동하게됩니다. 즉, 유닛이 충돌하여 목록에서 서로 위치를 바꿀 수 있습니다.

각 "블록"이 1보다 깊다는 것을 전제로하고 있습니다. 각 "틱"에 대해 주어진 단위가 블록 내에서 다른 블록보다 더 멀리 이동할 수 있으며 단위가 다음 블록은 다음 블록으로 넘어갑니다.

옵션 1 (평범한) : 정수가 0 - BLOCK_DEPTH에서이며, 각각 한 세트에서 다른 점프 원수를 보는 곳

Map<Integer, Set<Enemy>>를 사용합니다. 여기에는 분류가 없습니다. 그냥 포인터 재 할당. 당신은 또한 단지 map.get(0)을해야하고 nextMap.get(BLOCK_DEPTH)

옵션 2에 그 추가 (더 좋은?) :

위치가 0 - BLOCK_DEPTH의 정수입니다 Enemy.position에 따라 비교기를 구현하는 SortedSet를 사용합니다. 각 Enemy에는 눈금으로 위치를 업데이트하는 Listener가 있으며 Enemy.position이 0 인 동안 Set에서 요소를 튕겨서 각 눈금을 시작합니다.이 눈금은 0으로 설정되어 다음 세트로 푸시됩니다.

+0

지금 두 번째 옵션을 구현하고 있습니다. 제대로 작동하는 것처럼 보입니다. 내 유일한 질문은 내가 공격 유닛 위치를 업데이트해도 게임 세트가 계속 유지 될 것인가? – Jonathan

+0

각 블록에 대해 별도의 트리 집합으로 구현했지만 대부분의 경우 작동하지만 블록이 해당 트리 집합에서 하나의 단위를 제거하려고 시도 할 때가 있습니다. 일부 중단 점을 통해 유닛이 트리 집합에 있고 다음 블록으로 전달되는 것을 볼 수 있지만 treeset.remove (unit)가 false를 반환하는 방법을 확인할 수 있습니다. – Jonathan

+0

TreeSet의 순서는 필요에 따라 계산됩니다. 즉, 반복을 시도하거나 가장 낮은 값을 팝하는 경우입니다. 그것이 내가 당신을 위해 효과가 있다고 생각하는 이유입니다. ArrayList는 순서가 계속 걱정됩니다. 각 세트에서 "가장 낮은"것을 잡아서 다음 세트로 이동하는 것에 관심이 있습니다. treeSet.remove()가 false를 반환하면 객체가 해당 집합에 없다는 것을 의미합니다. 아마도 다른 주제 일지라도 그곳에서 무엇이 잘못되었는지를 알아 내기 위해 코드를보아야 할 것입니다. – jbrookover

0

각 유닛이 스폰 될 때 원점까지의 거리를 계산 한 다음 유닛이 움직일 때 이동량을 뺄 수 있습니다. 그런 다음 각 타워는 목록을 통해 실행되며 어느 단위가 홈 기반과의 거리가 가장 먼지 확인합니다.

A* path finding을 사용할 수있는 원래 거리를 얻고 단위가 넘고 블록의 크기를 곱하거나 간단한 직선 거리를 곱합니다. 게임의 레이아웃에 따라 가장 잘 알 수 있습니다.

public static double Get2DDistance(float x1, float y1, float x2, float y2) { 
    float dx = x2 - x1; 
    float dy = y2 - y1; 
    double distance = Math.sqrt(dx * dx + dy * dy); 
    return distance; 
} 
+0

실제로 같은 위치에 유닛이 생성 될 가능성이 높습니다. 스폰 지점 당 한 번만 거리를 계산하면됩니다. 그런 다음 그 지점에서 시작되는 각 유닛에 거리를 지정하십시오. – MichaelHouse

관련 문제