朱冬玲
(广州城市职业学院,广东 广州 510405)
ActionScript 3(简称AS3)是Flash新一代脚本语言,全面支持面向对象编程机制,新增了很多强大功能,在新一代AS引擎AVM2上的执行速度比旧代码快10倍。借助于AS3的强大编程功能,一些以前用C++实现的游戏现可用Flash实现,而且在实现技术上有鲜明特色。在二维游戏和网页游戏领域,Flash游戏的主流地位更加巩固了。
用Flash AS3实现的深海射击游戏模仿一个街机赌博游戏的功能,以网页游戏的形式供人们无限制免费玩,使人们在娱乐身心时免于掉进赌博陷阱。
本游戏用鱼炮来捕鱼。鱼炮的威力分为7级,每级的杀伤力和消耗的炮弹数不同,可用空格键切换鱼炮等级,移动鼠标旋转鱼炮瞄准,单击鼠标左键发射炮弹。鱼有12种,每种鱼的质量、速度、生命力、出现概率、分数各不相同。飞行的炮弹击中鱼后,会撒出鱼网,鱼网覆盖范围内的鱼的生命力都会减小,生命力降为零的鱼被捕获。游戏分为快速、简单、普通、困难四种模式。游戏以一群水手商量出海捕鱼赚钱开始,经过航行选择捕鱼海域、选择主炮手后,开始捕鱼,最后或成功欢庆,或失败沮丧。
游戏具有加载XML数据、主菜单、查看帮助、选择游戏模式、航海选择捕鱼海域、选择主炮手、游戏主场景、成功欢庆、失败沮丧共9个场景,相应地在主时间轴上设置9个关键帧,名称分别是 loadxml、menu、help、chmode、navigate、setplayer、playgame、gamewin、gamelose。这些关键帧不会连续播放,在程序中用gotoAndStop函数实现不同场景的切换。游戏场景与关键帧的一一对应,使主时间轴具有清晰的帧结构,便于开发人员的交流与合作,也利于游戏的集成和功能扩展。
为避免帧代码互相干扰和便于模块集成,除在第1帧定义少量用于在各帧之间交换数据的变量外,其余各帧都不编写帧代码,也不直接放置界面元素,而是创建一个影片剪辑类型的元件,并把该元件链接到自己编写的类。该元件的宽和高均设置为1,直接添加到帧的左上角,不需作更多的编辑修改。9个关键帧对应的类分别是LoadXML类、Menu类、HelpScreen 类、ChMode类、Navigate类、SetPlayer类、Game类、GameWin类、GameLose类。由于帧的界面和行为都用类来实现,软件模块之间高内聚、低耦合,模块易集成、易维护、易重用。
游戏界面中涉及的元件很多,在这里介绍几种不断移动的元件类的实现。
使鱼平顺自然地游动是一个难点,有些游戏用Flash CS提供的Tween类中的方法来实现,但游动路径不够灵活多变。事实上,这属于人工智能范畴的转向行为,已有成熟算法。在参考文献[3]中,有相应的AS3实现代码,用机车类Vehicle代表恒速的物体,用转向机车类SteeredVehicle代表有加速度的物体。子弹和金银币以固定速度飞行,可以继承Vehicle类。鱼在游动过程中会改变速率和方向,可以继承SteeredVehicle类。几种主要元件类的继承关系如图1所示。
图1 类的继承关系
主场景分为初始状态、进行状态、结束状态,各用一个符号常量表示,再用一个变量gameState来代表当前状态。在Game类的构造方法中,完成界面布置、启动帧事件监听等操作。在帧事件监听方法中,根据当前状态的不同值分别调用initGame、playGame或endGame方法。在initGame方法中,设置变量初值,启动鼠标、键盘、定时器等事件监听,然后转换到进行状态。在playGame方法中,根据游戏逻辑完成生成对象、移动对象、碰撞检测等操作。在endGame方法中,取消事件监听,根据游戏结果修改全局变量,然后跳转到成功欢庆场景或失败沮丧场景。Game类的结构如下:
游戏的特征参数包括游戏模式参数、鱼参数、玩家参数、鱼游动路径座标参数、鱼阵座标参数等。以XML格式描述各种游戏特征参数,放在game.xml文件中。定义了一个Data类,用于保存从game.xml文件读入的游戏特征参数,并可供其它程序模块访问。LoadXML类用于把游戏特征参数从game.xml文件读到Data类中。
在主场景的进行状态,每帧都要执行playGame方法,按一定概率生成鱼,让全部鱼游动,让全部子弹飞行,让全部金银币飞行,作碰撞检测。
3.5.1 鱼的游动
鱼的游动主要用了搜寻、漫游、路径追随3种转向行为,时间复杂度都是O(1)。每条鱼都执行转向行为算法,如果有n条鱼,则一帧中全部鱼游动的时间复杂度为O(n)。
3.5.2 子弹和金银币的飞行
子弹和金银币以恒定速度移动的时间复杂度也是O(1)。每颗子弹和每个金银币都执行移动算法,如果有n颗子弹或n个金银币,则一帧中全部子弹或金银币移动的时间复杂度为O(n)。
3.5.3 碰撞检测
鱼和子弹的碰撞检测用两重循环逐个检查的方法。如果在飞的子弹有m颗,鱼有n条,则时间复杂度是O(mn)。发现碰撞后释放渔网,这时需要检测渔网与所有鱼的碰撞,时间复杂度有可能变成O(mn2)。为降低时间复杂度,在发现一次碰撞并释放渔网后,马上退出两重循环,时间复杂度是O(mn)+O(n)即仍是 O(mn)。
该游戏运行稳定流畅,占用系统资源不多。而且,架构清晰合理,程序模块之间、程序与数据之间实现松耦合,具有易集成、易维护、易重用等优点,其设计和实现方法都可供其它游戏借鉴。
[1]Gary Rosenzweig.ActionScript 3.0 Game Programming University[M].USA:QUE Publishing,2008.
[2]Jeff Fulton,Steve Fulton.The Essential Guide to Flash Games[M].USA:friendsof ED,2010.
[3]Keith Peters.Flash ActionScript 3.0动画高级教程[M].苏金国等译.北京:人民邮电出版社,2010.