这一节我来介绍一下如何在as3游戏中应用面向对象程序设计。
查看元件属性,确保它是如下图所示的:
然后点击一下这里:
这时候会新弹出一个脚本页面,我们先Ctrl-S保存,名字为Player.as,这个就是元件的绑定类。
元件对象也具有ENTER_FRAME事件,使用这个事件可以让元件动态刷新,但是我非常不建议这种方法,因为如果你有很多元件对象,每个对象的加载顺序不同,会导致1帧偏差问题。所以我建议用自定义的游戏轮询方法。
我们在元件类中添加这个方法:
public function gameLoop(event:Event):void
{
}
同时加上import flash.events.Event;,然后在Main.as的onEnterFrame中写上player.gameLoop(event);调用这个方法即可。
如此一来,游戏循环有了统一的管理,游戏程序就简单多了。如果觉得必要,还可以把gameLoop()提到一个接口中。
下面,我们把上一节的代码,Main.as中的:
player.x--;
转移到Player.as中去,放入Player.as中的gameLoop,改为this.x--;,并在Main.as的gameLoop最下边加上player.gameLoop(event);,然后Ctrl-Shift-Enter调试运行。可以看到跟上节一样的效果,但是这里用到了面向对象技术。
如何在Player类中找到Main类的引用呢,用Main(MovieClip(parent))即可,由于AS3语言不是很严谨, 所以外边的Main()去掉也可以,但是我希望读者有一个严谨的编程风格,所以这里特意提到了这一点,就是向下转型应该显示比较好。
然后这里会出一个新的问题,就是有些时候parent可能是null,也就是root(就是文档类Main默认的对象)还没把player给addChild()上去,所以parent就是空的。一种办法就是判断一下parent是否为null,但是这种方法的麻烦也不少,比如程序员希望在Player的构造方法中用到parent,而这里不得不去判断是否null,因为这里只执行一次,所以不得不把代码转到gameLoop,这样却又不得不增加额外的布尔型变量记录和判断是否只执行了一次。
AS3提供了专门的事件来解决这个问题,那就是使用ADDED_TO_STAGE事件和REMOVED_FROM_STAGE事件,代码如下:
public function Player() {
// constructor code
addEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
}
private function onAddedToStage(event:Event):void
{
addEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStage);
}
private function onRemovedFromStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE,onAddedToStage);
removeEventListener(Event.REMOVED_FROM_STAGE,onRemovedFromStage);
}
这样,解决了初始化的时候找不到parent的问题,但是并没有解决gameLoop中找不到parent的问题,这个问题我也没有什么好的方法,也就只是判断parent是否为null,如果读者有好的方法,欢迎留言。