AS3等距游戏排序对象索引

时间:2014-09-15 13:06:16

标签: actionscript-3 logic

我正在创建一个等距游戏,我想知道当玩家落后于他们并在他们面前时如何正确定位对象的(Z-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.

我的逻辑是; “如果对象位于玩家之下,则向上移动其索引以使其超过玩家,但如果对象超过玩家,则降低其索引以使其位于玩家之下。”

关于如何改进此代码以便在不给我错误的情况下工作的任何想法?

2 个答案:

答案 0 :(得分:0)

首先,如果您要交换许多对象,最好在对象之外进行操作。例如, Level 类,其中包含所有可交换对象的数组。它还负责循环每个对象并根据其 y 值进行交换。

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);
    }
}

请记住,这不是最有效的方法,因为您必须针对每个其他对象 O(n ^ 2)检查每个对象。 < / p>

答案 1 :(得分:0)

您必须记住,您提供的索引是容器子数组中对象的索引。它不能小于零,它不能大于或等于容器的实际childCount。

所以parent.getChildIndex(this)+1非常不安全

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