飞机大战
1.小组博客链接
2.个人负责部分
功能架构图(黄圈内为个人负责部分)
①碰撞检测
碰撞检测是游戏中不可或缺的一部分,难点在于确定碰撞的触发如何去实现条件化、数据化。
本次程序中采用的方法如上图所示,利用敌机和友机的坐标以及长宽,来确定碰撞条件,因为飞机有大小,所以必须确定碰撞产生的区域,如上图灰色区域,当友机的坐标出现在上图灰色的区域内,则判定为触发碰撞。
设想,未实现
如上图,将飞机图片细化为一个不规则图形,利用直线进行描边,使得空白碰撞区域更少(如图中飞机周边紫线),理论上来说,描的边越多,碰撞的检测就越精准,但产生碰撞的区域范围很难用代码描述,且需要检测的游戏物品太多,工程量巨大,尚未实现。
关键实现代码(部分):
// 判断飞机是否吃到道具
for (int i = 0; i < this.backGroundPanel.items.size(); i++) {
Item item = this.backGroundPanel.items.get(i);
//当飞机坐标达到临界条件时触发
if (this.x >= item.x - this.width && this.x <= item.x + item.width && this.y >= item.y - this.height
&& this.y <= item.y + item.height) {
//碰撞后道具被吃掉
item.eated();
//吃到升级子弹道具
if (item.powerType == 1) {
if (attackType == 2) {
attackType = 3;
}
if (attackMode == 3 && attackType == 1) {
attackType = 2;
}
if (attackMode < 3) {
attackMode++;
}
}
}
}
②游戏内部动画特效
游戏中的特效会使得游戏具有更强的观赏性,增加玩游戏的乐趣,因此在游戏中依旧必不可少。
本程序中利用Graphics类的drawImage等绘图方法,在程序不断运行的过程,将一个动画连续图片,在极短的时间里连续画出来,利用人眼错觉达到动画特效效果。并且,不同的物品有着不同的动画效果和触发效果的条件。
关键实现代码(部分):
public Image[] dieImages = new Image[]{
Toolkit.getDefaultToolkit().getImage("images/特效/bullet1/110.png"),
Toolkit.getDefaultToolkit().getImage("images/特效/bullet1/111.png"),
Toolkit.getDefaultToolkit().getImage("images/特效/bullet1/112.png"),
Toolkit.getDefaultToolkit().getImage("images/特效/bullet1/113.png")};
public int dieImageindex = 0;
if (hp > 0) {
g.drawImage(this.image, x, y, width, height, null);
} else {
g.drawImage(dieImages[dieImageindex], x, y, width, height, null);
if (backGroundPanel.getTime() % 10 == 0) {
dieImageindex++;
if (dieImageindex >= this.dieImages.length) {
killed();
}
}
}
效果展示
3.本次课程设计的感想和不足之处
①开发过程中的感想
在游戏中会出现很多不同种类的敌机,如果在代码中将敌机直接实例化写死,这将是一个很大的工程,需要实例化成千上百的对象,这很低效,因此我想到了以前看到过的一种反射机制,利用特殊的Class类和各个类名来在程序运行过程中动态的创建对象,从而高效的减轻了工作量,提高了代码效率
②不足之处及展望
程序的碰撞检测机制实现的太过粗略,只是初级到达了本次课设的要求,并不是一个合格游戏程序可取的,但是在前期的设想中是有更加完善的想法的,例如将飞机图片细化为一个不规则图形,利用直线进行描边,使得空白碰撞区域更少,但产生碰撞的区域范围很难用代码描述,且需要检测的游戏物品太多,工程量巨大,尚未实现,因为始终无法应用出来,逻辑很难实现而放弃了,之后可以在空余时间里将其完善实现出来,让程序更加的成熟。