我正在创建一个等距游戏,我想知道当玩家落后于他们并在他们面前时如何正确定位对象的(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.
我的逻辑是; “如果对象位于玩家之下,则向上移动其索引以使其超过玩家,但如果对象超过玩家,则降低其索引以使其位于玩家之下。”
关于如何改进此代码以便在不给我错误的情况下工作的任何想法?
答案 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);