2014-09-15 2 views
1

아이소 메트릭 게임을 만들고 있는데, 플레이어가 뒤에서 움직이면서 앞으로 오를 때 오브젝트의 (Z- 인덱스) 위치를 올바르게 지정하는 방법을 알고 싶습니다. 내가 지금까지 아직 AS3 아이소 메트릭 게임 Sorting Object Index

  if(y>stage.stageHeight/2){ 
       parent.setChildIndex(this,parent.getChildIndex(this)+1); 
       gotoAndStop(2); 

      } else if (y<stage.stageHeight/2){ 
       parent.setChildIndex(this,parent.getChildIndex(this)+1); 
       gotoAndStop(1); 
      } 

을 사용하고있다

는이 오류

RangeError: Error #2006: The supplied index is out of bounds. 
을 받고있다

이이에 대한 나의 논리; "개체가 플레이어보다 작 으면 인덱스를 위로 이동하여 플레이어 위에 놓습니다. 그러나 개체가 플레이어보다 위에 있으면 인덱스가 줄어 플레이어 아래에있게됩니다."

오류를주지 않고 작동하도록이 코드를 개선하는 방법에 대한 아이디어가 있습니까?

답변

0

먼저 많은 개체를 교환하려는 경우 개체 외부에서 작업하는 것이 가장 좋습니다. 예를 들어 레벨은 스왑 가능 개체의 배열을 포함합니다. 또한 각 객체를 순환하고 y 값에 따라 스와핑을 수행합니다. 각 다른 물체 O (N^2)에 대해 각 개체를 확인해야하기 때문에

public var objectArray:Array = []; 

for (var ob1:Object in objectArray){ 
    for (var ob2:Object in objectArray){ 
     if(ob1 == ob2) continue; 
     swap(ob1, ob2); 
    } 
} 

//... 

public function swap(a:Object, b:Object):void { 
    if (a.y > b.y != a.parent.getChildIndex(a) > b.parent.getChildIndex(b)) { 
     a.parent.swapChildren(a, b); 
    } 
} 

이 그것을 할 수있는 가장 효율적인 방법은 아니다 명심하십시오.

0

당신이 제공하는 색인은 컨테이너의 하위 배열에있는 객체의 색인이라는 점에 유의해야합니다. 그것은 0보다 작을 수없고 컨테이너의 실제 childCount보다 크거나 같을 수 없습니다.

그래서 parent.getChildIndex (이)가 +1이 매우 불안전

var nextIndex:int = parent.getChildIndex(this)+1; 
if(nextIndex < parent.numChildren && nextIndex >= 0) 
    parent.setChildIndex(this, nextIndex); 
관련 문제