company logo
advertisement for deep fried Twinkies


我的 ActionScript 3.0 game programming university 学习笔记(5)


Creating Sprite Groups#e#

Creating Sprite Groups

到了这块,遇到了Sprite, 对于初学的我来说,对这个印象不是很深了,只知道是个容器,于是翻开黑羽大哥的书,看了下,哦,原来我们可以把它看成是去了时间轴的MovieClip, MovieClip成了Sprite的子类,如果我们不需要时间轴的帮助的时候只需要使用Sprite就可以了,毕竟比MovieClip轻量级,节省资源吧,也应该是打破了as2中 MovieClip万能的观念, 呵呵!

好的,那就继续这本书的内容吧,创建Sprite组,既然说是组,就会创建很多Sprite, 既然Sprite是容器,当然是装东西了,呵呵!

我们现在创建第一个容器Sprite1, 在这个容器里面装载个矩形, code like this:

var sprite1:Sprite = new Sprite();
sprite1.graphics.lineStyle(2,0x000000);
sprite1.graphics.beginFill(0xCCCCCC);
sprite1.graphics.drawRect(0,0,200,200);
addChild(sprite1);

我们控制下Sprite1的位置

sprite1.x = 50;
sprite1.y = 50;

同样,我们也创建第二个

var sprite2:Sprite = new Sprite();
sprite2.graphics.lineStyle(2,0x000000);
sprite2.graphics.beginFill(0xCCCCCC);
sprite2.graphics.drawRect(0,0,200,200);
sprite2.x = 300;
sprite2.y = 50;
addChild(sprite2);

接着我们创建第3个,这一次我们不是把sprite3通过addChild方法放到stage上,而是把它放到sprite1上,请看代码:

var sprite3:Sprite = new Sprite();
sprite3.graphics.lineStyle(2,0x000000);
sprite3.graphics.beginFill(0x333333);
sprite3.graphics.drawCircle(0,0,25);
sprite3.x = 100;
sprite3.y = 100;
sprite1.addChild(sprite3);

注意的是,sprite3的坐标是相对stage的吗?不是,他是相对于他的容器sprite1的,如果你不信这点的话,你可以把sprite3放到sprite2上看看他的位置情况... 我们可以看到sprite3会相对sprite2显示了。

那么何必手动代码去控制sprite3是在哪个容器上呢,让我们监听sprite1和sprite2吧,当鼠标点击sprite1的时候,sprite3会成为sprite1的子容器,当点sprite2的时候,sprite3会成为sprite2的子容器,看来很灵活,也挺好玩的,呵呵!

sprite1.addEventListener(MouseEvent.CLICK, clickSprite);
sprite2.addEventListener(MouseEvent.CLICK, clickSprite);
function clickSprite(event:MouseEvent) {
event.currentTarget.addChild(sprite3);
}

在游戏开发中,我们一直会创建sprite groups的,然后把游戏元素放到这些sprite上...

Setting Sprite Depth   设定Sprite的深度

既然有 Sprite组, 有很多Sprite,那么就要组织和操作他们的上下叠加关西,于是我们有了深度这个概念。

深度可以看成容器中的同级显示对象从前到后的叠放 次序 (来自黑羽殿堂之路的解释)

对于深度本书提到 setChildIndex命令, 他允许你上下移动显示列表中的 Sprite容器,所以你能控制一个sprite到所有sprite的最上方,最下方,或任何位置 !

操作显示列表里面的sprite,可以把他作为数组,如果里面有三个sprite的话,那么他们的索引值分别是0,1,2。索引是从0开始的,每个索引值代表了他们的深度值。2会在1的上方,1会在0的上方...

如果你想把一个 sprite移动到 最下边的话  like this:
setChildIndex(myMovieClip,0);
这样会使myMovieClip这个显示对象处于(显示列表中)0这个位置,其余的(在显示列表里的)对象会上移来补充它空下的位置(摘取楼上的翻译,哈哈!)

那么如何这定sprite在最上方呢,只需要设定索引index为 last item就可以了,  所以如果 显示列表有三个items(0, 1, 2), 你可以设定他为2,看下边的code

setChildIndex(myMovieClip,numChildren-1);

numChildren-1就是last item,也就是最后一个索引,是深度的最大值,设定sprite为numChildren-1,就是使之处于最上放,覆盖其他的sprite...

为了加深印象,并证明我对书中字面意思的理解的正确性,我做了个例子,建立三个sprite, 他们里面分别画三个不同颜色的长方形,便于覆盖的时候区分,然后你可以用上边的代码进行测试,并trace出所有的sprite的深度值,看是否如书中所说,呵呵!

var sprite1:Sprite = new Sprite();
sprite1.graphics.lineStyle(2,0x000000);
sprite1.graphics.beginFill(0x333333);
sprite1.graphics.drawRect(0,0,200,200);
sprite1.x = 50;
sprite1.y = 50;
addChild(sprite1);

var sprite2:Sprite = new Sprite();
sprite2.graphics.lineStyle(2,0x000000);
sprite2.graphics.beginFill(0xCCCCCC);
sprite2.graphics.drawRect(0,0,200,200);
sprite2.x = 60;
sprite2.y = 60;
addChild(sprite2);

var sprite3:Sprite = new Sprite();
sprite3.graphics.lineStyle(2,0x000000);
sprite3.graphics.beginFill(0xFFFFFF);
sprite3.graphics.drawRect(0,0,200,200);
sprite3.x = 70;
sprite3.y = 70;
addChild(sprite3);

//setChildIndex(sprite3,0);
setChildIndex(sprite1,numChildren-1);

trace(getChildIndex(sprite1));
trace(getChildIndex(sprite2));
trace(getChildIndex(sprite3));