收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 2144|回复: 5

[AS3] 在类中向主场影添加显示对象的问题

[复制链接]
发表于 2009-4-1 13:49:23 | 显示全部楼层 |阅读模式
fla文件代码

  1. var main:Main=new Main()
  2. addChild(main)
复制代码


Main类

  1. package {
  2.         import flash.display.Sprite
  3.         public class Main extends Sprite{
  4.                 public function Main() {
  5.                         var drawShape:Draw=new Draw();
  6.                 }
  7.         }
  8. }
复制代码


Draw类

  1. package {
  2.         import flash.display.CapsStyle;
  3.         import flash.display.JointStyle;
  4.         import flash.display.LineScaleMode;
  5.         import flash.display.Sprite;
  6.         import flash.geom.Rectangle;
  7.         import flash.display.MovieClip;
  8.         import flash.events.*;

  9.         public class Draw extends MovieClip {
  10.                 public var triangle:Sprite=new Sprite;
  11.                 public function Draw() {
  12.                         var color:uint=0xFF0044;
  13.                         var lineWidth:Number=20;
  14.                         var lineAlpha:Number=1.0;
  15.                         var pixelHinting:Boolean=true;
  16.                         var scaleMode:String=LineScaleMode.NORMAL;
  17.                         var caps:String=CapsStyle.SQUARE;
  18.                         var joints:String=JointStyle.MITER;
  19.                         triangle.graphics.lineStyle(lineWidth,color,lineAlpha,pixelHinting,scaleMode,caps,joints);

  20.                         var triangleSide:Number=100;
  21.                         triangle.graphics.moveTo(0,0);
  22.                         triangle.graphics.lineTo(0,triangleSide);
  23.                         triangle.graphics.lineTo(triangleSide,triangleSide);
  24.                         triangle.graphics.lineTo(0,0);
  25.                        
  26.                         addEventListener(Event.ADDED_TO_STAGE,addChildFun);
  27.                 }
  28.                 public function addChildFun(_evt:Event) {
  29.                         trace(MovieClip(root));//事件好像没有被触发。
  30.                         MovieClip(root).addChild(triangle);
  31.                 }
  32.         }
  33. }
复制代码


但是,如果偶将Main类改为

  1. package {
  2.         import flash.display.Sprite
  3.         public class Main extends Sprite{
  4.                 public function Main() {
  5.                         var drawShape:Draw=new Draw();
  6.                         addChild(drawShape);//多加了这一句,Draw类中没有被触发的事件就被触发了。为什么在Draw中已经写了MovieClip(root).addChild(triangle);却没有显示,没有触发事件。一定要在这里写addChild(drawShape);才会显示Draw中所画的画与触发Event.ADDED_TO_STAGE事件?
  7.                 }
  8.         }
  9. }
复制代码


偶的问题在代码注释中。
 楼主| 发表于 2009-4-2 19:00:10 | 显示全部楼层
没人知道呀?
回复 支持 反对

使用道具 举报

发表于 2009-4-2 19:31:32 | 显示全部楼层

  1. var drawShape:Draw=new Draw();
复制代码

当然!如果没有这个addChild(drawShape);是不会触发Event.ADDED_TO_STAGE事件的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-2 19:49:45 | 显示全部楼层
谢谢ibio的回复。
不过偶还有不明白的地方,所以再次请教,谢谢!

Event.ADDED_TO_STAGE在将显示对象直接添加到舞台显示列表或将包含显示对象的子树添加至舞台显示列表中时调度。 以下方法会触发此事件:DisplayObjectContainer.addChild()、DisplayObjectContainer.addChildAt()。

按帮助中所说的偶已经在Draw类中写了以下代码

  1. public function addChildFun(_evt:Event) {
  2.             trace(MovieClip(root));
  3.             MovieClip(root).addChild(triangle);
  4.         }

复制代码


1.MovieClip(root)不是指舞台吗?
2.如果按照偶最后所改写的可以显示图像的Main类,Main类中addChild Draw类的一个实例,最后才在fla中addChild Main的实例。这样一个一个嵌套(是整个类的)addChild会不会浪费资源?
3.如果第2个问题的答案是“会浪费资源”,那偶有什么办法可以在Draw类中直接将要显示在舞台上的对象放置在舞台上——但前提是,Draw的一个实例必须在Main中生成?

[[i] 本帖最后由 zero09 于 2009-4-2 19:52 编辑 ]
回复 支持 反对

使用道具 举报

发表于 2009-4-3 10:06:12 | 显示全部楼层
1.MovieClip(root)

在此class没有被加载到舞台上之前,当然不是!而且root和AS2中的有很大区别!在AS3中指舞台的是stage,而且也必须等Event.ADDED_TO_STAGE之后才能获取到,否则是null。

这样一个一个嵌套(是整个类的)addChild会不会浪费资源

不会,你的担心是多余的。你想想在AS2中,每次也是要执行这一步的,只是FLASH自动就执行了,而没有通知而已。而在AS3中把这个步骤提出来了。(个人理解,仅供参考)

Draw的一个实例必须在Main中生成?

如果Draw没有被加入显示类表,你很难从里面访问到stage。不过你可以尝试用中介者模式,将stage从外部传递进去,就OK了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-4-3 10:14:27 | 显示全部楼层
谢谢ibio的详细回复!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2019-5-23 02:54 , Processed in 0.078125 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表