这次讨论的是关于飞机游戏(彩京类型)的,结合我做的《飞天战记》来做实例。
我这个游戏也藏考了别人的DD,比如,boss的散弹发射,请看OX的帖子(自己找!)。
建议大家在看源码时,最好要看懂,不要抱着偷别人的过来用这种心态,当然,一些好看的动画可以直接截取,不反对的,呵呵。
有不懂的,就问其他高手把,这只是我个人的思路,很复杂的东西。。。
一.画面
游戏要成功,首先你看到的是它的画面。
彩京有很多种版本,可爱型的(武装飞鸟)、铿锵型的(1942),飞机(人物角色)的设计都是很有特色,游戏的战斗画面很绚丽,尤其是爆炸效果!
(画面不做仔细研究,毕竟我的美工一般。。。)
2.战斗控制
终于讲到精彩部分拉!这可是精华!之所以彩京会那么受欢迎,是它在操作中加入了很多人性化的东西,我们仔细把它挖出来!
二.操作(重点)
游戏有了漂亮的画面,接下就是玩它的操作手感了。
彩京的操作分成2个部分(选人、控制):
1.选人
几乎每个多角色的游戏选人这个都会做文章,彩京系列一般有5~7命人物可供选择,它采用的方法是:上下窗口模式的(或左右窗口模式),即上面2/3的画面是角色的全身彩图,下面1/3的是在游戏中的战斗状态图。
除了常规的,它还有个选隐藏人物的选择框,我还记得某代的选择方法是“上3下3上7”。以下是《飞天战记》的选人制作部分:
这里要提到几个相关的东西:
威力:提高子弹威力,有上限,到底上限后,加了就会转化成分数;
雷:用来救命或者强力攻击敌的东西,初始数目为2~3个,没有上限;
积气:按住子弹键不放,就会累积,到达一定量后, 就可以放出绝招;
奖人:+1条生命;
分数:打死敌人、拣到金币等,就会得分。
1)出现
彩京的角色出现时,有一段时间处于无敌状态,刚冲出来到预定地方,这段飞行距离是不能控制的,在无敌期间,可以开枪、积气、放雷(这就是人性化的东西)。
2) 人物的常规控制
就是控制人物满屏幕的移动,子弹攻击,积气,放雷。
a.移动
移动的AS论坛上不知贴了多少个了,这里就不解释。
人性化:把人物上下左右中的5个移动动作都做出来,会增加你游戏的生动性。
b. 子弹攻击(一般攻击)
要注意子弹的检测,比如检测最近的1~20个,不然,你放出的子弹,打到敌人会没反应。
c. 积气
当长按子弹键不放,到达一定量,就会有绝技,这里主要时用到attachMovie,把积气完成的动画和释放的绝技加载到角色身上。
d.放雷
比较容量,做一个MC,一碰到敌人,敌人就减血,别忘了做删除,不然就无敌了!
3)死亡
彩京系列正确的死亡只有一种,就是被敌人的子弹击中,死亡后,人物的数据就要清零。
人性化:撞中敌人时,并不会死掉,只时子弹的威力会-1级。
这里例举《飞天站记》中“扫把女”的控制AS,下面中的“saoba”定义的就是扫把女身上的控制点(即,碰撞区)
扫把女的MC名字是库里的:MCà加载扫把女,其他几个人的方法一样。
onClipEvent (load) {
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);
}
}
}