[AS2]动态创建V2Component

V2Component能否动态创建呢,答案是显然的。
由于V2Componet继承自UIObject,而uIObject又继承自MovieClip
所以,MovieClip里所拥有的属性和方法在v2Component里一样的好用,
很自然的想到用attachMovie来动态加载V2Component.
但事情并没有就此结束,不是吗,V2Componet里最强劲的监听器还没给用上呢。
你准备怎么办呢?

someComponent.addEventListener("eventName",listenObj);
listenObj.eventName=function():Void
{
 //....
}

看上去不错吧,如果这些代码是用面向对程的方式写在主场景里,问题的确不会太大.
但当工程量变大时,要管理起来,就麻烦了,你会说,我造一个专门管理Component类
把创建,注册监听器及销毁的工作全包了,所起来又是个不错的主意,如果你只有一个
场景,即V2Component在整个程序中只有生成一次的时候,问题一点都没有。但当你的
程序需要随情况的不同来动态的改变式的创建相应的组件的时候,事情就麻烦了,大麻烦了,
你的那个全能的类会变的异常的庞大,可维护性降至最低.
其实要处理也简单,就是分而治之,该是什么效果出现的时候就创建那个效果.

我现在的做法创建类的归创建类的一那个子包,叫Com,
而具体的实现则放到另一个专门存放消息处理的子包中,叫Msg.
所以,你可以想像情况是这样的:
Com+---
    ComScene
    ComEffect1
    ComEffect2
    ...
Msg+---
    MsgScene
    MsgEffect1
    MsgEffect2
    ...
   
这样一种看似多此一举的行为,实际上对整个程序的修改及扩展方面,都带来了极大的便利.

具体的实现代码摘录如下:
class Sdgp.SEffect.CS2BallConserve extends CSEffectBall1D
{
        public function CS2BallConserve()//在某个效果类里创建其自身的ComMag对象
  {  
   mComMag=new CSCom2BallConserve();
   //在其父类中的声明为:private var mComMag:ISComMag;
   //其中ISComMag为所有ComMag类的接口类.
            ...
        }
        .....
      
       //创建组件.
        public function init():Void
     {   ...
   thisP.mComMag.create();  
            ...
        }
}

//直接管理组件的类:
class Sdgp.SCom.CSCom2BallConserve extends RCSComMag
{   public function CSCom2BallConserve()
 {
       mMsgF=new CSMsg2BallConserve();
      //在其父类中声明类对象:private var mMsgF:ISMsgF;指向抽象接口
 }
    public function create():Void
    {  
       
  .....
  
  _root.attachMovie("TextInput","txtm1",14);
        _root.txtm1.move(20,200);
  _root.txtm1.restrict="^A-Z ^a-z";
  _root.txtm1._width=50;
  
  _root.attachMovie("TextInput","txtm2",15);
        _root.txtm2.move(20,260);
        _root.txtm2.restrict="^A-Z ^a-z";
  _root.txtm2._width=50;
  
  ....
  
  listenerAdd();//监听器注册
    }
 
 public function remove():Void
 {   ...
     eval("_root.txtm"+1).removeMovieClip();
  eval("_root.txtm"+2).removeMovieClip();
  ...
   
 }
  private function listenerAdd():Void
 
 { 
     _root["txtm"+1].addEventListener("enter",mMsgF);;
 }
     ..... 
}

//把组件的消息处理委托给Msg类处理:
class Sdgp.SMsg.CSMsgSce extends RCSMsgF

    public function CSMsgSce()
    {
  enter=msgEnter;
 }

    private function msgEnter()
    {
        if(evt.target==_root.txtm1)
        {
   //Proccess
        }
   
    }

我把代码写成阶梯状以表表演这种逐级委托分派的思路.
这样构造一个程序结构的最大的好处就是调试及扩展起来方便,真的.

对了,我差点忘记了,肯定很多人会问,组件有无必要动态的创建,我的回答是是的,
至少在需要根据不同的情况频繁更新程序中组件的情况下,这样做就显得更加重要了。
因为我们更多的希望是用代码去控制程序,而不会被界面这种东西过多的约束.
准备说Visual Basic的不是了?打住喽~~~~


我的这样的方法肯定有不妥的地方,一时间的水平肯定是不能搞定的,还望高手指点一二.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值