软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 设计在线 > 媒体动画 > Flash AS2 空MC绑定自定义类的方法

Flash AS2 空MC绑定自定义类的方法

以前读书的时候学习的Flash,多是直接设计比较少接触到使用AS的;写程序久了,就变得不喜欢用设计了,确实有些应用也没办法离开AS。
  最近制作一个SNS浏览器,我就全部用了AS来写,包括界面、数据操作等等都是;越是深入写就越觉得AS2.o如果作为一种OO的语言来设计应用还是有些不足之处,至少有些方面例如直接使用MC子类来创建并连接空MC是不可能的事,一定要出现在库中的元件才可以连接到自定义类;这就限制了其完全代替设计工具的能力;百般无奈下,我只好使用了另一种方法来实现实例化自定义类的同时,创建连接该类的空MC以供绘画等AS操作的功能;该方法将自定义类的所有方法作为MovieClip超类的方法附加到MovieClip类,之后这些方法就可以操纵MC了:

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number)
{
if(arguments.length<3)
{
trace("MovieClip.createClassMovieClip arguments miss!");
return;
}
var tOld=MovieClip.prototype;
MovieClip.prototype=new aClass();
var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
MovieClip.prototype=tOld;
return tRefer;
}
上面的方法有个缺点就是不能调用构造函数,而且照我的想法这个方法其实是重新构造MC的超类,因此假如自定义类中要是有个与MC同名的成员,则应该被MC本身成员覆盖;所以google了一下,找到个老外写的:
http://www.helpqlodhelp.com/blog/archives/000087.html
按照老外所说的应该是修改MC的原型链,但是如果prototype指向MC的超类那么继承自MC的自定义类的超类也是MC,则MovieClip.prototype=myClass.prototype;语句应该是把MC的超类指向MC本身?郁闷~附加到原型链就是这样吗?我结合老外的做法,写出下面的方法:

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
{
if(arguments.length<3)
{
trace("MovieClip.createClassMovieClip arguments miss!");
return;
}
var tOld=MovieClip.prototype;
MovieClip.prototype=aClass.prototype;
var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
MovieClip.prototype=tOld;
aClass.apply(tRefer,aArg);
return tRefer;
}
结果发现该方法完全可行,并且能够重写MC的方法,也可以调用构造函数~ ;
然后我又改了一下;


MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
{
if(arguments.length<3)
{
trace("MovieClip.createClassMovieClip arguments miss!");
return;
}
var tOld=MovieClip.prototype;
MovieClip.prototype=new aClass();//here
var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
MovieClip.prototype=tOld;
aClass.apply(tRefer,aArg);
return tRefer;
}
注意看注释的不同处,使用结果发现居然和前面的一模一样,可以重写方法……郁闷了,有没有人知道怎么会事?
以上两个方法都是可以正常使用的。下面给出例子。

main.as:-------------------------------------------

MovieClip.prototype.createClassMovieClip=function(aClass:Function,aInstanceName:String,aDepth:Number,aArg:Array)
{
if(arguments.length<3)
{
trace("MovieClip.createClassMovieClip arguments miss!");
return;
}
var tOld=MovieClip.prototype;
MovieClip.prototype=aClass.prototype;
var tRefer=this.createEmptyMovieClip(aInstanceName,aDepth);
MovieClip.prototype=tOld;
aClass.apply(tRefer,aArg);
return tRefer;
}

import Container;

var t=_root.createClassMovieClip(Container,"dd",10);

t.addElemt();

t.hi();

t.getURL(http://www.yaszone.com/wp);Container.as :----------------------------------------

import Element;

class Container extends MovieClip
{
public function Container()
{
this._x=0;
this._y=0;
this.lineStyle(1,0x000000);
this.beginFill(0x666666,50);
this.moveTo(0,0);
this.lineTo(200,0);
this.lineTo(200,200);
this.lineTo(0,200);
this.lineTo(0,0);
this.endFill();
trace("Constructor: Container()"+this);
}

public function hi()
{
trace("Container::hi()");
}

public function addElemt()
{
var t=super.createClassMovieClip(Element,"e1",10);
trace("Container::"+t);
return t;
}

public function getURL(aUrl:String)
{
super.getURL(aUrl,"_blank");
trace(aUrl);
}

}


Element.as:-----------------------------------------------

class Element extends MovieClip
{
public function Element()
{
this._x=50;
this._y=50;
this.lineStyle(1,0x000000);
this.beginFill(0xFF0000,50);
this.moveTo(0,0);
this.lineTo(100,0);
this.lineTo(100,100);
this.lineTo(0,100);
this.lineTo(0,0);
this.endFill();
trace("Constructor: Element()"+this);
}

public function hi()
{
trace("Element::hi()");
}

public function onRelease()
{
trace("Element::onPresss()");
}
}
    相关阅读
    栏目导航
    推荐软件