您的位置:首页 > 移动开发 > Objective-C

AS3.0中的显示编程(二)-- DisplayObject类

2010-10-08 10:38 148 查看
写在前面的话:按照惯例,我只是对该类其中的一些属性和方法做讲解说明,并不会涵盖所有内容。如果想深入了解的,请参看相应的帮助文档。下同!

(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游戏的时候,比如判断格斗动作,或者飞行射击等,经常需要判断两个物体之间是否有相交,那就需要用到上面的两个方法。

前者是判断两个物体之间是否有相交,后者是判断物体与某个坐标点是否有相交。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息