上一次讲了如何使用Enterframe做基础控制流的入口,我们使用了Timer配合,使得我们可以在每次进入下一帧的时候获得两帧之间的时间。
现在我们讲讲如何通过tickBase方法进而去控制程序中需要控制的每一个类。
这次我们用《梦想花园》中的花的成长控制作为例子。
如果每一朵花都需要自动的生长,我们应该怎么做呢?没错,我们要使用tick,在每次进入下一帧的时候调用tick函数,传入时间间隔timeSpan,累加这些时间,并且判断花朵是否应该长大,从而更换花朵的状态。
为 此,我们写了一个新的类BaseObject类,该类继承Sprite类,该类有个方法addObject代替addChild方法(但是我们不重写 addChild,因为也有用到的时候),addObject只能用于添加另一个BaseObject类,该方法的作用是,将另一个BaseObject 类的实例化对象加入该类中的一个数组里,作为他的“子”,并且在tick方法中调用它所有“子”的tick,而他所有“子”还将调用“子”中“子”数组的 tick方法(如果有这么多“子”)的话。
可以看一下这个类的构造函数和addObject方法以及tick方法
public function BaseObject(mc:MoviClip) : void
{
baseObjects = new Array(); // baseObjects 是私有属性
content = mc; // content 是私有属性
}
public function addObject(baseObj:BaseObject)
{
objectsToAdd.push(obj); //objectsToAdd 是私有属性 用于存储需要添加的对象(这是一个临时的数组,当执行了addAndRemoveObjects()方法以后,objectsToAdd 才会真正被添加到baseObjects数组中)
}
public function tickBase(timeSpan:uint) : void
{
for each(var i in baseObjects)
{
i.tickBase(timeSpan);
}
tick(timeSpan);
addAndRemoveObjects();//这个方法下次会讲到,很重要,功能是在tick的时候处理把对象添加到显示列表中
return;
}
public function tick(timeSpan:uint)
{
//该方法没有实现是个抽象方法,子类继承该抽象方法以完成tick中的内容
}
虽 然这个类没有完整的书写(还不能用),但是现在已经可以对其功能进行了解。任何继承这个类的子类都会有tick方法,一旦使用了addObject方法添 加其他继承该类的对象,只要在上一讲中的ENTERFRAME中,调用一个“父”级的BaseObject中的tickBase,就可以自动的传入所有该 对象中的所有“子”级对象中的tick。
一旦这么做,我们可以先建立一个BaseObject对象 land,然后使用land.addObject(flowe)方法,不过flowe对象也得是BaseObject的实例,然后在EnterFrame 事件中执行land.tickBase()方法,在每次进入下一帧的时候,flower就会执行自己的tick方法,于是在tick中我们可以执行计算时 间并选择播放花朵的那段动画的过程函数了。
这样的好处是,即便对象之间的关系很复杂(比如land 中有grass(草地),grass里有pot(花盆),pot中有5个flower),我们仍然能自由的去写每一个类的tick方法,他们可以有自己的 处理方式,然后只要通过addObject方法来添加他的子级就可以达到预期的效果了。
好了,下次我们再说BaseObject中的具体实现方式,现在只要了解我们是如何控制我们的对象的就可以了。