发新话题
打印

原来的depth和AS3的ChildIndex

本帖已经被作者加入个人空间

原来的depth和AS3的ChildIndex

最后一个单词应该是杜撰。我想要它表明这样一个事情:AS3是怎么编程的管理元素在屏幕上显示的层次。

一个AS3的DisplayObjectContainer(能够实例化的只有Sprite了)如果有4个child那它们的ChildInex是0123,数字越大越显示在上面,上面就是接近眼睛的这一边,上边的会遮住下边的。这一点上和原来的depth是一样的。不同的是,不能自己来指定一个热依的数字。4个child的话,绝对不会出现ChildIndex或者depth或者他们的等价物是4以上的数字的情况。

addChild(obj:DisplayObject)添加一个显示对象,被添加的对象会被放在当前的最上。
addChildAt(obj:DisplayObject,index:int)添加一个显示对象在index的位置,但是index必须是合法的,比如现在有4个对象,则这里的index不能大于4。原来在index位置的对象向上移动,即ChildIndex + 1。在4个child的时候:
addChildAt(obj,4),因为4号没有对象,和调用addChild(obj)是一样。(其实addChild的函数实现是要调用addChildAt的,这是个人臆断。)

AS3可以使用swapChild(obj1:DisplayObject,obj2:DisplayObject),swapChildAt(index1:int,index2:int)来交换两个child的ChildIndex而没有swapDepth(depth:Number)的用法。

这样,我个人认为并没有特别方便我来管理。因为比如 iso 视角的深度管理是采用原来depth的方法,直接指定深度可以使用公式法,就是说按照一个算术公式来得到正确的深度。而AS3暂时不能。

今天的目标是解决暂时不能的问题

因为ChildIndex是depth的子集,所以可以建立depth到ChildIndex的满射。恩,理论可行。

实现办法一:
继承Sprite,重写addChildAt。

package
{
        import flash.display.Sprite;
        import flash.display.DisplayObject;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.StageScaleMode;
        /**
         * 在AS中使用Depth的例子,1
         * @author yukineco
         */
        public class DepthManagerTest extends Sprite{
                //唉 AS也支持模板吧~~
                //<int>
                private var depths:Array = [];
                /**
                 * 构造函数兼职main,这个函数用于测试,请修改之
                 * @return
                 */               
                public function DepthManagerTest(){
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        /* test       
                        var bmp1:Bitmap = new Bitmap(new BitmapData(300,200,true,0xff0000ff));
                        var bmp2:Bitmap = new Bitmap(new BitmapData(300,200,true,0xffff0000));
                        bmp2.x = 100;
                        addChildAt(bmp1,1000);
                        addChildAt(bmp2,1001);
                        addChild(removeChild(bmp1));
                        addChild(removeChildAt(1001));
                        */
                }
                /**
                 * 把子对象放到指定的深度,如果深度不是唯一的会抛出异常
                 * @param child 子对象的引用
                 * @param index 子对象占有的深度索引
                 * @return 被放到指定深度的子对象的引用
                 *
                 */               
                override public function addChildAt(child:DisplayObject, index:int):DisplayObject{
                        //传说中的映射,在编成中,就是数组元素值到下标的映射 ^_^
                        depths.push(index);
                        depths.sort();
                        var i:int = depths.indexOf(index);
                        if(depths == depths[i+1]){
                                trace(depths,depths[i+1])
                                throw new Error("You must provide the unique depth for each instance");
                        }
                        var r:DisplayObject = super.addChildAt(child,i);
                        return r;
                }
                /**
                 * 把指定深度的子对象移除
                 * @param index 指定的深度
                 * @return 移除的子对象引用
                 *
                 */               
                override public function removeChildAt(index:int):DisplayObject{
                        var i:int = depths.indexOf(index);
                        depths.splice(i,1);
                        return super.removeChildAt(i);
                }

                /**
                 * 把子对象添加到这个容器,以当前最大深度
                 * @param child 子对象引用
                 * @return 被放到容器中的子对象的引用
                 *
                 */               
                override public function addChild(child:DisplayObject):DisplayObject{
                        return addChildAt(child,getNextHighestDepth());
                }
                /**
                 * 移除子对象
                 * @param child 需要移除的子对象
                 * @return 移除的子对象引用
                 *
                 */               
                override public function removeChild(child:DisplayObject):DisplayObject{
                        return removeChildAt(getChildIndex(child));
                }
                /**
                 * 获得指定深度的子对象
                 * @param index 指定的深度
                 * @return 子对象引用
                 *
                 */               
                override public function getChildAt(index:int):DisplayObject{
                        return super.getChildAt(depths.indexOf(index));
                }
                /**
                 * 获得子对象的深度
                 * @param child 子对象
                 * @return 子对象的深度
                 *
                 */               
                override public function getChildIndex(child:DisplayObject):int{
                        return depths[super.getChildIndex(child)];
                }
                /**
                 * 设定子对象的深度,如果指定深度索引被占用,则交换两个子对象的深度。
                 * @param child 子对象
                 * @param depth 指定深度
                 *
                 */               
                public function setChildDepth(child:DisplayObject,depth:int):void{
                        try{
                                addChildAt(removeChild(child),depth);
                        }catch(e:Error){
                                swapChildren(child,getChildAt(depth));
                        }
                }
                /**
                 * 取得指定深度的子对象,并把它的深度重新设定为新值,如果新值被占用,两个子对象交换深度
                 * @param depth1 子对象的深度索引
                 * @param depth2 新的深度
                 *
                 */               
                public function setChildDepthAt(depth1:int,depth2:int):void{
                        try{
                                addChildAt(removeChildAt(depth1),depth2);
                        }catch(e:Error){
                                swapChildren(getChildAt(depth1),getChildAt(depth2));
                        }
                }
                /**
                 * 参考以前版本的同名函数
                 * @return 当前没有被占用的最大深度
                 *
                 */               
                public function getNextHighestDepth():int{
                        return depths[depths.length-1]+1
                }
        }
}

这不是一个好方法,因为继承自Sprite就不能继承自MovieClip勒,当然也不能继承自UIComponent勒......

[ 本帖最后由 雪の猫 于 2006-9-21 12:10 编辑 ]

TOP

代码到后来变成了斜体,看着真不舒服

TOP

可能有些代码被过虑掉了,你可以用DIZCUS模式

TOP

发新话题