看着这极其复杂好像很厉害的代码,我又萌生了痛下狠手的想法,但为了保持原生,我忍住。于是乎还发现了一个BUG。如果选中铲子后,战场上唯一的植物被僵尸吃掉了,那么这个铲子将一直跟随着鼠标无法达到使用后消除的效果了。解决方案当然也很简单,当战场上植物集合的size为0时,清空铲子集合即可。
3.游戏可玩性的优化
上文在游戏设计中提到的击*僵尸后可能随机获得奖励类型是这样实现的。还是从设计分析开始,并非击*任何类型的僵尸都可以获得奖励,所以奖励应该放在接口中:
publicinterfaceAward{
// 奖励接口
/*
* 这里还是存在代码不规范的问题
* 接口的方式默认是public abstract
* 接口中的变量默认是public static final
* 这些默认的字段应该舍去
*/
// 全屏静止
publicstaticfinalintCLEAR =0;
// 全屏清除
publicstaticfinalintSTOP =1;
publicabstractintgetAwardType();
}
当僵尸死亡时,需要去判断该僵尸是否有奖励接口,如果有则执行相应奖励的方法:
// 检测僵尸状态
publicvoidcheckZombieAction(){
// 迭代器
Iterator<Zombie> it = zombies.iterator();
while(it.hasNext()) {
Zombie z = it.next();
// 僵尸血量小于0则死亡,死亡的僵尸从集合中删除
if(z.getLive()<=0) {
// 判断僵尸是否有奖励的接口
if(z instanceof Award) {
Award a = (Award)z;
inttype = a.getAwardType();
switch(type) {
caseAward.CLEAR:
for(Zombie zo:zombies) {
zo.goDead();
}
break;
caseAward.STOP:
for(Zombie zom:zombies) {
zom.goStop();
timeStop =1;
//zombieGoLife();
}
break;
}
}
z.goDead();
it.remove();
}
// 僵尸跑进房子,而游戏生命减一,并删除僵尸
if(z.OutOfBound()) {
gameLife--;
it.remove();
}
}
}
4.添加游戏背景音乐
bgm是一个游戏的灵魂之一。这里给游戏添加背景音乐,我的选择是新建一条线程专门用来执行音乐的解析和播放:
// 启动线程加载音乐
Runnable r =newzombieAubio("bgm.wav");
Thread t =newThread(r);
t.start();
publicclasszombieAubioimplementsRunnable{
// 读音频WAV格式专用线程
privateString filename;
publiczombieAubio(String wavfile){
filename=wavfile;
}
......
这里需要注意的是,Java中解析音乐的API只支持WAV格式的文件,文件格式的转换大多数音乐播放器都可以做到。
后续优化
1.植物种类的扩充及对应功能的实现
比如*伤力最大的玉米加农炮。需要4个小玉米进行合成,那么在判断是否能够合成玉米加农炮时,需要对植物集合进行遍历来做坐标的判断,所以这边建议最好把可合成的植物单独放在一个集合中,这样在做合成判断的时候会简单很多,当集合的size小于4时,就可以提示合成失败了。冰冻西瓜的设计思路也是如此。
2.动作类僵尸的加入,如撑杆跳僵尸、跳舞僵尸等
说一下撑杆跳僵尸的设计思路,此类僵尸和其他僵尸相比,多了一种跳的行为,所以会有一个单独的方法和单独的状态。并且,跳只能触发一次,所以撑杆跳僵尸的状态变化应该是行走->遇到植物跳过去->再遇到植物就开始攻击,在执行状态变化的时候,应该要去考虑当前的状态是否还可跳跃。
3.当植物攻击范围内不存在僵尸时,植物停止攻击
这个就简单拉,在植物执行攻击方法时,校验一下是否有Y坐标相同的僵尸即可。
除植物大战僵尸外,小编还有飞机大战,坦克大战等的教程 源码,同时小编也准备了300集全套Java教程送给大家。
转发 关注并私信小编“资料”即可领取
以上这些课程如果想要了解的请私信小编“ 资料”即可了解,小编回复的比较慢,喜欢小编的可以关注支持一下,谢谢大家支持!