1、Flash入门必备Flash开发AS代码之游戏制作过程例子As3游戏制作郑重声明这不是什么教程,说教对我来说还太遥远,本人只是个菜鸟,老鸟们不要见笑。这里是一个简单的游戏的制作过程(谈不上开发),在这里我把一些简单的知识做个总结;这是本人第一次在网上写一些东西,我会努力做到最好的;好了,废话不说了(*_*) 嘻嘻进入正题。(本内容部分素材和知识来自风云II系列丛书)概述:本游戏涉及的主要知识点:1,游戏控制:本人大胆的把游戏控制分为了鼠标控制和键盘控制,本游戏中只涉及到了鼠标控制,但在整个游戏制作完成后,本人会补充键盘控制的内容。2,物件的创建和销毁:在游戏中,不可能所用的角色都事先拖放到舞台
2、,大多数情况需要用代码随机的产生并加入到舞台;当然,我们有时候并不希望我们加入的元素一直存在在舞台上,我们希望在特定的时间和特定的条件下删掉我们的元素。3,碰撞检测:几乎所有的游戏都需要用到碰撞检测,本游戏用的是Object.hitTestObject(Object);还有一个常用的是object.hitTestPoint(x,y,Boolean);4,事件:As3的事件不是一两句话可以说的清楚的,本游戏用到的事件都是一些常用的事件,如计时器Timer,还有一些零碎的知识,这里就不一一的列举出来;详细的内容见下。一:游戏介绍开始画面游戏进行中结束画面二:游戏类的分析与设计: 经过上面对游戏的介
3、绍,我们很清楚的知道游戏中的元素,它们是: 1,飞机Plan;;2,导弹Missle ;3,生命球AddLife游戏的元素比较简单,下面分别加以分析并设计它们;(在你的磁盘中新建一个flash文档,重命名为”死里逃生.fla”,在该flash文档的同一目录下新建一个文件夹,重命名为“classes”;如下图:)1.飞机应该有的属性:速度speed;生命:life;他还应该能跟随鼠标移动;具体做法如下,新建一个ActionScript文件,代码如下:将上面的actionscript文件保存在classes文件夹中,文件命名为Plan.as ,注意,文件名一点要与类名相同;2,导弹应该有的属性和方
4、法:角速度:omega,速度:speed,导弹还要求能跟踪飞机。代码如下:将上面的as文件也保存在classes文件夹中,并把该as文件命名为Missle.as注:这些代码有些复杂,希望大家仔细看,理解了就好了。在实现跟踪飞机这一代码块(即onTimerHandler函数),希望大家仔细把flash的坐标系统和Math的三角函数这些知识温习一下。在这里我不太想讲像if语句,swich语句,while,do。while。语句,基本的表达式那些基本的内容,相信学过C的人都会这些的。关于面向对象的一些核心内容:类,属性,方法,接口,继承,多态。我也不想讲,也不能讲,因为我不想误人子弟,我也只是了解这
5、些知识,希望想了解的同学去看看有关java或c+的教程。那下面接着第三个类:3,生命球应该有的属性和方法:所含的生命值,也就是能给主角加多少生命lifeValue;所显示的时间,也就是生命球能在舞台上显示多久timed;代码如下:将上面的as文件也保存在classes文件夹中,并把该as文件命名为AddLife.as;5,有关元素的类文件都写好了,就差一个文档类了,有关文档类的代码我们稍后再说,上面我们一直是写代码,现在我们来搭建主场景:打开你新建的“死里逃生。fla”文档,如下图搭建场景:注:前面是元素的类型,后面是文件的实例名。“重新开始”按钮下面还覆盖了一个“开始”按钮,实例名为“sta
6、rt_btn”。6:类库的组成:上图只显示出了与类库连接的原件;分别与我们上面写的类连接在一起;库中还有声音文件,是个爆炸的声音,这个声音的连接属性设置为:与“死里逃生.fla”文档在同一目录下的还有一个背景音乐,背景音乐的名字为:mySong.mp3;注意文件名一定要是mySong.mp3,因为在下面的代码中我用的是这个名字;7:最后我们来写文档类,把整个的代码和元件组织起来。文档类的代码:(此文件比较的繁琐,import语句可以简写,如:import.flash.display.*;import flash.display.event.*;在这里没有采用简写,好让大家方便查阅API);至此
7、:整个游戏的制作就结束了。结束的目录结构应该如下:Classes文件夹里的文件如下:将上面的as文件也保存在classes文件夹中,并把该as文件命名为Test.as;然后在“死里逃生.fla”文档的文档类后面的方框中填入:classes.Test如下图:修正:在Test类中的第63和第64之间加入如下语句:if (myPlan.life 新建ActionScript文件。写下代码如下:package classes import flash.display.MovieClip; public class Circle extends MovieClip private var speed:i
8、nt; public function Circle() speed=5; public function moveLeft():void this.x+=speed; public function moveRight():void this.x-=speed; public function moveUp():void this.y-=speed; public function moveDown():void this.y+=speed; 将这个as文件保存在“classes”文件夹中,保存名为“Circle.as”;c : 再点击“键盘控制_1.fla”文档的文件菜单新建ActionS
9、cript文件。写下代码如下:package classes import flash.display.MovieClip; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class Test extends MovieClip private var myCircle:Circle; public function Test() myCircle=new Circle(); myCircle.x=400; myCircle.y=300; addChild(myCircle); stage.addEven
10、tListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler); private function onKeyDownHandler(e:KeyboardEvent):void switch (e.keyCode) case Keyboard.LEFT : myCircle.moveLeft(); break; case Keyboard.RIGHT : myCircle.moveRight(); break; case Keyboard.UP : myCircle.moveUp(); break; case Keyboard.DOWN : myCircl
11、e.moveDown(); break; if (myCircle.x800-myCircle.width/2) myCircle.x=800-myCircle.width/2; else if (myCircle.x600-myCircle.height/2) myCircle.y=600-myCircle.height/2; else if (myCircle.y新建ActionScript文件。写下代码如下:package classes import flash.display.MovieClip; import flash.events.MouseEvent; import flas
12、h.ui.Mouse; public class Test extends MovieClip private var myCircle:Circle; public function Test() myCircle=new Circle(); addChild(myCircle); myCircle.x=400; myCircle.y=300; stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveHandler); private function onMouseMoveHandler(e:MouseEvent):void Mous
13、e.hide(); myCircle.x=e.stageX; myCircle.y=e.stageY; d: 点击“鼠标控制_1.fla”文档舞台的空白区,在属性栏中的文档类中填写:classes.Test;如下图所示:f :测试影片,圆能随着鼠标移动;:直接从库中将被控对象拖入舞台(键盘控制);:在您的计算机磁盘中新建一个fla文档,重命名为“键盘控制_2.fla”在这个文档的同一目录新建一个文件夹,重命名为“classes”;双击打开“键盘控制_2.fla”文档。将舞台设置为800*600;在舞台上新建一个影片剪辑(随便画什么,这里就画一个圆),命名为“主角圆”(不是实例名,你可以取其他的
14、名字)。建好影片剪辑之后,(不要删掉舞台上主角圆的实例)这时库中有刚刚建立的影片剪辑元件而库中同时有它的实例;保存一下;b:点击“键盘控制_2.fla”文档的文件菜单新建ActionScript文件。写下代码如下:package classes import flash.display.MovieClip; import flash.display.Stage; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class Circle extends MovieClip private var speed:
15、int; public function Circle() speed=5; this.stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler); private function onKeyDownHandler(e:KeyboardEvent):void switch (e.keyCode) case Keyboard.LEFT : moveLeft(); break; case Keyboard.RIGHT : moveRight(); break; case Keyboard.UP : moveUp(); break
16、; case Keyboard.DOWN : moveDown(); break; default : break; private function moveLeft():void this,x-=speed; private function moveRight():void this.x+=speed; private function moveUp():void this.y-=speed; private function moveDown():void this.y+=speed; 注意这句:this.stage.addEventListener();舞台中有this的实例时,才能
17、调用this的stage属性,否则会报错的。将这个as文件保存在“classes”文件夹中,保存名为“Circle.as”;c :切换到“键盘控制_2.fla”文档,在库中的影片剪辑“主角圆”上点击鼠标右键,在弹出的菜单中选择“链接”,之后在弹出的对话框中如下图填写相关的项目:d:测试影片,方向键能控制主角圆的移动;这里就不再啰嗦写”鼠标控制_2.fla”了。相信大家早以多我的啰嗦忍无可忍了。O(_)o总结一下:键盘控制和鼠标控制都需要用stage.addEventListener(,.);文档类可以直接用stage属性,而非文档类要用这个类的实例的stage属性(即this.stage),就
18、要求事先有实例放在舞台上;(纯属个人总结,正确与否只是本人认证了一下,没有任何官方的说明。您认这种说法错误,可直接略过这段,不要被我误导了。)二物件的创建与销毁物件的创建和销毁比较简单的,大体来说就是在文档类中采用new关键字创建新的对象,然后用addChild()/addChilaAt()加入到容器,当不需要的时候用removeChild()/removeChildAt()从容器中把它删除;当成批产生物件时,for循环结合数组能很好的解决问题。看个实例先,(申明:这个实例来自风云II系列丛书之Flash cs3 ActionScript 3.0游戏开发基础与范例,版权都属原作者所有)这里本人
19、不篡改原作,只做个搬运工。(1)首先,启动flash cs3;(2)选择 文件新建 菜单命令,选择新建一个ActionScript 3.0文档;(3)保存这个fla文件为Sample7_5.fla;(4)给主场景添加一个背景。修改主场景的帧频为30fps,填写文档类为objclasses。ObjSample,如下图所示;(5)创建一个金币的影片剪辑,保存到库中,在库中选择它,修改它的连接属性为外部类objclasses.Obj,如下图所示,这个金币将是这个例子中动态创建和删除的对象。(6)在fla文件存在的目录下创建objclasses文件夹;(7)在objclasses文件夹中创建Obj.a
20、s和ObjSample.as两个as 文件(8)编写如下代码清单Obj.as所示的代码:package objclasses import flash.display.MovieClip; import flash.events.Event; / 对象类 public class Obj extends MovieClip / 速度属性 private var speed:Number; function Obj():void speed = 0; this.addEventListener(Event.ENTER_FRAME, onFrameHandler); / 在ENTER_FRAME的
21、响应函数中随机产生一个速度 / 并使对象按照这个速度向下移动 private function onFrameHandler(event:Event):void speed = Math.floor(Math.random() * 3) + 1; this.y += speed; (9)编写代码清单ObjSample.as所示的代码:package objclasses import flash.display.MovieClip; import flash.utils.Timer; import flash.events.TimerEvent; / 对象例子的类 public class O
22、bjSample2 extends MovieClip / 声明一个1秒间隔的Timer实例 private var mytimer:Timer = new Timer(1000); / 声明一个存储对象的数组 private var arrObj:Array = new Array(); / 构造函数中添加TIMER事件,并启动该计时器 function ObjSample2():void mytimer.addEventListener(TimerEvent.TIMER, onTimerHandler); mytimer.start(); / TIMER事件响应函数 / 每秒创建一个新对象
23、,X坐标随机产生 private function onTimerHandler(event:TimerEvent):void var obj:Obj = new Obj(); obj.x = Math.floor(Math.random() * 500) + 25; obj.y = 0; addChild(obj); / 添加到对象数组中 arrObj.push(obj); / 消除Y坐标大于200的对象 for(var i:int=0; i 200) / 从场景中消除 removeChild(arrObji); / 从数组中消除 arrObj.splice(i,1); break; 测试影片可能很多地方没有说清楚。欢迎批评指教。