首页 | 网页设计 | w3c标准 | flash动画 | 平面设计 | 经典文章 | 特约专题 | 资源下载 | 健康频道 | 重庆品牌网站 | 留言簿 | 
技术文章  资源下载 经典素材  社区论坛
   
 您现在的位置: vi设计在线 >> 经典文章 >> 平面设计 >> 设计理念 >> [专题]Flash MX 2004专题 >> 正文  
  Flash制作空战游戏         
[ 作者:佚名    转贴自:本站原创    点击数:1315    更新时间:2007/2/1    文章录入:QQ392398985

减小字体 增大字体

越来越多的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 //生命值为100
score=0; //开始得分为 0
stop( );

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-=speed
if(_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 中的方法或函数,就一定能编写出更出色的作品。

 上一篇文章: 字符串、数值是我们在as应用比较广泛的数据类型
 下一篇文章: Flash常用ActionScript控制语句基本用法
发表评论】【告诉好友】【打印此文】【关闭窗口


技术文章  资源下载
经典素材  社区论坛
 中大型美容美发店老…[1060]
 重庆多达学习俄语培…[2287]
 重庆恒祥广告有限公…[1990]
 重庆市南方阻燃电线…[2401]
 重庆舞美灯光音响有…[3144]
 重庆德鼎滤油机有限…[1908]
 重庆民生建材有限公…[2349]
 重庆集元科技有限公…[4127]
 重庆倍润商贸有限公…[2015]
 重庆腾达展览有限公…[3081]
 帝一网络创始人宣…--[3176]
 重庆vi设计在线祝…--[2739]
 重庆帝一网络书生…--[2854]
 馋嘴鸭的起伏和经…--[2999]
 机器感觉“卡”的…--[2928]
 ActionScript3打造…--[5756]
 在ASP文件中读取H…--[7237]
 vi设计经典案例--[63824]
 帅到掉渣-爆笑版勇…--[7065]
 一个女孩写的经典…--[6826]
没有相关文章
 (只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    没有任何评论
设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 重庆网站建设 | 
版权所有: vi设计在线  © 2005-2018 网站备案序号:渝ICP备06003824号
技术支持:帝一网络(重庆网站建设专家)