实例化init()
函数后会运行吗?
例如:
var circle:MovingCircle = new MovingCircle();
MovingCircle
类中包含init()
函数。
有人可以用init()
函数来启发我吗?
另一个问题是:
MovieClip
,Shape
和Sprite
类之间有什么区别?什么时候适合使用它们?
答案 0 :(得分:4)
马蒂上面的回答很好;但还有另一个;使用以下类结构稍微更微妙的原因:
public class WobbleBobble {
// Constructor.
public function WobbleBobble() {
init();
}
private function init() : void {
// ...<snip>some complex initialisation logic</snip>....
}
}
您可能想知道构造函数为什么调用init()方法;为什么不把复杂的初始化逻辑块放在构造函数中呢?
答案是因为AVM doesn't JIT code placed inside a constructor;这导致它比其他方法中的代码执行速度慢约70%。
答案 1 :(得分:3)
当你说“运行一次初始化”时,你会想到一个构造函数。
构造函数使用与该类相同的名称,例如:
public class Pants extends MovieClip
{
public function Pants()
{
trace('hello');
}
}
现在,如果我们这样做:
var p:Pants = new Pants();
此代码也将运行:
trace('hello');
init()
函数是一个自定义函数,人们可以将它用作异步构造函数(即在定义其他变量之后可以调用的函数)。
public class Pants extends MovieClip
{
public var str:String;
public function init():void
{
trace(str);
}
}
然后这将追踪“某些字符串”:
var p:Pants = new Pants();
p.str = "some string";
p.init();
就个人而言,我在我的应用程序对象的基类的setter中使用我自己的init()
函数,如下所示:
public class Pants extends MovieClip
{
private var _core:ApplicationCore;
private function _init():void
{
trace("application core is: " + _core);
}
public function set core(ac:ApplicationCore):void
{
_core = ac;
_init();
}
public function get core():ApplicationCore{ return _core; }
}
然后我可以这样做:
var appCore:ApplicationCore = new ApplicationCore();
var p:Pants = new Pants();
p.core = appCore;
只有在我定义了应用程序核心后才能运行init()
函数。
至于你对不同类别类的问题 - 目标是尽可能使用最原始的类。
如果您只想要一个可以在屏幕上移动的简单图形,请使用Shape
。如果要定义更复杂的图形,请使用Sprite
。如果您希望能够拥有时间轴动画,请使用MovieClip
。
基本上,当你想要的只是创建一个蓝色方块时,没有必要创建一个MovieClip,但是如果你想为它添加其他DisplayObject,你需要使用MovieClip或Sprite。