Flash制作飞行游戏

Flash制作飞行游戏
爱老虎油敬献
Flash一直是大家所喜欢的交互多媒体开发工具,在以前,我写过一些教程,让大家认识到Flash在互动网站开发方面的先天优势,而现在,我教大家使用Flash制作一个简单的飞机游戏,这个类似早期八位电脑上运行的游戏,虽然已经很难找到自己的立足之地,但是我想,对于想要从事网络游戏开发的朋友来说,还是一个入门的好方法,而且,这种小型的桌面游戏即可以放到网上,或者还可以移植到手机上,我们开始吧。
制作思路

首先,这是一款相对传统的飞行游戏,它出现在星空中,这样使它看起来更像是星球之间的战争。它可以使用上下左右键来控制飞机的坐标,然后按Shift键,就可以发射子弹,这些子弹打击到敌机上,就可以引爆敌机。而敌机如果碰撞到我们控制的飞机,也可以引爆我们的飞机。1号敌机是不会发射子弹的,但它们的飞行轨迹不是一成不变的,它们自上而下,使用弧线的飞行轨迹。打爆1个敌机可以得到100分,如果分数达到10000分以后,就会出现2号敌机,2号敌机依然不可以发射子弹,但它们的飞行轨迹不再是自上而下,而是从屏幕的左下侧转一个弧线向上飞行,这样对我们躲避敌机造成很大的障碍,同样,引爆1个2号敌机,可以得到1000分。如果我们得到100000分,就可以引出BOSS敌机,BOSS敌机不是一枪可以了结的,你必须攻击它5000次,才可以引爆它,引爆它之后,也就结束了我们的游戏。
在游戏中,我们使用了几组不同的数据,来让游戏更加刺激一些,比如,我们除了有分数值以外,还对子弹速度进行了设计,这个子弹速度并不是真正的子弹发射的速度,因为受到碰撞测试和帧速率的影响,这个速度只是一个简单的随机数,让每一个子弹的发射时速度不同,使子弹发射时更加的层次感。我们还设计了三个子弹的类型,单弹道和双弹道,还有四弹道。在导弹方面我们设计每一个飞机有六个导弹可供发射,而整个游戏的飞机,有四个。我们使用一种装备彩蛋的方式来让主控飞机可以有机会更改自己的这些装备。
看到这些介绍可能你已经头脑发胀了,不过不用着急,在制作中,我会将这些内容制作成单独的MC影片剪辑,等于是把每一个功能都独立起来,不但可以独立运行,还可以放置在别的游戏制作中,比如对于键盘控制的内容,就可以放之四海皆准。
Loading程序制作
1. 打开Flash MX 2004,新建一个文件,在Properties面板中设置影片的属性为黑色,每秒24帧,影片宽为650,高度为500。因为我们考虑到此游戏也许会放在网上,所以还是有必要制作这个Loading程序的,好在这个预载程序不会太复杂,因为这段代码我已经将它简化了,如果你很难看明白程序的话,只需要将这些代码一字不漏的输入到你影片的第1帧,
2. 将Layer 1更名为loading,打开Action面板输入以下内容。
stop()
_root.createEmptyMovieClip(“LoadingMc”,100)
with(_root.LoadingMc){
beginFill(0xFF0000)
moveTo( 0, 10 );
lineTo( 0, 0 );
lineTo( 350, 0 );
lineTo( 350, 10 );
lineTo( 0, 10 );
}
LoadingMc._x=100
LoadingMc._y=200
_root.createTextField(“LoadingText”,101,100,220,30,20)
LoadingText.border=false
LoadingText.multiline = true;
LoadingText.wordWrap = true;
LoadingMc.onEnterFrame=function(){
if(_root.getBytesLoaded()>=_root.getBytesTotal()){
_root.play()
_root.LoadingMc.removeMovieClip()
_root.LoadingText.removeTextField()
}else{
_root.LoadingMc._xscale=(_root.getBytesLoaded()/_root.getBytesTotal())*100
_root.LoadingText.text=int(LoadingMc._xscale)+”%”
_root.LoadingText._x=LoadingMc._width+100
}
}
代码解读:
第一行,在第一帧,我们设置影片停止播放,也就是stop()指令,因为在这里,我们需要制作一个Loading预载程序;
第二行,在_root根目录下,建立一个空的影片剪辑,它的名称为LoadingMc,它的层深为100;
第三行,我们选中LoadingMc,指定以下{}的程序,是针对LoadingMc的;
第四行,我们在LoadingMc中开始绘画,为要绘制的矢量图填充一种色彩,色彩代码为0xFF0000,也就是红色;
第五行,为这个要建立的矢量图指定一个注册点,位置在LoadingMc影片剪辑中X:0,Y:10;
第六行,绘制一段线条,位置是X:0,Y:0;
第七行,绘制一段线条,位置是X:350,Y:0;
第八行,绘制一段线条,位置是X:350,Y:10;
第九行,绘制一段线条,位置是X:0,Y:10;
第十行,整段代码完成,实际上,就是绘制了一个350像素长度,10个像素宽的一个矩形;
第十一行,LoadingMc影片剪辑的X坐标等于100;
第十二行,LoadingMc影片剪辑的Y坐标等于200;
第十三行,在根目录下,建立一个动态文本,它的名称为LoadingText,它的层深为101,它的X坐标等于100,Y坐标等于220,宽度为30,高度为20;
第十四行,LoadingText文本不使用加粗字体;
第十五行,LoadingText文本可以是多行文本;
第十六行,LoadingText文本可以自动换行;
第十七行,当LoadingMc影片剪辑开始播放时,每播放一帧,执行一次以下代码;
第十八行,当根目录下的已经下载的字节数,大于等于影片的总字节数时;
第十九行,根目录开始播放;
第二十行,删去LoadingMc影片剪辑;
第二十一行,删去LoadingText文本;
第二十二行,如果第十八行的条件不成立;
第二十三行,那么,LoadingMc影片剪辑的X弦,就是影片剪辑宽的百分比值,等于已经下载的字节数,除以总字节数的值,乘以100;
第二十四行,LoadingText文本的文字内容为LoadingMc的宽度显示比例,取整以后,再加上%号;
第二十五行,而LoadingText文本的X坐标,等于LoadingMc宽度比例加100。
整体代码讲解完毕。这是一个非常有趣的代码,因为这段代码可以适应几乎大部份影片,除非你的影片宽度小于450,否则你都可以使用这段代码。使用的方法也很简单,只需要把这段代码粘贴在影片的第1帧,就可以使用了。
3. 在第2帧制作游戏的开始界面,当然你可以像我一样制作的很简单,但是,请在第2帧中加入代码stop(),然后制作一个start按钮,按钮的内容为:
on(press){
gotoAndPlay(“Scene 2″,1)
}
代码解读:
当点击按钮时,跳转到场景2的第1帧,开始播放。

4. 打开场景面板,点击加号新增加一个场景,然后我们进入场景2,开始游戏的制作。

星空及变量设置
1. 进入场景2后,将Layer1更名为scene,我们来制作星空,其实这些星空是我用圆形绘图工具绘制上去的,它们的大小只有一个像素,或是两个像素,我们可以使用复制,然后再对齐的方式,使它们布满场景。

2. 全选这些亮点,按F8键转换成影片剪辑,将这个影片剪辑复制三次,然后放置在一个影片剪辑中,让它们并排向下的循环移动,星空场景就制作完成了。
3. 新建一个图层,名称为fenshu,使用文本输入工具,在屏幕下方输入文字内容,“现在分数:”,“子弹速度”,“子弹类型:”,“导弹数量:”,“飞机速度:”,“飞机数量:”。

4. 新建一个图层,名称为score,使用动态文本,在“现在分数:”的后面拖出一个输入框,在Properties面板中将变量名称输入为score。

5. 使用相同的方法,新建shot_speed图层,在“子弹速度:”后面,制作一个动态文本框,变量名称为shot_speed。新建一个shot_sty图层,在“子弹类型:”后面制作一个变量名为shotsty_txt的动态文本框。新建一个plane_speed图层,在“飞机速度:”后面制作一个plane_speed的动态文本框。
6. 新建一个missilenum图层,使用绘图工具绘制作如下图形,选取这些图形按F8键转换成影片剪辑,名称为missilenum_mc,在Properties面板中输入Instance Name实例名称为missile_num。

7. 双击进入missilenum_mc影片剪辑,在第三产业、3、4、5、6帧按F6建立关键帧,在第6帧加入代码stop(),然后将第1帧中的导弹全部删去,第2帧保留一个,第3帧保留2个,以此类推。
8. 回到场景,新建一个plane_num图层,取实例名称为planenum_mc,依照上一步的方法制作。

9. 回到场景,在第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。
主机控制方法
1. 在场景中,新建一个plane图层,使用绘图工具绘制一个飞机,因为我们主要是传授如何制作游戏,所以,对于飞机的绘制过程不再进行详述。

2. 选中这个飞机按F8键转换成影片剪辑,名称为plane_mc,双击进入这个影片剪辑,新建一个图层,绘制一个矩形,如下图所示,将其转换成影片剪辑,取实例名称为plane_hit,再将透明度alpha降为0。因为Flash的碰撞测试是以矩形为准的,而飞机的头比较细比较长,这样一来让人感觉还没有碰到就爆了,所以,我们绘制这么一个矩形,只有当碰撞到这个影片剪辑时,主控飞机才会爆。

3. 回到场景,为飞机影片剪辑取实例名称为plane_mc,然后按F8键转换成影片剪辑,双击进入影片剪辑开始制作,新建一个图层,在第30帧建立关键帧,绘制一个渐淡的红色圆球,将其转换成影片剪辑,名称为plane_bo。

4. 在plane_bo影片剪辑中,第5帧制作它被放大,第10帧缩小变黄,第20帧渐渐消失。新建一个图层,导入音乐文件fx13431_bomb8.mp3,放置在第1帧。双击空白区域回到上一级影片剪辑,
5. 新建8个图层,分别复制plane_bo影片剪辑,放置在第30帧以后的位置,隔两帧放置一个。等于是让八个爆炸的圆球依次播放,模仿爆炸效果。
6. 新建一个图层,在第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子弹可以发射的变量为假。
7. 在第2帧加入代码:
plane_mc._y-=10
plane_mc._alpha=30
代码解读:
主控飞机的Y坐标等于Y坐标减去10,透明度等于30。
8. 在第3帧加入代码:
if(plane_mc._y<=0){ gotoAndPlay(4) }else{ gotoAndPlay(2) } 代码解读: 当主控飞机的坐标小于等于0时,开始播放第4帧,如果不然,将播放第2帧,实际上等于让飞机以10个坐标的速度递减。 9. 在第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帧中,实际是一个让主控飞机飞入场景的动画,而现在,command_bl可控制的开关为真,等于说飞机可以被控制,hittest_bl敌机的碰撞测试为假,主控飞机不能被击爆;shot_bl等于真,子弹已经可以发射击,子弹样式等于1也就是单弹道,shot_speed子弹速度等于10,plane_speed主控飞机的飞行速度等于10,missile_num代表导弹数量的影片剪辑从第1帧开始播放。 10. 在第30帧加入代码: stop() plane_mc._alpha=100 _root.command_bl=true _root.hittest_bl=true 当播放到第30帧时,应该stop停止在这1帧,实际我们在正常游戏的时候,主控飞机应该是处在这一帧的。Plane_mc主控飞机的透明度等于100;command_bl控制开关为开,hittest_bl敌机的碰撞开关为开,表示在这一帧时,主控飞机可以被击爆。 11. 在第31帧加入代码: _root.command_bl=false _root.hittest_bl=false _root.shot_bl=false 代码解读: 如果主控飞机被击爆,那么这个影片剪辑应该开始播放了,在第31帧中,command_bl飞机的控制开关为关,被击爆当然就不能再受方向控制了,hittest_bl碰撞开关为关,不允许被击两次,shot_bl不能再发射子弹了。 12. 在第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次,除非有其它的外界程序干扰。 13. 回到场景中,为主控飞机的影片剪辑添加实例名称为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变量,也就是飞机的飞行程度; 当按键中的RIGHT键按下,而且plane影片剪辑的X坐标小于620时,plane的X坐标等于它的X坐标加上plane_speed变量; 当按键中的UP键按下,而且plane影片剪辑的Y坐标大于30时,plane的Y坐标等于它的Y坐标减去plane_speed变量; 当按键中的DOWN键按下,而且plane影片剪辑的Y坐标小于420时,plane的Y坐标等于它的Y坐标加上plane_speed变量; 制作完成后,你可以按下Ctrl+Enter键测试一下。 子弹发射方法 1. 回到场景中,新建一个shot图层,在场景的外面,使用绘图工具绘制一个子弹的形状,类似下图,然后选中按F8键转换成影片剪辑,名称为shot,输入实例名称为shot。 2. 双击进入影片剪辑,在第2帧建立关键帧,放置两个这样的子弹在中心位置。在第3帧建立关键帧,放置四个这样的子弹在中心位置。然后在第1帧加入代码stop(),让影片剪辑在初始时,停止播放。 3. 回到场景中,给shot对象加入代码如下,注意是给对象加代码,而不是帧,方法是鼠标右键选择子弹对象,右键菜单中选择Action,这样的代码是针对对象的代码。 onClipEvent(enterFrame){ this._y-=10+random(_root.shot_speed) } 代码解读: 当影片剪辑开始播放时,它的Y坐标等于它的Y坐标减去10加上shot_speed的随机数。 4. 在场景的第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。
5. 这段代码实际上就是一个子弹的发射过程,当我们按下Shift键时,影片剪辑就会不段的进行复制,而起始坐标永远都是飞机的坐标,影片剪辑本身的代码中,使它不停的向上运动,就形成了完整的子弹发射过程。
导弹发射方法
1. 在场景中新建一个图层,名称为missile,使用绘图工具绘制一个导弹,如下图所示,选取这个导弹按F8键转换成影片剪辑,取实例名称为missile,双击进入影片剪辑开始编辑工作。

2. 在影片剪辑中,再次选取导弹按F8转换成影片剪辑,在第15帧建立关键帧,将导弹的坐标放置在X:0,Y:-175的位置上,从第1帧建立动画,新建一个图层,在第15帧绘制一个爆炸的圆形渐变图,类似飞机爆炸的那种,但要大一些。
3. 选中这个图层,按F8转换成影片剪辑,在第40、70帧建立关键帧,在第40帧把爆炸效果缩放到特别大,大到你喜欢的程度,然后建立Motion运动。
4. 新建一个图层,导入音乐文件fx13443_explomed.mp3放在第1帧,在第1帧加入代码如下:
stop()
this._x=5000
this._y=5000
代码解读:
在第1帧停止播放,影片剪辑的X坐标和Y坐标等于5000,我们在一开始让影片剪辑的坐标离场景越远越好,当按钮点击时,再让它回到主控飞机的位置就可以了,不然这个导弹将总是在场景内,不利于我们的程序。
5. 回到场景中,在主控飞机的代码中,加入如下代码:
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时;
导弹影片剪辑开始播放;
导弹影片剪辑的X坐标等于主控飞机的X坐标;
导弹影片剪辑的Y坐标等于主控飞机的Y坐标;
Missile_text递减;
Missile_num也就是我们最初制作的导弹数量的影片剪辑跳转到missile_text变量的位置。
因为在一开始,我们设置missile_text变量的内容为6,所以,跳转就等于倒退,退到第1帧时,导弹将再也不能发射了。
装备彩蛋制作方法
1. 回到场景中,新建一个图层,名称为brand,使用绘图工具绘制如下图所示的内容。这其中包括一个变化色彩的外框,一个文字内容,和一个背景黑色,选中这个内容按F8键转换成影片剪辑。

2. 把这个图形放置在场景的顶端,突出场景以外的地方,然后进入影片剪辑编辑,建立在影片剪辑中,将这三个内容分图层放置。然后选取文字内容,按F8键转换成影片剪辑,名称为brand_mc,取实例名为brand_mc。
3. 进入brand_mc影片剪辑,在第1帧输入内容“子弹加速”,在第2帧输入内容“子弹样式”,第3帧为“飞机加速”,第4帧“增加飞机”,第5帧为“增加导弹”。在第1帧加入代码gotoAndStop(random(5)+1),让影片剪辑直接跳转到相应的帧,不再播放。
4. 回到场景中,选取这个装备图标,为对象加入代码,记得吗?在子弹制作中,我们已经给对象加过代码了。
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,那么就增加一个导弹。 这段代码看起来很长,但并不难懂,相信有一些程序基础的朋友对if语句是再熟悉不过了。 1号敌机制作方法 1. 新建一个图层,名称为enemy_a,绘制一个如下的敌机,选中这个敌机按F8键,转换成影片剪辑,名称为enemya_mc,实例名也是enemya_mc,双击进入影片剪辑。 2. 在第1帧加入代码stop(),让影片停止播放,新建一个图层,在新图层的第2帧制作一个爆炸的效果,在最后帧加入代码如下: removeMovieClip(_parent._parent) _root.score+=100 代码解读: 这等于删去上一级的上一级影片剪辑,而分数再加上100。 3. 再次新建一个图层,在第2帧放入fx13431_bomb8.mp3音乐文件,记得要使用stream数据流的方式,双击空白区域回到场景。 4. 在场景中选中这个影片剪辑,放置在场景以外的左上角,再次按F8键转换成影片剪辑,名称为enemya_eft,实例名为enemy_a,进入影片剪辑,在图层1上加入一个引导图层,使用绘图工具绘制一条曲线,如下图所示。 5. 将两个图层都延缓到第60帧,将第1帧的敌机放置在引导线的起始,在最后1帧将敌机放置到引导线的结尾,建立Motion动画,在最后1帧加入代码removeMovieClip(_parent),删去上一级影片剪辑,这也就是说,无论敌机是被击爆的,还 飞行结束,它都将消失,所不同的就是加不加分而已。 6. 回到场景,选中敌机按F8键转换成影片剪辑,名称为enemya,实例名称为enemy_a,选取后再次按F8键转换成影片剪辑,名称为enemy_a,实例名称为enemya。双击进入影片剪辑。 7. 在第10帧按F5键,新建一个图层,在第1帧,加入代码: enemya_i=0 enemya_max=10 enemya._visible=0 代码解读: Enemya_i变量等于0,enemya_max变量等于10,而敌机为不显示。 8. 在图层2的第2帧加入代码: 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。
9. 在第10帧加入代码gotoAndPlay(2),这样就可以完成复制,让每10帧,就复制一个敌机。
10. 右键选取敌机,为对象加入代码如下:
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影片剪辑开始播放,也就是爆炸动画。 此时它的X坐标等于它的X坐标,它的Y坐标等于Y坐标,实际上它将不会再按引导线运动了。 而主控飞机的影片剪辑也开始播放,主控飞机的爆炸动画也被启动了。 当它碰撞到导弹时,它的爆炸动画开始播放,它的坐标也将不会再运动了。 当j=1,而且j小于50时,j递增,这句实际上是每帧执行50次的一个代码,也就是子弹的碰撞测试,因为子弹是使用的复制品,实例名称有50个,所以,以下代码有点变化,当它碰撞到[“shot”+j]这个数组时,也就表示它碰撞到50个子弹中任意的一个时,它的爆炸动画开始播放,它的坐标等于现在的坐标。 11. 2号敌机与1号敌机制作方法基本相同,依照相同的方法,我们制作一个enemy_b的影片剪辑,绘制的敌机如下所示。 12. 依照与1号敌机相同的制作步骤,仅仅是引导线的制作,如下图所示。它将从左侧按弧线飞行到右上角。 13. 2号敌机的碰撞代码也与1号敌机相类似,可以参考1号敌机,也可以对照源程序。在场景中,2号敌机的实例名称为enemyb。在2号敌机的第1帧加入代码stop(),因为这个敌机在一开始的时候,并不会出现,等到分数值到了一定程度,才会出现。 14. 回到场景中,我们在主控飞机的代码中,加入如下代码。 if(score>=10000){
enemyb.play()
}
if(score>=20000){
gotoAndStop(2)
}
if(_root.planenum_mc._currentframe<2){ gotoAndStop(3) } 代码解读: 当分数大于等于10000时,2号敌机开始播放, 当分数大于等于100000,场景跳转到第2帧, 当飞机数量的影片剪辑当前帧小于2时,场景跳转到第3帧。 BOSS敌机制作 1. 现在开始制作Boss敌机了,先来制作一些准备工作,导入f8f158.mp3音乐文件,在Library库面板中,右键选取这个音乐文件,选择Linkage,在弹出面板中选择Export to AcitonScript,在输入框中输入sound2,将这个音乐文件输出。 2. 在主控飞机的代码中,第1行,加入如下代码: mysound=new Sound() mysound.attachSound("sound2") mysound.start(0,10000) 代码解读: Mysound是新的音乐对象,这个音乐对象将绑定sound2音乐文件,而且它开始播放10000遍。 3. 将场景中除了敌机的两个图层,其它的图层第2帧都按F5键,使之顺延到第2帧,然后新建一个图层,名称为foeshot。绘制一个椭圆形的渐变在场景中,这其实就是敌机的子弹。它的坐标是X:0,Y:0。 4. 你要保证的是,今后在它的嵌套过程中,它的坐标始终为0,不然,你的代码将出现问题。选中这个图形,转换成影片剪辑,进入影片剪辑后,将它的坐标调整为X:0,Y:0,然后再转换成影片剪辑。 5. 双击进入影片剪辑,将坐标调整为0,再次转换成影片剪辑,在第125帧建立关键帧,将其的坐标调整为X:800,Y:0,在第1帧建立动画,在最后1帧加入代码removeMovieClip(this),让它删除自己。 6. 双击空白区域,回到上一级影片剪辑,为子弹效果起实例名称为foeshot,新建一个图层,在第1帧加入代码如下: foe_i=0 foe_max=10 foeshot._visible=0 stop() 代码解读: 变量foe_i等于0,foe_max等于10,而子弹的显示参数为0。影片剪辑停止播放。 7. 在第2帧加入代码如下: 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。
8. 将两个图层都顺延到15帧,在第15帧加入代码gotoAndPlay(2),然后给子弹的对象加入代码如下:
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帧,而主控飞机的爆炸动画也将开始播放。
如果它碰撞到导弹的话,那么它将直接播放第125帧,也就是删去自己。
9. 回到场景中,为子弹影片剪辑取实例名称为foe,新建一个图层,名称为boss,绘制一个如下的敌机在场景中,如果你嫌我画的太差,你喜欢自己画一个,我并不介意。

10. 选中这个敌机按F8转换成影片剪辑,名称为boss,实例名相同,进入影片剪辑,选中这个飞机,尽量把它缩放的大一些,然后选取按F8转换成影片剪辑,名称为boss_mc,实例名相同。
11. 进入boss_mc影片剪辑,制作一段boss主机的爆炸动画,可以同敌机一号的爆炸差不多,但时间尽可能的长一些。在第1帧加入代码stop(),在第2帧加入代码_root.foe.gotoAndStop(1),也就是说,当boss主机开始播放爆炸动画时,它将不会再发射子弹,在爆炸动画的最后一帧加入代码_root.gotoAndStop(1),让游戏重新开始。
12. 双击回到上一级影片剪辑,制作一段动画,先是它从最上方缓慢移动到场景中间,然后移动到场景的左边,再移动到场景的右边,然后开始循环的左右移动。在开始移动的这一帧加入代码如下_root.foe.play(),让子弹程序开始播放。
13. 回到场景中,在第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主机碰撞到导弹时,它的生命也将递减。 14. 回到场景中,新建一个图层,在第3帧建立关键帧,加入代码stop(),stopAllSounds(),停止所有音乐,使用文字输入工具输入GAME OVER字样,再制作一个按钮,按钮内容为: On(press){ gotoAndPlay(“Scene 1”,1) } 让游戏回到开始界面。 总而言之 这个游戏就基本制作完成了,虽然它看起来只像是一个雏形,但却已经具备了一个小型游戏的全部。其实麻雀虽小五脏俱全,通过这个游戏的制作,你可能已经能够感受到,制作大型游戏,无非就是在这样的代码基础上,增加更多的内容和场景,以及人物,声音,动画,效果等等。我觉得这更像是一个抛砖引玉的游戏,希望它可以让大家学会游戏制作的流程,以后制作更多更好的游戏移植到手机上去。 当然,由于时间紧迫,这个游戏难免存在BUG,看上去有些代码还可以再简化一下,不过,我想通过这样的制作,已经可以使你独立完成一些简单的游戏制作了。