|
 
- 帖子
- 1081
- 积分
- 216
- 技术分
- 22
- 来自
- 上海
- 在线时间
- 721 小时
- 注册时间
- 2005-1-30
|
1#
发表于 2006-9-21 12:09
| 只看该作者
原来的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 编辑 ] |
|