FL的空战游戏分析

来源:互联网 发布:ubuntu grub-efi 编辑:程序博客网 时间:2024/05/17 04:35

越来越多的Flash爱好者已经不满足仅仅去欣赏别人制作的Flash,而是希望自己也能投入到Flash制作者的行列,成为一个Flash高手。今天,我们就用一个游戏实例让广大的Flash爱好者了解一下Flash在制作游戏时的基本思路和方法,文章末尾提供.fla原文件下载。

今天我们要做的是一个战斗机攻击敌机的游戏,启动游戏后,单击“start”按钮,游戏开始。用键盘的方向键控制战斗机,按空格键发射子弹摧毁敌机,每摧毁一架战斗机都会加上适当分数,如果分数大于500,就会胜利完成游戏。游戏中要控制战斗机不能被敌机发射的炮弹击中,也不能与飞来的敌机碰撞,否则每碰撞或击中一次都会减少战斗机的生命值,生命值小于0时,游戏失败,退到初始画面。


下面我们分别从思路、元件制作、代码控制几个方面介绍这个小游戏的制作过程。

一、所用的函数和方法

这个游戏的制作思路来自于Flash中的hittest方法,hittest方法主要用于侦测“空间”的交迭,它有两种方法:

mymovieclip.hittest(x,y,shapeflag);mymovieclip.hittest(target);

mymovieclip.hittest(x,y,shapeflag):比较x和y坐标是否与mymovieclip实体交迭,shapeflag可以取两个值true和false,取true,则x,y坐标只要与mymovieclip实体(不含边界)的任何一点交迭,函数就返回true,否则返回false。若shapeflag值取false则x,y坐标只要与mymovieclip实体(含边界)的任何一点交迭,函数就返回true,否则返回false。

mymovieclip.hittest(target):比较target代表的实体和本mymovieclip实体是否交迭,交迭函数返回true,否则返回false。游戏中将使用这种方法。

在游戏中还有几个比较重要的语句:duplicatemovieclip方法和Removemovieclip方法以及Attachmovie方法。

Duplicatemovieclip方法是在主场景中(或在其他影片剪辑中)制作一个影片剪辑实体的复制件,这个复制件将会以某个深度值(深度值高的对象覆盖深度值低的对象)放置在其源实体上。

Removemovieclip方法是删除影片剪辑实体的复制件,不能删除在剪辑时手工放置在舞台上的实体。

Attachmovie方法几乎和duplicatemovieclip方法完全相同,但是它不需要在舞台上事先放置一个实体共选择,而可以直接从库中取出一个影片剪辑实体。本例中战斗机发出的子弹是通过这种方法实现的,而敌机发出的子弹是事先在舞台上放一个剪辑,也就是用duplicatemovieclip来复制的。

二、元件的制作

1.新建一个场景“场景1”,选择“修改”菜单的“文档”选项,在弹出的文档属性对话框中背景色修改为黑色,尺寸就用默认的550*400,帧频为50 fps。

2.建立一个影片剪辑(以下简称MC),命名为“plane”,这个影片剪辑是作为用来控制的战斗机的。在该影片剪辑中的第一帧中插入一个关键帧,在编辑区中画一个飞机图形,也可以插入一个飞机矢量图。第一帧的帧动作为“stop()”。在第二帧处插入空白关键帧,画上一个矩形,矩形要比战斗机小很多。然后在第六帧中插入空白关键帧,画一个爆炸图形,在属性面板设置第二帧到第六帧的补间动作为“形状”,第六帧的帧动作为“gotoAndPlay(1)”。

3.新建一个MC元件“fire”,第一帧是一个空白关键帧,第二帧插入一个关键帧,画一个椭圆作为“plane”发出的用来射击的炮弹,帧动作为“stop()”。

4.新建一个MC元件“bullet”,把“fire”剪辑拖入编辑区中央,剪辑名称为“fire”,帧动作“stop()”。该剪辑编辑好后,在影片库中会出现其选项,用鼠标右击“bullet”选项,在弹出的快捷菜单中选择“链接”,标识符为“laser”,并勾选“为动作脚本输出”。

这是关键步骤,因为要用attachmovie调用库剪辑进行复制,如果没有这一步,attachmovie就无法中库中复制出剪辑,游戏运行时“plane”也将无法发出炮弹射击。然后在bullet剪辑中给“fire”设置动作代码:

onClipEvent (load) {//载入时发生动作  n=_root.enemyNumber;//画面中的敌人飞机数量赋值给n  speed=10//speed初始值为0}onClipEvent (enterFrame) {//进入帧时发生    for(i=0;i<n;i++){     if(_root["new"+i].ship1._currentframe==1){ //画面中的敌机是不是在其首帧     if(this.hitTest(_root["new"+i])) {//判断该剪辑是不是与画面中复制出的敌机交迭      _root.score+=10  //如果交迭,生命值加10      _root["new"+i].ship1.gotoAndPlay(2);  //敌机爆炸      removeMovieClip (_parent) ;//从场景中删除剪辑    }  }  if (_parent._x<=550) { //如果x坐标小于550 ,x坐标加变量speed 的值    _parent._x += speed;    } else {//如果x坐标大于550,则删除剪辑    removeMovieClip (_parent);  }}

6.新建MC命名“explode”。在第一帧中画一个方形,然后在第五帧中插入空白关键帧,在该帧中用铅笔工具画一个爆炸图形,然后回到第一帧,在属性面板中设置该帧到第五帧的补间动作为“形状”。最后在第六帧插入一个空白关键帧,该帧设置命令“stop()”。如下图所示:

7.建立MC元件“enemyplane”。在第一帧中画一个敌人飞机,并在时间轴上设置命令“stop()”,在第二帧插入空白关键帧,将刚才的explode剪辑拖入enemyplane剪辑中原来飞机的位置,在时间轴第二帧也设置stop()。

8.新建MC元件“enemy”,将enemyplane元件拖入第一帧,剪辑名称为ship1,帧动作为stop()。

9.接下来该做敌人发出的炮弹了,新建MC元件“ball”,在编辑区画上一个椭圆,大小要合适,因为这是用做游戏中发出的炮弹的。

10.最后新建两个按钮元件,一个“start”,另一个是“exit”。.

三、代码控制

1.回到主场景,把第一个图层改名为“start”,在第一帧中插入关键帧,帧动作为:

function clean() {  for (i in _root) {    _root[i].removeMovieClip();  }}_root.clean();stop();

clean函数用来删除所有多余的影片剪辑,它的功能在第一次运行时没有作用,而在游戏运行后,“plane”的生命值为零时返回这一帧,如果没有clean函数,将出现无数个被复制的影片剪辑。

2.把“start”按钮和“exit”按钮拖入场景中,“start”按钮的动作脚本为

on(release){ //释放鼠标时进入第三帧,开始游戏  gotoAndPlay(3);}

“exit”按钮的动作脚本为

on (release) { //释放鼠标时,退出游戏  fscommand("quit", "1");}

3.添加第二层,命名为“victor”,在该层第二帧中插入关键帧,在场景中用文字工具写入“you win”,设置字号为84,颜色为黄色。也插入“start”和“exit”按钮,动作脚本同上。

4.添加第三层,命名为“action”,在该层第三帧插入关键帧,写入代码如下:

enemyNumber=5 //每次画面中出现五个敌人for(i=0;i<enemyNumber;i++) { //如果画面中敌人数小于五,则复制出敌人的影片剪辑  duplicateMovieClip("enemy","new"+i,30+i)}life=100 //生命值为100score=0; //开始得分为 0stop( );

5.在该帧场景中添加两个静态文本框和两个动态文本框,用来表示生命值和得分。静态文本框内的内容分别是“生命”和“得分”,第一个动态文本框命变量值为life,第二个动态文本框的变量值为score。

6.再增加两个图层,一个命名为 “plane”,一个命名为“enemy”,并分别在第三帧插入关键帧。选中“plane”层的第三帧,把“plane”拖入,剪辑名称为“ship”。选中“enemy”层的第三帧,把“enemy”和“ball”剪辑拖入,剪辑名称分别为“enemy”和“enemylaser”。

右击“plane”剪辑,在动作面板里写入代码

onClipEvent (load) {  //载入时进行初始化  speed=6;  sy=_y;  ang=0;}onClipEvent (enterFrame) {  _y = sy + 4 * Math.cos(ang+=0.092); //用cos函可以是飞机有在空中飘动的效果  c=_root.score; //给c 变量赋值,初试状态为“0”  if(c>=500){ //如果c的值(得分)大于500,则胜利结束游戏    _root.gotoAndStop(2);  }                        if(_root.life<=0){ //如果生命值小于0,则重新开始游戏或退出    _root.gotoAndStop(1);  }  //当玩家按下上、下、左、右方向键时,飞机可以移动  if (Key.isDown(Key.down)and _y<400) {_y += speed; sy+=speed}  if (Key.isDown(Key.up) and _y>0) {_y -= speed; sy-=speed}  if (Key.isDown(Key. right) and _X<550) {_x += speed;}  if (Key.isDown(Key.left) and _X>0) {_x -= speed;}  if (Key.isDown(Key.space)) {//当按下空格键时,飞机开火,用了一个变量a,  //使每按一下空格发出一发炮弹,如果不设置这个变量,那么当按下空格键时,炮弹将连续飞出。   if (!a) { /如果a为false    shotCount++;     depth=(shotCount%100)+100;    _root.attachMovie("laser", "sparo"+shotCount,depth); //attachmovie方法是从库中直接调用复制影片剪辑“fire”,它的标识符为“laser”。    _root["sparo"+shotCount]._x = this._x+(_width-45)    _root["sparo"+shotCount]._y = this._y;  //复制出的“fire”剪辑的初试位置。  a = true;    }  } else {a = false;}}

7.右击“enemy”剪辑,在“动作”面板里设置代码

onClipEvent (load) {  sy=random (400)+10; //取随机数  function reset(){    ship1.gotoAndStop(1);    speed=random(10)+2; //敌机的飞行速度是一个随机数    _y= random(300)+_height; //敌机的初始y坐标取随机数    _x= 550+_y;    _root.firePower=100 ;  }  reset()}onClipEvent (enterFrame) {  if(this.ship1._currentframe==1){ //敌机剪辑在第一帧    _y = sy + speed * Math.cos(speed+=0.032); //敌机飞行时有浮动的效果    if(this.hitTest(_root.ship)){ //如果该剪辑与战斗机相撞    ship1.gotoAndStop(2); //敌机爆炸    _root.ship.play();      _root.life-=10; //生命值减10  }  if(random(_root.firePower)+1==10){    Count++;    depth=(Count%100)+200;//敌机飞行时发出炮弹    duplicateMovieClip(_root.enemyLaser, "num"+Count,depth);     //炮弹的初始坐标就是敌机当前所在位置的坐标    _root["num"+Count]._x=this._x-40    _root["num"+Count]._y=this._y    }}_x-=speedif(_x<-10) { reset()}}

8.右击“ball”剪辑,在“动作”面板里设置代码

onClipEvent (load) {  speed=15;}onClipEvent (enterFrame) {  if(!_root.shipDead){ //如果战斗机的生命值大于0    if(this.hitTest(_root.ship)){ //敌机发出的炮弹击中战斗机      _root.ship.play();      _root.life-=5; //生命值减5      removeMovieClip (this)  }  _x-=speed;  if(_x<-10 ) {removeMovieClip(this)}  }}

四、总结

至此,整个游戏就全部完成了。在以上过程中,为了讲解尽可能的简洁,我没有讲述插入音效的过程,实际上插入的方法也是很简单的,只要把合适的声音放到合适的帧中就可以了。

其实用Flash制作这样的简单小游戏并不困难,只要大家能灵活运用Flash 中的方法或函数,就一定能编写出更出色的作品。 .fla原文件下载

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝假货下架了怎么办 淘宝不让发布本地生活服务了怎么办 淘宝删除差评后店家不返现怎么办 天猫店家迟迟不发货怎么办 淘宝下单后店家说缺货怎么办 用淘宝把话费冲到空号上怎么办 d速快递没有网点怎么办 京东买的货没收到怎么办 淘宝物流显示已揽件就是不动怎么办 淘宝查不到物流信息怎么办 快递物流信息更新错怎么办 淘宝上查不到物流怎么办 微信买的东西不给退怎么办 微信购物已收货怎么办 微信买东西不退怎么办 银行经营贷款资金回流怎么办 淘宝有运费险换货怎么办 淘宝有运费险的换货怎么办 淘宝换货一直不发货怎么办 淘宝申请换货卖家不发货怎么办 淘宝买家泄露卖家信息怎么办 高仿苹果没内存怎么办 高仿苹果7太卡怎么办 天猫客服处理不了怎么办 美团顾客电话打不通怎么办 美团众包顾客电话打不通怎么办 天猫退货商家拒绝退款怎么办 中关村买电脑被骗了怎么办 在闲鱼被买家骗了东西怎么办 在手机店买手机被骗怎么办 买手机分期付款被骗了怎么办 买电脑被骗了怎么办啊 小米卡puk锁了怎么办 红米3x电池松动怎么办 实体店买到苹果翻新机怎么办 小米手环2米粒掉怎么办 小米字体下架了怎么办 京东白条被锁定怎么办 苹果6splus很卡怎么办 苹果6s卡槽坏了怎么办 在京东买的电脑没发票怎么办