这个战斗游戏非常复杂,包括多个敌人、多层关卡、多种功能,为了讲清楚这些内容,下面将把这些内容分成几个部分来一一讲述。
Ö 我的飞船
Ö 我的子弹
Ö 游戏中的令牌
Ö 游戏中的普通敌人
Ö 游戏中的大怪物(Boss)
1.飞船控制程序
飞船的控制程序如下:
onClipEvent (load) {
//隐藏鼠标
Mouse.hide();
old_my_blood = _root.my_blood;
begin_fire = true;
//我的机甲飞船每次用键盘移动的x与y方向上的距离
my_plane_x_move = 15;
my_plane_y_move = 15;
//这4个变量是用鼠标拖动机甲飞船时约束其范围的左上角与右下角的位置
top_x = _root.play_left+22;
top_y = _root.play_top+20;
bottom_x = _root.play_right-25;
bottom_y = _root.play_bottom-30;
}
onClipEvent (mouseDown) {
//当鼠标按下时,开始连续发射子弹
continue_shot = true;
}
onClipEvent (mouseUp) {
//当鼠标松开时,连续发射子弹结束
continue_shot = false;
}
onClipEvent (unload) {
stopDrag();
}
onClipEvent (enterFrame) {
if (_root.nodead || my_plane_hide) {
//如果这个游戏被设成不死无敌版,就锁定我的飞船的血量为最大
_root.my_blood = 50;
}
if (old_my_blood > _root.my_blood) {
//如果我被敌人的子弹击中就让我的飞船闪一下
this.gotoAndPlay("my_plane_flash");
}
if (_root.my_blood<=0) {
//如果我的飞船的血为零了,也就相当于我死了一条命了
//显示我的飞船爆炸的效果
this.gotoAndPlay("my_plane_dead");
//播放我的飞船爆炸的声音
_root.my_dead.start();
//我的可驾驶飞船数减1,这个相当于游戏的命的条数
_root["my_plane_num_"+(_root.my_plane_number-1)]._visible = false;
_root.my_plane_number--;
//重新开始一个新的飞船
_root.my_blood = 50;
//把我的飞船隐藏起来
my_plane_hide = true;
if (_root.my_plane_number<=0) {
//如果我能驾驶的飞船已经用完,游戏结束
tellTarget (_root) {
gotoAndPlay ("gameover", "game_end");
}
}
}
//如果我还有血就显示我的血量
_root.blood.gotoAndStop(51-_root.my_blood);
//下面的内容都是用来响应键盘控制的
if ( (Key.isDown(Key.SPACE) || continue_shot) && begin_fire ) {
//空格键发射子弹
begin_x = _x-(_root.my_powder/2-0.5)*_root.bullet_x_between;
begin_y=_y-(_height>>1)-(_root.bullet_height+_root.bullet_y_between)*i-10;
_root.fire(begin_x, begin_y);
//播放发射子弹的声音
_root.my_shot.start();
}
if (Key.isDown(Key.RIGHT)) {
//右光标键,飞船右移,同时检查飞船不能移出控制范围
_x += my_plane_x_move;
if (_x>bottom_x) {
_x = bottom_x;
}
}
if (Key.isDown(Key.LEFT)) {
//左光标键,飞船左移
_x -= my_plane_x_move;
if (_x
_x = top_x;
}
}
if (Key.isDown(Key.UP)) {
//上光标键,飞船上移
_y -= my_plane_y_move;
if (_y
_y = top_y;
}
}
if (Key.isDown(Key.DOWN)) {
//下光标键,飞船下移
_y += my_plane_y_move;
if (_y>bottom_y) {
_y = bottom_y;
}
}
old_my_blood = _root.my_blood;
}
这段程序包含的内容非常多,下面来具体解释一下:
Ö _root.my_blood 变量是用来存放我的飞船的当前血量的,其最大血量是50,当小于等于0时,飞船就爆炸,同时减少一条命。
Ö old_my_blood变量虽然存放的是前次我的血量,但其实质意义是用来检查我的飞船有否被敌人击中。如果被击中,那么当前的血就会小于以前的血,从而可以判断我被击中了,并做出相应的动作。
Ö _root.nodead用来控制游戏的不死版本。这个设置一方面可以用密技的方式来增加游戏的可玩性,同时让调试变得非常轻松方便。如果其设置为true,我的飞船就永远不死!(密技部分本章没有写,请感兴趣的朋友看源代码。)
Ö my_plane_hide,从变量名上看像是用来隐藏我的飞船的,但其存在的主要原因是因为当我的飞船爆炸后,其位置并不会改变,而且还要在当前爆炸位置显示一个爆炸效果。这个时候应锁定飞船,不能对其进行其他操作。其血量也要锁定为最大值,以确保新的飞船出现时是满血。
Ö _root.blood.gotoAndStop(51-_root.my_blood),以图形化的形式显示出血量的真实变化,如图6-6所示。

图6-6
很明显,这个血是一个变形动画,不同的帧就对应于不同的血量值。
“我的飞船”包含很复杂的内容,可分成三个部分,如图6-7所示。

图6-7
第一部分是从第1帧至第21帧,是飞船从小到大、从透明到显现的显示过程,在飞船刚出现时播放;第二部分是从第22帧到第25帧,也就是程序中标号为:my_plane_flash的位置;其效果是让飞船闪一下,用来表示被敌人的子弹击中或者直接撞到了星际生物;第三部分是从第26帧到第45帧,就是引入前面讲述的爆炸效果,让飞船爆炸。
也许读者现在正心存疑问:拖动飞船的语句在什么地方?其实它就在这个MovieClip的第1帧中,代码如下:
my_plane_hide = true;
begin_fire = true;
startDrag ("", true, top_x,top_y,bottom_x,bottom_y);
第21帧的程序:
my_plane_hide = false;
stop ();
第25帧的程序:
gotoAndStop("normal");
第26帧的程序:
stopDrag();
begin_fire = false;
我的飞船的MovirClip做好后,就把它放到主场景中,名为:my_plane。如图6-8所示。

图6-8
这样,通过这些代码的组合及画面上的制作,飞船就可以在程序控制的范围内自由地移动了!当然了,有些变量的初值要在游戏开始时就初始化,这里就不一一列出了。