Blog.GC

AS3中关于Sprite高宽的诡异事件

| Comments

这两天在做首页的那个Flash,现在做做Flash真是越来越自信了,结果就碰了壁。

先看一下下列代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var mc:Sprite = new Sprite();
addChild(mc);
mc.x = (Math.random()-0.4)*1000;
mc.y = 400;
mc.width = Math.random()*50+1;
mc.height = mc.width;
var pen:Pen = new Pen( mc.graphics );
pen.beginFill(color[i]);
pen.drawStar(0, 0, 5, 39, 100);
pen.endFill( );

于是,诡异的事情发生了,这个Sprite不见了!

这个问题纠结了我好几个小时,我总是以为我的代码哪里错了(虽然事实上就是错了),但是找不到错在哪里,无语了一晚上。

第二天,彻底取余的我看了一下AS3语言参考,发现了如下一段文字:

width:Number [读写]

**语言版本: **

ActionScript 3.0

**运行时版本: **

AIR 1.0, Flash Player 9

指示显示对象的宽度,以像素为单位。 宽度是根据显示对象内容的范围来计算的。 如果您设置了 width 属性,则 scaleX 属性会相应调整,除 TextField 和 Video 对象以外,没有内容的显示对象(如一个空的 Sprite)的宽度为 0,即使您尝试将 width 设置为其它值,也是这样。

原来如此!

也就是说,当我把mc.width设置成100时,等于设置了mc.width=0和mc.scaleX=0,所以即使后面画了图形,也由于mc.width已经为0而无法显示,本来Sprite是自适应大小的,现在由于规定了为0反而不能变了。

于是,把设置width和height的语句删除,一切正常。但是我要改大小怎么办呢?

如果画完图再设置width和height,将会变成裁剪,所以只能在画图的过程中自行设置大小了。

于是最终代码就成为这样:

1
2
3
4
5
6
7
8
9
var mc:Sprite = new Sprite();
addChild(mc);
mc.x = (Math.random()-0.4)*1000;
mc.y = 400;
var pen:Pen = new Pen( mc.graphics );
pen.beginFill(color[i]);
var radius:Number = Math.random()*20;
pen.drawStar(0, 0, 5, radius, radius*2.5);
pen.endFill( );

成功执行~~~

来张效果图:

Comments

comments powered by Disqus