第 5 章 Flash AS3.0 游戏基础
本章知识地图
5.1 ActionScript3.0 概述 2007 年 4 月,支持 ActionScript3.0 的 Adobe Flash CS3 正式版发布,随着 不断的升级和扩展, ActionScript 的功能越来越强大。 ActionScript3.0 相比过去的 ActionScript1.0 和 2.0 ,实现了完全面向对象, 功能强大,性能更加优化,它旨在方便地创建拥有大型数据集和面向对象 的可重用代码库的高度复杂程序。虽然 ActionScript3.0 包含 ActionScript 编 程人员熟悉的许多类和功能,但 ActionScript3.0 在架构上和概念上是区别于 早期的 ActionScript 版本的。
5.2 包和命名空间 1 .包 包( Packages )是具有明确的相似或相关功能的一组类的集合,同一 包中的类不需要写任何特定代码就可以相互访问,而不同包中的类在相互 访问时必须通过 import 导入,也就是要先指明要使用的类所在的位置。 包的代码通常要写到扩展名为.as 的文本文件中,可以用如下代码声明一个 包: package example{ …… }
5.2 包和命名空间 2 .命名空间 通过命名空间可以控制所创建的属性和方法的可见性。可以将 public 、 private 、 protected 和 internal 访问控制说明符视为内置的命名空间,如果 这些预定义的访问控制说明符无法满足要求,则可以创建自己的命名空间。
5.3 类和对象 公共类(软件自带的类)有数百种,可以 应用于多个方面。自定义类通常是由用户自行 编写,实现某些方面的功能。 一个自定义类通常包括类名和类体,类体 又包含类的属性和方法等几个部分。构建自定 义类时, ActionScript 文件名就是类名。任何能 够运作的 ActionScript3.0 类最少应有以下代码: 公共类和自定义类 package mypackage { // 创建包并为其命名 public class SimpleClass { // 创建自定义类 public function SimpleClass() { // constructor code }
5.3 类和对象 每一个类都需要一个构造函数( constructor ),即使是一个什么都 实现不了且没有明确定义的类也是如此。构造函数的名称与类名称相同, 当我们创建类的新实例时就会执行构造函数中包括的所有代码。 构造函数允许我们对新创建的实例进行必要的初始化,或者它也可 以不执行任何操作,这取决于类的用途。 构造函数
5.3 类和对象 要使用创建好的类,必须通过类的实例来访问。要创建类的实例, 需要执行下面的步骤。 ( 1 )使用 import 关键字导入所需的类文件,其用法格式如下所示: ( 2 )使用 “var” 和 “new” 关键字创建一个对象,用法如下: 创建实例 import 类路径. 类名称 ; var 对象 : 对象属性类型 = new 类名 ; 例如: var btn:Object=new Object(); // 声明一个名称为 btn 的对象,并将其实例化;
5.3 类和对象 1 .动态添加对象: addChild() 方法 最先使用 addChild() 方法添加到场景中的实例,将位于最底部,随 后添加到场景中的实例,将覆盖于之前所添加实例的上方。 addchild() 的用法: 动态添加、删除对象 DisplayObjectContainer.addChild(child:DisplayObject); 实现将一个 DisplayObject 子实例添加到该 DisplayObjectContainer 实例中。子对 象将被添加到该 DisplayObjectContainer 实例中其他所有子对象的上面。
5.3 类和对象 2 .实例的深度控制: addChildAt() 方法 使用 addChildAt() 方法可以将对象添加到某一个深度进行显示。 addChildAt() 的用法: 动态添加、删除对象 DisplayObjectContainer.addChildAt(child:DisplayObject, index:int); index:int 为添加该子项的索引位置。如果指定当前占用的索引位置, 则该位置以及所有更高位置上的子对象会在子级列表中上移一个位置。
5.3 类和对象 3 .动态删除对象: removeChild() 、 removeChildAt() 方法 删除对象的方法主要有两种, removeChild() 方法和 removeChildAt() 方法。 removeChild() 方法通过指定需要删除的对象名称,将其从显示列表 中删除。有时我们并不知道要删除的对象的具体名称,可以使用 removeChildAt() 方法,通过指定要删除的对象的深度,进而从显示列表 中删除对象。 动态添加、删除对象
5.3 类和对象 4 .实例制作 —— 添加对象 要实现的效果:在舞台上已经放了蛋 糕元件,现在通过代码将 “ 火焰 ” 添加到蛋 糕的蜡烛上。 动态添加、删除对象 实例效果
5.4 使用 FlashDevelop 编辑 AS 文件 FlashDevelop 是一款开放源代码面向 FlashActionScript 的开发 IDE 。 FlashDevelop 本身采用.NET 开发,可以运行在 Windows 环境之中。 FlashDevelop 是学习、开发 Flash ActionScript 3.0 的有力工具,其最 大的特点是超强的代码提示、方便的快捷键操作、开源代码模板定制、 可扩充的插件功能,是一款优秀的辅助软件。 FlashDevelop 、 Flash 的安装与配置步骤:①安装.NET framework ; ②安装 Java SDK 1.6 以上版本;③安装 Flex SDK ;④安装 Flash CS6 ;⑤ 安装 FlashDevelop 。
5.5 应用函数 函数的定义需要使用 function 关键字,其格式如下所示: 定义函数 function 函数名 ( 参数 1: 参数类型, 参数 2: 参数类型 …): 返回类型 { // 函数体 }
5.5 应用函数 函数只是一个编写好的程序块,在没有被调用之前,什么也不会发 生。只有通过调用函数,函数的功能才能够实现,才能体现出函数的价 值和作用。 函数的调用可以分为一般的函数调用方法以及嵌套和递归调用函数 的方法。 对于没有参数的函数,可以直接使用该函数的名字后面跟一个圆括 号(它被称为 “ 函数调用运算符 ” )来调用。 调用函数
5.6 ActionScript3.0 事件处理 事件侦听是 Flash 互动的核心,在 AS3.0 中使用 addEventListener() 方法来侦听事件并触发响应。要将事件附加到事件处理程序,需要使用 事件侦听器,事件侦听器等待事件发生,事件发生时就会运行对应的事 件处理函数。我们可以将事件侦听的语言格式用中文抽象为: 认识事件侦听机制 被侦听的对象. addEventListener( 需要侦听的事件, 当该事件发生后需要触发的函数名 ) ;
5.6 ActionScript3.0 事件处理 事件发生时运行的特殊函数称为事件处理函数,事件处理函数的格式如 下: 与 addEventListener() 方法相对应的,是移除事件侦听器的 removeEventListener() 方法。当某个事件侦听器不再有用时,可以使用 removeEventListener() 方法将该事件侦听器移除。 认识事件侦听机制 function 函数名 (event: 该事件的数据类型 ):void { 事件触发后执行的代码 }
5.6 ActionScript3.0 事件处理 实例制作:在舞台上已经放了 3 个 flowerpot (花盆)元件,现在,通 过代码将 “ 鲜花 ” 插入到 “ 花盆 ” 中 。 使用鼠标事件 实例效果
5.6 ActionScript3.0 事件处理 键盘的敲击事件是由舞台 stage 来感知的,所以应该为 stage 添加键盘事 件侦听机制。 使用键盘事件 实例效果 实例制作:通过键盘的上、下、左、 右四个方向键控制 fish 对象的移动。
5.6 ActionScript3.0 事件处理 1 .使用 Event.ENTER_FRAME 事件 Event.ENTER_FRAME 事件是以帧 频触发,持续执行,即使时间轴停止, 事件也仍然会发生,只有删除此事件控 制或者移除响应动作的对象,才能停止 该事件。 在游戏中触发连续动作 对象.addEventListener(Event.ENTER_FRAME,enterFrameHandler) // enterFrameHandler 为事件处理函数 实例效果
5.6 ActionScript3.0 事件处理 2 .使用 Timer 类 Timer 类是计时器的接口,实现按指定的时间间隔调用计时器事件。使用 Timer 类, 需要执行下面的步骤: ( 1 )创建 Timer 类的实例,并告诉它每隔多长时间调用一次计时器事件以及调用 的次数。 ( 2 )为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。 ( 3 )启动计时器。 在游戏中触发连续动作 var myTimer:Timer =new Timer(delay:Number, repeatCount:int); myTimer.start(); myTimer.addEventListener(TimerEvent.TIMER, timerHandler);
5.7 创建 ActionScript3.0 游戏框架 游戏框架的好处之一就是可以有效地组织代码段和游戏中的函数,基于游戏 框架可以很容易地写出易于扩展的游戏代码。 1 .状态循环 游戏大概有三种状态,一个是初始状态,一个是游戏状态,还有一个是游戏 结束状态。根据游戏运行的需要来确定它当前的运行状态,这个就是状态循环。 2 .游戏频率 游戏频率也可以看作是每隔一段时间来检查游戏状态的机制。 gameLoop() 是 游戏执行的循环逻辑,这个游戏通过 ENTER_FRAME 事件来反复调用 gameLoop() 函数。 3 .事件模型 initGame() 函数定义了这个游戏的事件模型。
5.7 创建 ActionScript3.0 游戏框架 程序流程的简单描述。
本章小结 类和对象是面向对象编程最核心的概念,类是为某种对象定义的变量和 方法的集合,使用 addChild() 与 addChildAt() 方法可以动态地添加对象,使 用 removeChild() 与 removeChildAt() 方法可以动态地删除创建的对象。 事件侦听是 Flash 互动的核心,在 AS3.0 中使用 addEventListener() 方法来 侦听事件并触发响应,本章重点介绍了鼠标和键盘事件的运用。 游戏开发中,有时候动作的执行是需要持续进行的,在 AS3.0 中可以通 过 Event.ENTER_FRAME 事件和设置 Timer 类来实现触发连续动作。 游戏框架的建立有助于理清游戏的架构,有效地组织代码和游戏中的函 数,通过本章的学习,利用游戏框架可以制作出具体的游戏案例。
思考与拓展 1 .什么是类?自定义类的一般格式是怎样的? 2 .创建实例的一般格式?如何动态添加、删除对象? 3 .事件侦听的一般格式?如何定义事件处理函数? 4 .如何在游戏中触发连续动作? 5 .尝试自己编写出 AS3.0 游戏的一般框架。