写在前面的话:按照惯例,我只是对该类其中的一些属性和方法做讲解说明,并不会涵盖所有内容。如果想深入了解的,请参看相应的帮助文档。下同!
(1) alpha和_alpha
在AS2.0中,是用以下划线开头的变量名来标识相应的属性。如_width、_height、_visible、_alpha等。
在AS3.0中,该类变量名已经取消,不再沿用下划线。
这个也是AS3.0和AS2.0相比,一个蛮大的变化,大家要多留意。
(2) width、height、scaleX、scaleY
width和height分别对应显示对象的宽度和高度。
scaleX和scaleY分别对应AS2.0的_xscale和_yscale属性。(注意字母前后顺序不一样了)
当width和height属性值发生变化时,相应的scaleX和scaleY值也会发生变化,反之相同。
如果我们需要一个同比例的变形,通常用下面的代码:
假设我们在舞台上绘制了一个高为80,宽为120的长方形,然后用this.getChildAt(0)访问。代码如下:
this.getChildAt(0).width = 150; //将宽度修改为150
this.getChildAt(0).scaleY = stage.getChildAt(0).scaleX //等比例缩放
(3) mask
mask属性对应AS2.0的setMask()方法。虽然在AS3.0中,做为遮罩的显示对象可以不用放入显示列表,但是在功能上会有较多限制。所以我还是建议大家养成先放入显示列表,然后再使用的习惯,以免发生难以排查的错误。
下面的几个方法其实是AS2.0和AS3.0共通的,只是在表现形式上,可能略有区别:
1. 删除遮罩的方法
在AS2.0中,我们用setMask(null)的方法手动删除遮罩;对应AS3.0中,将mask属性设置为null,同样可以实现删除遮罩的目的。
2.设备字体的遮罩
假如被遮罩的对象是一个TextFiled对象,那么遮罩的形状只能是一个矩形框,即使你设置了一个圆形作为遮罩,也会自动转化为矩形框。
如果你一定要实现特殊形状的遮罩效果,需要用StaticText(静态文本)来实现。
3.Alpha通道遮罩
如果遮罩和被遮罩的显示对象都设置了位图缓存(cacheAsBitmap = true),那么就可以使用透明遮罩。通俗的说,就是对遮罩应用一个透镜,然后效果体现在被遮罩的显示对象上。我抄袭个官方的例子吧,大家可以直接复制代码,自己懒得写了。
// 加载图像
var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/
images/image1.jpg");
loader.load(url);
this.addChild(loader);
// 创建 Sprite并绘制渐变椭圆
var oval:Sprite = new Sprite();
var colors:Array = [0x000000, 0x000000];
var alphas:Array = [1, 0];
var ratios:Array = [0, 255];
var matrix:Matrix = new Matrix();
matrix.createGradientBox(200, 100, 0, -100, -50);
oval.graphics.beginGradientFill(GradientType.RADIAL,
colors,
alphas,
ratios,
matrix);
oval.graphics.drawEllipse(-100, -50, 200, 100);
oval.graphics.endFill();
this.addChild(oval);
// 对于两个显示对象都设置 cacheAsBitmap = true。
loader.cacheAsBitmap = true;
oval.cacheAsBitmap = true;
// 将椭圆设置为加载器的遮罩
loader.mask = oval;
// 使椭圆可拖动。
oval.startDrag(true);
运行下,看看效果吧,呵呵。
(4) root、stage、this
AS3.0里的root变化还是非常大的,大到什么程度呢,呃,我用例子来说明吧。
AS3.0里,创建一个文档后,首先就存在一个基础显示容器stage,然后在stage下有了第一个显示对象,就是root,我们可以用下面代码验证:
trace(stage.numChildren); //返回:1
trace(stage.getChildAt(0) == root); //返回:true
trace(root.parent == stage); //返回:true
此时的root,和this是等值的,我们可以用下面代码验证:
trace(root == this); //返回:true
然后我们在舞台上手动绘制3个MC,分别实例名为t1、t2、t3,然后用以下几种方式访问:
trace(root.numChildren); //出错
trace(root.t1); //出错
trace(this.numChildren); //正确:返回3
trace(this.t1); //正确
trace(this.getChildAt(0).name); //正确:返回t1
所以这个也是我比较迷惑的一个地方,虽然root和this是等值的,但是并不能直接用root进行访问了。
最后,我们在试验下面几行代码:
trace(t1.root == this); //返回:true
trace(t1.parent == this); //返回:true
trace(t1.root.numChildren); //出错
trace(t1.parent.numChildren); //正确,返回3
这几处地方为什么会报错,root和this在哪里存在不同,这个我暂时还没有弄明白,如果哪位朋友清楚,敬请指正。
(5) hitTestObject()、hitTestPoint()
我们做Flash游戏的时候,比如判断格斗动作,或者飞行射击等,经常需要判断两个物体之间是否有相交,那就需要用到上面的两个方法。
前者是判断两个物体之间是否有相交,后者是判断物体与某个坐标点是否有相交。