这次讨论的是关于飞机游戏(彩京类型)的,结合我做的《飞天战记》来做实例。
我这个游戏也藏考了别人的DD,比如,boss的散弹发射,请看OX的帖子(自己找!)。
建议大家在看源码时,最好要看懂,不要抱着偷别人的过来用这种心态,当然,一些好看的动画可以直接截取,不反对的,呵呵。
有不懂的,就问其他高手把,这只是我个人的思路,很复杂的东西。。。
一.画面
游戏要成功,首先你看到的是它的画面。
彩京有很多种版本,可爱型的(武装飞鸟)、铿锵型的(1942),飞机(人物角色)的设计都是很有特色,游戏的战斗画面很绚丽,尤其是爆炸效果!
(画面不做仔细研究,毕竟我的美工一般。。。)
二.操作(重点)
游戏有了漂亮的画面,接下就是玩它的操作手感了。
彩京的操作分成2个部分(选人、控制):
1.选人
几乎每个多角色的游戏选人这个都会做文章,彩京系列一般有5~7命人物可供选择,它采用的方法是:上下窗口模式的(或左右窗口模式),即上面2/3的画面是角色的全身彩图,下面1/3的是在游戏中的战斗状态图。
除了常规的,它还有个选隐藏人物的选择框,我还记得某代的选择方法是“上3下3上
2.战斗控制
终于讲到精彩部分拉!这可是精华!之所以彩京会那么受欢迎,是它在操作中加入了很多人性化的东西,我们仔细把它挖出来!
这里要提到几个相关的东西:
威力:提高子弹威力,有上限,到底上限后,加了就会转化成分数;
雷:用来救命或者强力攻击敌的东西,初始数目为2~3个,没有上限;
积气:按住子弹键不放,就会累积,到达一定量后, 就可以放出绝招;
奖人:+1条生命;
分数:打死敌人、拣到金币等,就会得分。
1)出现
彩京的角色出现时,有一段时间处于无敌状态,刚冲出来到预定地方,这段飞行距离是不能控制的,在无敌期间,可以开枪、积气、放雷(这就是人性化的东西)。
2) 人物的常规控制
就是控制人物满屏幕的移动,子弹攻击,积气,放雷。
a.移动
移动的AS论坛上不知贴了多少个了,这里就不解释。
人性化:把人物上下左右中的5个移动动作都做出来,会增加你游戏的生动性。
b. 子弹攻击(一般攻击)
要注意子弹的检测,比如检测最近的1~20个,不然,你放出的子弹,打到敌人会没反应。
c. 积气
当长按子弹键不放,到达一定量,就会有绝技,这里主要时用到attachMovie,把积气完成的动画和释放的绝技加载到角色身上。
d.放雷
比较容量,做一个MC,一碰到敌人,敌人就减血,别忘了做删除,不然就无敌了!
3)死亡
彩京系列正确的死亡只有一种,就是被敌人的子弹击中,死亡后,人物的数据就要清零。
人性化:撞中敌人时,并不会死掉,只时子弹的威力会-1级。
这里例举《飞天站记》中“扫把女”的控制AS,下面中的“saoba”定义的就是扫把女身上的控制点(即,碰撞区)
扫把女的MC名字是库里的:MCà加载扫把女,其他几个人的方法一样。
_root.bao = 0;//雷的数目
_parent.power = 0;//子弹检测时间
_parent._x = 200;
_parent._y = 600;
_parent.saoba._alpha = 20;//一出来角色的透明度
_parent.baohu._alpha = 100;//一出来时的无敌光环
_root.lv = 1;//子弹威力等级
speed = 10;//扫把女的移动速度
_root.i = 1001;//在游戏中的深度
function fashe() {//加载子弹
_root.attachMovie(zd, "zidan"+_root.i, _root.i);
_root["zidan"+_root.i]._x = _root.rw._x+14;
_root["zidan"+_root.i]._y = _root.rw._y-15;
_root.i++;
if (_root.i>1013) {
_root.i = 1001;
}
}
}
onClipEvent (enterFrame) {//子弹威力的检测
if (_root.lv == 1) {
zd = "zidan21";
} else if (_root.lv == 2) {
zd = "zidan22";
} else if (_root.lv == 3) {
zd = "zidan23";
} else if (_root.lv>=4) {
_root.lv = 4;
zd = "zidan24";
}
if (_parent.saoba._alpha<70) {//一出来的那段不能控制飞行
_parent.saoba._alpha = _parent.saoba._alpha+5;
_parent._y = _parent._y-15;
}
if (_parent.saoba._alpha>=70) {//常规的移动控制
if (Key.isDown(65) && (_parent._x>-5)) {
_parent._x -= speed;
_parent.saoba.gotoAndStop(2);
} else if (Key.isDown(68) && (_parent._x<415)) {
_parent._x += speed;
_parent.saoba.gotoAndStop(3);
}
if (Key.isDown(87) && (_parent._y>30)) {
_parent._y -= speed;
} else if (Key.isDown(83) && (_parent._y<520)) {
_parent._y += speed;
}
if (Key.isDown(74)) {//开枪(一般攻击)
_parent.power++;
if (_parent.power<6) {
fashe();
}
if (_parent.power<10) {//积气
_parent.attachMovie("yunqi", "yunqi", 2);
_root.rw.yunqi._x = 20;
_root.rw.yunqi._y = 33;
} else if (_parent.power == 90) {//释放绝招
_parent.attachMovie("yunqi02", "yunqi02", 3);
_parent.yunqi.removeMovieClip();
}
}
}
if (_root.bao == 0) {//放雷时,角色处于无敌
_parent.baohu._alpha--;
}
if (_parent.baohu._alpha<=0) {
_parent.saoba._alpha = 100;
if (Key.isDown(75)) {
if (_root.baoxian>0) {
_root.bao = 1;
_parent.baohu._alpha = 100;
_parent.boom.gotoAndPlay(2);
}
}
}
}
onClipEvent (keyUp) {//释放按键
if (Key.getCode() == 74) {//检测是否积气完成
if (_parent.power>=90) {
_root.attachMovie("bsj02", "bsj", 1021);
_root.bsj._x = _root.rw._x+6;
_root.bsj._y = _root.rw._y;
_parent.power = 0;
}
_parent.yunqi.removeMovieClip();
_parent.yunqi02.removeMovieClip();
_parent.power = 0;
}
if (Key.getCode() == 65) {//角色在左右飞行时的倾侧
_parent.saoba.gotoAndStop(1);
}
if (Key.getCode() == 68) {
_parent.saoba.gotoAndStop(1);
}
}
很乱的东西。。。。重复了,自己优
化
有了主角没反派可不行,敌人也分很多种,傻瓜型、肉血型等等。这里就说2种:
a. 傻瓜型
就是刚出来的小兵,只发一个子弹,就走人的。
例子:《飞天站记》中用的大眼妖
_parent._y = 0;
_parent._x = random(350)+50;//y轴上随即出现
_parent.speed = 6;//速度
_root.attachMovie("drzd1", "zd"+_root.zd, _root.zd);//发射子弹
_root["zd"+_root.zd].n = _parent.n;
_root.zd++;
}
onClipEvent (enterFrame) {
_parent._y = _parent._y+_parent.speed;
if (_parent._y>600) {
_parent.removeMovieClip();
}
if ((_root.ming < 0) || (_root.over == 1)) {//当大眼妖血<0,或者游戏判断出主角全部死亡时,删除大眼妖
_root["zd"+_root.zd].removeMovieClip();
_parent.removeMovieClip();
}
}
b.
肉血型例子:苍蝇怪(打了会出子弹威力)
xunhuan=0
function cyzd() {//子弹的设置
_root.attachMovie("drzd2", "zd"+_root.zd, _root.zd);
_root["zd"+_root.zd].n = _parent.n;
_root.zd++;
xunhuan ++
}
_parent.life1 = 200;//生命
_parent._y = 0;
_parent._x = random(300)+70;//y轴随即出现
_parent.speed = 5;//速度
pp = setInterval(cyzd, 1500);//1500毫秒出现循环
}
onClipEvent (enterFrame) {
if (_parent._y<150) {//飞行路线
_parent._y = _parent._y+_parent.speed;
}
if (_parent._y>=150) {
pp();
}
if((_root.ming < 0) || (_root.over == 1)){ //当大眼妖血<0,或者游戏判断出主角全部死亡时,删除大眼妖
clearInterval(pp);
_parent.removeMovieClip();
}
if (xunhuan > 3) {//放3次子弹,就飞走
_parent._y = _parent._y+_parent.speed;
clearInterval(pp);
if(_parent._y>600){
_parent.removeMovieClip();
}
}
if (this.hitTest((_root.rw.boom)||(_root.boom))) {//碰上雷时
_parent.gotoAndPlay(10);
clearInterval(pp);
}
}
onClipEvent (enterFrame) {
for (bbb=0; bbb<20; bbb++) {//检测子弹
if (this.hitTest("_root.zidan"+(_root.i-bbb))) {
removeMovieClip("_root.zidan"+(_root.i-bbb));
_parent.life1 -= _root.weili;
if (_parent.life1<=0) {//血<0,就死了
_parent.gotoAndPlay(10);
clearInterval(pp);
} else {
_parent.gotoAndPlay(2);
}
}
}
if (this.hitTest(_root.daodan)) {//碰上导弹
_parent.life1 -= _root.weili1;
if (_parent.life1<=0) {
_parent.gotoAndPlay(10);
clearInterval(pp);
} else {
_parent.gotoAndPlay(2);
}
}
if (this.hitTest(_root.bsj)) {//碰上绝技
_parent.life1 -= _root.weili2;
if (_parent.life1<=0) {
_parent.gotoAndPlay(10);
clearInterval(pp);
} else {
_parent.gotoAndPlay(2);
}
}
}
源码
游戏中的MC文件都在库里的MC文件夹下,地图是:场景011-场景013;人物控制是:加载×××(角色的名字),敌人是:×××(敌人的名字),角色的子弹、积气、绝技、雷,都对应写好了:××子弹、××积气、××绝技、××雷。
http://218.77.114.2:7000/down/01.rar
