用新浪微博登录

只需一步,快速搞定

 找回密码
 立即注册

用新浪微博登录

只需一步,快速搞定

查看: 2492|回复: 3
打印 上一主题 下一主题

Flash飞行游戏制作全解

[复制链接]

该用户从未签到

667

主题

2111

帖子

5570

积分

LV 11.会员

MS爱好者!!!!

积分
5570

社区居民偶尔光临工蜂最爱沙发在线达人社区平民做个有钱人略有小成常驻会员忠实会员

跳转到指定楼层
楼主
发表于 2012-3-15 11:22:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 |          
Flash一直是大家喜欢的交互多媒体开发工具,Flash游戏则以简单、耐玩,而深受用户喜爱。看似复杂多变的Flash游戏,其制作并不难。本文以一款传统的飞行游戏制作为例,说明其制作全过程,相信在你阅读完本文后,也可以通过自己的想象,制作出心仪的游戏来。

  一、飞行游戏制作思路分析
  这是一款相对传统的飞行游戏。它使用上、下、左、右键控制飞机的运行方向,Shift键发射子弹,空格键发射导弹。游戏中共有两种敌机,一号敌机的飞行方向是由下而下,二号敌机是由左至右,两种敌机的飞行轨迹都是弧线的、随机的。
在游戏中我们添加了几组数据,以增加游戏的刺激性。例如,装备库的设计,它可以随机添加一些装备,以供主控飞机使用。这其中包括有子弹的速度、导弹的个数、飞机数量,以及主控飞机的飞行速度。装备库的设计,会大大增加游戏的娱乐性。
  另外,在BOSS敌机的设计中,我们使用了利用弧度换算角度的公式,使BOSS敌机可以发射一种子弹,跟踪主控飞机的坐标。相信在这些设计中,会让大家品尝到不同的数学公式,在游戏制作中的妙用。

  二、游戏界面设计
1.制作开始界面
  每一个游戏都有一个开始界面,供游戏者选择,我们在第1帧中制作游戏的开始界面。启动Flash MX 2004,请在第1帧中加入stop()代码,然后制作一个start按钮,当按钮点击时跳转到下一场景。如图2所示。按钮的内容如下:
  on(press){
  gotoAndPlay("Scene 2",1)
  }

2.制作星空
  按下Shift+F2组合键,打开“场景”面板,点击“+”按钮新增加一个场景,进入场景2,开始游戏的制作。
  将“图层1”更名为scene以制作星空。其实,这些星空都是用圆形绘图工具绘制上去的,它们的大小只有一个或是两个像素,我们可以使用复制,然后再对齐的方式,使它们布满场景。
全选这些亮点,按F8键将其转换成影片剪辑,将这个影片剪辑复制3次,然后放置在一个影片剪辑中,让它们并排向下循环移动即可。

3.变量设置
  新建一个图层,命名为fenshu,使用文本输入工具,在屏幕下方输入:“现在分数:”、“子弹速度”、“子弹类型:”、“导弹数量:”、“飞机速度:”、“飞机数量:”等文字内容。
  新建一个图层,命名为score,在工具箱中点击“文本工具”按钮,然后在“属性”面板中更改其为“动态文本”,在“现在分数:”的后面拖出一个输入框,在“属性”面板中将“变量”更改为score。
使用相同的方法,新建shot_speed图层,在“子弹速度:”后制作一个动态文本框,变量名称为shot_speed。新建一个shot_sty图层,在“子弹类型:”后制作一个变量名为shotsty_txt的动态文本框。新建一个plane_speed图层,在“飞机速度:”后制作一个plane_speed的动态文本框。
  新建missilenum图层,使用绘图工具绘制作如图5所示的图形,选取这些图形按下F8键将其转换成影片剪辑,命名为missilenum_mc,在“属性”面板“实例名称”框中输入“missile_num”。
进入missilenum_mc影片剪辑,在第3、4、5、6帧处按F6建立关键帧,在第6帧处加入stop()代码,然后将第1帧中的导弹全部删去,第2帧保留一个,第3帧保留2个,以此类推。
  回到场景,新建一个plane_num图层,取实例名为“planenum_mc”,依照上一步的方法制作。
回到场景,在第1帧中加入如下代码,新建一个info图层文件夹,将上面的这些图层放置其中:
  score=0
  shot_speed=10
  shotsty_txt="单弹道"
  missilenum=6
  plane_speed=10
  planenum=4
  shot_sty=1
  missile_text=6
  代码说明:
  这里主要是为这些变量赋值,score等于分数,初始值为0,shot_speed等于子弹速度,初始值为10;shotsyt_txt等于子弹类型,开始时它为单弹道;missilenum表示导弹数量,初始值为6;plane_speed表示飞机速度,初始值为10;planenum表示飞机数量,初始值为4;子弹类型的变量等于1;导弹类型的变量等于6。
回复

使用道具 举报

该用户从未签到

667

主题

2111

帖子

5570

积分

LV 11.会员

MS爱好者!!!!

积分
5570

社区居民偶尔光临工蜂最爱沙发在线达人社区平民做个有钱人略有小成常驻会员忠实会员

沙发
 楼主| 发表于 2012-3-15 11:24:59 | 只看该作者
二、主机制作
  1.主机结构
  在场景中新建一个plane图层,使用绘图工具绘制一个飞机。
选中飞机按F8键将其转换成影片剪辑,名称为plane_mc,双击进入该影片剪辑,新建一个图层,绘制一个矩形,如图8所示,按F8键将其转换成影片剪辑,取实例名称为plane_hit,再将透明度降为0。因为Flash的碰撞测试是以矩形为准的,所以,我们绘制矩形影片剪辑,用来碰撞测试。  回到场景,为飞机影片剪辑取实例名称为plane_mc,按F8键转换成影片剪辑,双击进入影片剪辑开始制作,新建一个图层,在第30帧建立关键帧,绘制一个渐淡的红色圆球,将其转换成影片剪辑,名称为plane_bo。如图9所示。  在plane_bo影片剪辑中,第5帧制作它被放大,第10帧缩小变黄,第20帧渐渐消失。新建一个图层,导入音乐文件fx13431_bomb8.mp3,放置在第1帧。双击空白区域回到上一级影片剪辑,
  新建8个图层,分别复制plane_bo影片剪辑,放置在第30帧以后的位置,隔两帧放置一个。等于是让8个爆炸的圆球依次播放,模仿爆炸效果。新建一个图层,在第1帧加入代码:
  plane_mc._y=550
  plane_mc._x=0
  _root.command_bl=false
  _root.hittest_bl=false
  _root.shot_bl=false
  代码说明:
  在第1帧,我们让主控飞机的Y坐标等于550,X坐标等于0,让代表可以被控制的command_bl变量为假,表示在这1帧时,主控飞机不能被控制,hittest_bl敌机的热区检测为假,也就是主控飞机不能被击爆,shot_bl子弹可以发射的变量为假。
  在第2帧加入代码:
  plane_mc._y-=10
  plane_mc._alpha=30
  代码说明:
  主控飞机的Y坐标等于Y坐标减去10,透明度等于30。
  在第3帧加入代码:
  if(plane_mc._y<=0){
  gotoAndPlay(4)
  }else{
  gotoAndPlay(2)
  }
  代码说明:
  当主控飞机的坐标小于等于0时,开始播放第4帧,如果不然,将播放第2帧,实际上等于让飞机以10个坐标的速度递减。
  在第4帧加入代码:
  _root.command_bl=true
  _root.hittest_bl=false
  _root.shot_bl=true
  _root.shot_bl=true
  _root.shot_sty=1
  _root.shot_speed=10
  _root.plane_speed=10
  _root.missile_num.gotoAndPlay(1)
  代码说明:
  在前3帧中,实际是一个让主控飞机飞入场景的动画,而现在,为一些初始变量赋值。
  在第30帧加入代码:
  stop()
  plane_mc._alpha=100
  _root.command_bl=true
  _root.hittest_bl=true
  代码说明:
  在这一帧,我们设置透明度为100,主机可以被控制,碰撞测试也可以开始。
  在第31帧加入代码:
  _root.command_bl=false
  _root.hittest_bl=false
  _root.shot_bl=false
  代码说明:
  如果主控飞机被击爆,那么这个影片剪辑应该开始播放了,主机不能被控制,碰撞测试和子弹都不能发射。
  在第65帧,也就是最后1帧加入代码:
  if(_root.planenum_mc._currentframe<2){
  stop()
  }
  if(_root.planenum_mc._currentframe!=1){
  _root.planenum_mc.gotoAndStop(_root.planenum_mc._currentframe-1)
  gotoAndPlay(1)
  }
  代码说明:
  当根目录下的planenum_mc影片剪辑的当前帧小于2时,本影片剪辑将不再循环播放。如果planenum_mc影片剪辑的当前帧不等于1时,那么代表主控飞机个数的planenum_mc影片剪辑将后退1帧。本影片剪辑将重新开始播放。也就是说,planenum_mc影片剪辑一共有4帧,在正常情况下,本影片剪辑应该也只播放4次,除非有其他的外界程序干扰。

  2.主机飞行控制
  回到场景中,为主控飞机的影片剪辑添加实例名称为plane,在第1帧加入代码如下:
  plane.onEnterFrame=function(){
   if(command_bl){
     if(Key.isDown(Key.LEFT) && plane._x>30){
      plane._x-=plane_speed
     }
     if(Key.isDown(Key.RIGHT) && plane._x<620){
      plane._x+=plane_speed
     }
     if(Key.isDown(Key.UP) && plane._y>30){
      plane._y-=plane_speed
     }
     if(Key.isDown(Key.DOWN) && plane._y<420){
      plane._y+=plane_speed
     }
  }
  代码说明:
  当plane影片剪辑开始播放时,每播放1帧执行一次。
  如果command_bl变量为真时,也就是我们刚才设置的主控飞行开关为真时;当按键中的LEFT键按下,而且plane影片剪辑的X坐标大于30时,plane的X坐标等于它的X坐标减去plane_speed变量,也就是飞机开始向左移动,其他代码效果相同。

  3.子弹发射方法
  回到场景中,新建一个shot图层,在场景的外面,使用绘图工具绘制一个子弹的形状,如图10所示,选中它并按F8键转换成影片剪辑,名称为shot,输入实例名称为shot。  双击进入影片剪辑,在第2帧建立关键帧,放置2个这样的子弹在中心位置。在第3帧放置4个这样的子弹在中心位置。第1帧加入stop()代码,让影片剪辑在开始停止播放。
  回到场景中,给shot对象加入如下代码(注意是给对象加代码,而不是帧),方法是鼠标右键选择子弹对象,选择“动作”命令,然后输入代码。
  onClipEvent(enterFrame){
  this._y-=10+random(_root.shot_speed)
  }
  代码说明:
  当影片剪辑开始播放时,它的Y坐标等于它的Y坐标减去10加上shot_speed的随机数。
  在场景的第1帧,我们刚才主控飞机加控制代码的地方,在第1行加上n=0,在其他按键代码的后面,添加如下代码:
  if(Key.isDown(Key.SHIFT) && _root.shot_bl){
    if(n<50){
     shot.duplicateMovieClip("shot"+n,n+100)
     _root["shot"+n].gotoAndStop(shot_sty)
     _root["shot"+n]._x=_root.plane._x
     _root["shot"+n]._y=_root.plane._y-10
     n++
    }else if(n>=50){
     n=0
    }
   }
  代码说明:
  当按下Shift键时,且shot_bl子弹控制开关为真时;当n小于50时,shot影片剪辑开始复制,一共复制50个,图层深度为N+100;复制品跳转到shot_sty变量所指的那一帧;复制品的X坐标等于主控飞机的X坐标;复制品的Y坐标等于主控飞机的Y坐标减10;N递增;当N大于等于50时,N等于0。
  这段代码实际上就是一个子弹的发射过程,当我们按下Shift键时,影片剪辑就会不断地进行复制,而起始坐标永远都是飞机的坐标,影片剪辑本身的代码中,使它不停的向上运动,就形成了完整的子弹发射过程。

  4.导弹发射方法
  在场景中新建一个图层,命名为missile,使用绘图工具绘制一个导弹,如图11所示,转换成影片剪辑,取实例名为missile,进入影片剪辑开始编辑工作。  在影片剪辑中,再次选取导弹按F8转换成影片剪辑,在第15帧建立关键帧,将导弹的坐标放置在X:0,Y:-175的位置上,从第1帧建立动画,新建一个图层,在第15帧绘制一个爆炸的圆形渐变图,类似飞机爆炸的那种,但要大一些。
  选中该图层,按F8键转换成影片剪辑,在第40、70帧建立关键帧,在第40帧把爆炸效果缩放到特别大,大到你喜欢的程度,然后建立Motion运动。
  新建一个图层,导入音乐文件fx13443_explomed.mp3放在第1帧,在第1帧加入如下代码:
  stop()
  this._x=5000
  this._y=5000
  代码说明:
  在第1帧停止播放,影片剪辑的X坐标和Y坐标等于5000。
  回到场景中,在主控飞机的代码中,加入如下代码:
  if(Key.isDown(Key.SPACE) && _root.missile._currentframe==1 && shot_bl){
     if(missile_text>1){
     missile.play()
     missile._x=plane._x
     missile._y=plane._y
     missile_text--
     missile_num.gotoAndStop(missile_text)
     }
    }
  代码说明:
  当按下空格键时,且missile影片剪辑的当前帧等于1,当shot_bl子弹开关为开时;当missile_text变量大于1时;导弹影片剪辑开始播放;导弹影片剪辑的坐标等于主控飞机的坐标; Missile_num也就是我们最初制作的导弹数量的影片剪辑跳转到missile_text变量的位置。
回复 支持 反对

使用道具 举报

该用户从未签到

667

主题

2111

帖子

5570

积分

LV 11.会员

MS爱好者!!!!

积分
5570

社区居民偶尔光临工蜂最爱沙发在线达人社区平民做个有钱人略有小成常驻会员忠实会员

板凳
 楼主| 发表于 2012-3-15 11:25:32 | 只看该作者
三、制作装备彩蛋
  回到场景中,新建一个图层,命名为brand,使用绘图工具绘制如图12所示的内容。转换成影片剪辑。  把这个图形放置在Y:1000,然后进入影片剪辑编辑,选取文字内容,按F8键转换成影片剪辑,命名为brand_mc,取实例名为brand_mc。
  进入brand_mc影片剪辑,在第1帧输入内容“子弹加速”,在第2、3、4、5帧分别输入内容“子弹样式”、“飞机加速”、“增加飞机”、“增加导弹”。在第1帧加入gotoAndStop(random(5)+1) 代码,让影片剪辑直接跳转到相应的帧。
  回到场景中,选取这个装备图标,为对象加入代码,记得吗?在子弹制作中,我们已经给对象加过代码了:
  onClipEvent(enterFrame){
   this._y+=5
   if(this._y>=3000){
     this._y=-1000
     this._visible=1
   }
   if(this._y<=-100){
     this.brand_mc.gotoAndPlay(1)
     this._x=random(650)
   }
   if(this.hitTest(_root.plane)){
     this._visible=0
     this._y+=200
     if(this.brand_mc._currentframe==1){
     _root.shot_speed=_root.shot_speed+10
     }
     if(this.brand_mc._currentframe==2 && _root.shot_sty<4){
      _root.shot_sty+=1
      if(_root.shot_sty==2){
       _root.shotsty_txt="双弹道"
      }else if(_root.shot_sty==3){
       _root.shotsty_txt="四弹道"
      }
    }
    if(this.brand_mc._currentframe==3){
      _root.plane_speed+=1
    }
    if(this.brand_mc._currentframe==4 && _root.planenum_mc._currentframe<5){
    _root.planenum_mc.gotoAndStop(_root.planenum_mc._currentframe+1)
    }
    if(this.brand_mc._currentframe==4 && _root.planenum_mc._currentframe==4){
     _root.score+=2000
    }
    if(this.brand_mc._currentframe==5 && _root.missile_num._currentframe<6){
    _root.missile_num.gotoAndStop(_root.missile_num._currentframe+1)
   }
  }
  }
  代码说明:
  当影片剪辑开始播放时,它的坐标等于它的坐标加上5。当它的坐标大于等于3000时,它的坐标等于负1000,它的显示参数为可视。当它的坐标等于负100时,它影片剪辑中的brand_mc也就是刚才制作的文字影片剪辑开始播放第1帧,实际上也就是跳转到任意一帧,它的X坐标等于650的随机数,等于是屏幕的任意位置。
  当它碰撞到主控飞机时,它的显示为假,也就是说它变得不可见,同时它的坐标加上200。当它的brand_mc影片剪辑的当前帧等于1时,shot_speed子弹速度等于再加上10。
  当它的brand_mc影片剪辑的当前帧等于2而且子弹样式小于4时,子弹样式等于再加上1,如果子弹样式等于2,那么shotsyt_txt动态文本就显示双弹道,如果等于3就显示四弹道。如果它的brand_mc影片剪辑的当前帧等于3,那么plane_speed飞机速度就等于再加上1,如果它的brand_mc影片剪辑的当前帧等于4而且planenum_mc的当前帧小于5,那么planenum_mc影片剪辑的当前帧等于再加上1帧,这样就等于增加了一个主控飞机。
  如果它的brand_mc影片剪辑的当前帧等于4而且planenum_mc的当前帧等于4,也就是说主控飞机已经满了,那么就加上2000分。如果它的brand_mc影片剪辑的当前帧等于5而且missile_num导弹数量的当前帧小于6,那么就增加一个导弹。
回复 支持 反对

使用道具 举报

该用户从未签到

667

主题

2111

帖子

5570

积分

LV 11.会员

MS爱好者!!!!

积分
5570

社区居民偶尔光临工蜂最爱沙发在线达人社区平民做个有钱人略有小成常驻会员忠实会员

地板
 楼主| 发表于 2012-3-15 11:26:42 | 只看该作者
四、制作敌机
  1.一号敌机制作方法
  新建一个图层,命名为enemy_a,绘制一个如图13所示的敌机,选中该敌机按F8键,转换成影片剪辑,名称为enemya_mc,实例名也是enemya_mc,双击进入影片剪辑。  在第1帧加入代码stop(),让影片停止播放,新建一个图层,在新图层的第2帧制作一个爆炸的效果,在最后帧加入如下代码,这等于删去上一级影片剪辑,而分数再加上100。
  removeMovieClip(_parent._parent)
  _root.score+=100
  再次新建一个图层,在第2帧放入fx13431_bomb8.mp3音乐文件,记得要使用stream数据流的方式,双击空白区域回到场景。
  在场景中选中该影片剪辑,放置在场景以外的左上角,再次按F8键转换成影片剪辑,名称为enemya_eft,实例名为enemy_a,进入影片剪辑,在图层1上加入一个引导图层,使用绘图工具绘制一条曲线,如图14所示。  将两个图层都延缓到第60帧,将第1帧的敌机放置在引导线的起始,在最后1帧将敌机放置到引导线的结尾,建立Motion动画,在最后1帧加入removeMovieClip(_parent)代码,删去上一级影片剪辑。这也就是说,无论敌机是被击爆的,还是飞行结束,它都将消失,所不同的就是加不加分而已。

  2.一号敌机的复制方法
  回到场景,选中敌机按F8键转换成影片剪辑,名称为enemya,实例名称为enemy_a,选取后再次按F8键转换成影片剪辑,名称为enemy_a,实例名称为enemya。双击进入影片剪辑。
  在第10帧按F5键,新建一个图层,在第1帧,加入代码:
  enemya_i=0
  enemya_max=10
  enemya._visible=0
  代码说明:
  Enemya_i变量等于0,enemya_max变量等于10,而敌机为不显示。
  在图层2的第2帧加入代码:
  if(enemya_i<ENEMYA_MAX){< p>
   enemya.duplicateMovieClip("enemya"+enemya_i,enemya_i)
   this["enemya"+enemya_i]._x=random(650)
   this["enemya"+enemya_i]._y=enemya._y-random(200)+100
   enemya_i++
  }
  if(enemya_i>=enemya_max){
  enemya_i=0
  }
  代码说明:
  当enemya_i变量小于enemya_max时,Enemya影片剪辑开始复制,复制品的X坐标等于650的随机数,复制品的Y坐标等于敌机的Y坐标减去200的随机数再加上100;Enemya_i变量递增;当enemya_i变量大于等于enemya_max变量时,它的值为0。
  在第10帧加入代码gotoAndPlay(2),这样就可以完成复制,让每10帧,就复制一个敌机。

  3.一号敌机碰撞测试
  右键点击敌机,选择“动作命令”,为对象加入如下代码:
  onClipEvent(enterFrame){
   if(this.hitTest(_root.plane.plane_mc.plane_hit)){
     this.enemy_a.enemya_mc.play()
     this.enemy_a.enemya_mc._x=this.enemy_a.enemya_mc._x
     this.enemy_a.enemya_mc._y=this.enemy_a.enemya_mc._y
     _root.plane.play()
   }
   if(this.hitTest(_root.missile)){
     this.enemy_a.enemya_mc.play()
     this.enemy_a.enemya_mc._x=this.enemy_a.enemya_mc._x
     this.enemy_a.enemya_mc._y=this.enemy_a.enemya_mc._y
    }
   for (j = 1; j<50; j++) {
     if (this.hitTest(_root["shot"+j])) {
      this.enemy_a.enemya_mc.play()
      this.enemy_a.enemya_mc._x=this.enemy_a.enemya_mc._x
      this.enemy_a.enemya_mc._y=this.enemy_a.enemya_mc._y
     }
   }
  }
  代码说明:
  当敌机影片剪辑开始播放时执行;当敌机碰撞到主控飞机时,enemy_a影片剪辑中的enemya_mc影片剪辑开始播放,也就是爆炸动画。此时它将不再移动,主控飞机也将爆炸。当它碰撞到导弹时,它的爆炸动画开始播放,它的坐标也将不会再运动了。当j=1,而且j小于50时,j递增,这句实际上是每帧执行50次的一个代码,也就是子弹的碰撞测试,因为子弹是使用的复制品,实例名称有50个,所以,以下代码有点变化,当它碰撞到“"shot"+j”这个数组时,也就表示它碰撞到50个子弹中任意的一个时,它的爆炸动画开始播放。

  4.二号敌机制作方法
  二号敌机与一号敌机制作方法基本相同,依照相同的方法,我们制作一个enemy_b的影片剪辑,绘制的敌机如图15所示。  依照与一号敌机相同的制作步骤制作,区别仅仅是引导线,如图16所示。它将从左侧按弧线飞行到右上角。  二号敌机的碰撞代码也与一号敌机相类似,可以参考一号敌机,也可以对照源程序。在场景中,二号敌机的实例名称为enemyb。在二号敌机的第1帧加入代码stop(),因为这个敌机在一开始的时候,并不会出现,等到分数值到了一定程度,才会出现。
  回到场景中,我们在主控飞机的代码中,加入如下代码:
  if(score>=10000){
     enemyb.play()
   }
   if(score>=20000){
     gotoAndStop(2)
   }
   if(_root.planenum_mc._currentframe<2){
     gotoAndStop(3)
   }
  代码说明:
  当分数大于等于10000时,二号敌机开始播放,当分数大于等于100000,场景跳转到第2帧,当飞机数量的影片剪辑当前帧小于2时,场景跳转到第3帧。

  5.BOSS敌机子弹制作
  现在开始制作BOSS敌机了,先来制作一些准备工作,导入f8f158.mp3音乐文件。在“库”面板中,右键选取该音乐文件,选择“链接”命令,在出现的对话框中选择“为动作脚本导出”选项,在输入框中输入sound2,将这个音乐文件输出。
  在主控飞机的代码中,第1行,加入如下代码:
  mysound=new Sound()
  mysound.attachSound("sound2")
  mysound.start(0,10000)
  代码说明:
  Mysound是新的音乐对象,这个音乐对象将绑定sound2音乐文件,而且它开始播放10000遍。
  新建一个图层,名称为foeshot。绘制一个椭圆形的渐变在场景中,这其实就是敌机的子弹。它的坐标是X:0,Y:0。如图17所示。  双击进入影片剪辑,将坐标调整为0,再次转换成影片剪辑,在第125帧建立关键帧,将其的坐标调整为X:800,Y:0,在第1帧建立动画,在最后1帧加入removeMovieClip(this)代码,让它删除自己。
  双击空白区域,回到上一级影片剪辑,为子弹效果起实例名称为foeshot,新建一个图层,在第1帧加入如下代码,变量foe_i等于0,foe_max等于10,而子弹的显示参数为0。影片剪辑停止播放。
  foe_i=0
  foe_max=10
  foeshot._visible=0
  stop()
  在第2帧加入如下代码:
  if(foe_i<FOE_MAX){< p>
  foeshot.duplicateMovieClip("foeshot"+foe_i,foe_i)
  this["foeshot"+foe_i]._x=_root.boss.boss_mc._x+_root.boss.boss_mc._width/2
  this["foeshot"+foe_i]._y=_root.boss.boss_mc._y+_root.boss.boss_mc._height
  this["foeshot"+foe_i]._rotation=(180/Math.PI)*Math.atan2((_root.plane._y-this["foeshot"+foe_i]._y),(_root.plane._x-this["foeshot"+foe_i]._x))
  foe_i++
  }
  if(foe_i>=foe_max){
  foe_i=0
  }
  代码说明:
  当foe_i小于foe_max时,子弹开始复制,这些复制品的X坐标等于BOSS飞机中的BOSS飞机影片剪辑的宽度除以2,复制品的Y坐标等于BOSS飞机的高度,而复制品旋转的角度,套用一个弧度换角度的几何公式,正好跟随着主控飞机的坐标,foe_i递增。当foe_i大于等于foe_max时,它等于0。
  给子弹的对象加入如下代码:
  onClipEvent(enterFrame){
   if(this.hitTest(_root.plane.plane_mc.plane_hit)){
     this.gotoAndStop(125)
    _root.plane.play()
   }
   if(this.hitTest(_root.missile)){
     this.gotoAndStop(125)
     }
  }
  代码说明:
  当影片开始播放时执行,如果子弹碰撞到主控飞机,那么它将直接跳转到第125帧,如果它碰撞到导弹就删去自己。

  6.BOSS敌机碰撞测试
  回到场景中,绘制一个敌机,如图18所示。转换成影片剪辑BOSS,实例名相同,在影片剪辑中尽量把它缩放的大一些,然后选取按F8转换成影片剪辑,命名为boss_mc,实例名相同。
  在boss_mc影片剪辑,制作BOSS主机的爆炸动画,可以同一号敌机的爆炸差不多,在第1帧加入stop()代码,在第2帧加入_root.foe.gotoAndStop(1)代码,双击回到上一级影片剪辑,制作一段动画,让它循环左右移动,在开始移动的这一帧加入_root.foe.play()代码,让子弹程序开始播放。
  回到场景中,在第2帧加入如下代码:
  _root.bosslife=5000
  _root.boss.onEnterFrame=function(){
   for(i=0;i<50;i++){
   if(_root.boss.boss_mc.hitTest(_root["shot"+i])){
     _root.bosslife--
     _root["shot"+i].removeMovieClip()
   }
   }
   if(bosslife<=0){
     _root.boss.stop()
     _root.boss.boss_mc.boss_eft.play()
   }
   if(_root.boss.boss_mc.hitTest(_root.missile)){
     _root.bosslife--
   }
  }
  代码说明:
  Bosslife变量等于5000;当影片开始播放时执行代码;i等于0时,i小于50时,i递增;当BOSS主机碰撞到主控飞机的子弹时,Bosslife开始递减,也就是BOSS主机的生命开始递减;而子弹将被删去;当bosslife的值小于等于0时,BOSS影片剪辑停止播放,也就不再移动,而BOSS主机的爆炸动画将开始播放。当BOSS主机碰撞到导弹时,它的生命也将递减。
  在场景中第3帧加入stop()、stopAllSounds()代码,停止所有音乐,使用文字输入工具输入GAME OVER字样,再制作一个按钮,按钮内容为:
  On(press){
  gotoAndPlay("Scene 1",1)
  }
  让游戏回到开始界面。
  至此,该游戏基本制作完成,虽然它看起来只像是一个雏形,但却已经具备了一个小型游戏的全部功能。通过这个游戏的制作,你可能已经能够感受到,制作大型游戏,无非就是在这样的代码基础上,增加更多的内容和场景,以及人物,声音,动画,效果等。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

     
    Archiver|手机版|小黑屋|( 沪ICP备12034951号 )

GMT+8, 2024-4-28 18:05 , Processed in 0.127267 second(s), 28 queries .

© 2001-2011 Powered by Discuz! X3.1

快速回复 返回顶部 返回列表