飞机大战

1.小组博客链接

2.个人负责部分

功能架构图(黄圈内为个人负责部分)

java游戏碰撞反弹 java 碰撞检测_Image

①碰撞检测

碰撞检测是游戏中不可或缺的一部分,难点在于确定碰撞的触发如何去实现条件化、数据化。

java游戏碰撞反弹 java 碰撞检测_碰撞检测_02

本次程序中采用的方法如上图所示,利用敌机和友机的坐标以及长宽,来确定碰撞条件,因为飞机有大小,所以必须确定碰撞产生的区域,如上图灰色区域,当友机的坐标出现在上图灰色的区域内,则判定为触发碰撞。

设想,未实现

java游戏碰撞反弹 java 碰撞检测_碰撞检测_03

如上图,将飞机图片细化为一个不规则图形,利用直线进行描边,使得空白碰撞区域更少(如图中飞机周边紫线),理论上来说,描的边越多,碰撞的检测就越精准,但产生碰撞的区域范围很难用代码描述,且需要检测的游戏物品太多,工程量巨大,尚未实现。

关键实现代码(部分):

// 判断飞机是否吃到道具

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();

}

}

}

效果展示

java游戏碰撞反弹 java 碰撞检测_实例化_04

3.本次课程设计的感想和不足之处

①开发过程中的感想

在游戏中会出现很多不同种类的敌机,如果在代码中将敌机直接实例化写死,这将是一个很大的工程,需要实例化成千上百的对象,这很低效,因此我想到了以前看到过的一种反射机制,利用特殊的Class类和各个类名来在程序运行过程中动态的创建对象,从而高效的减轻了工作量,提高了代码效率

②不足之处及展望

程序的碰撞检测机制实现的太过粗略,只是初级到达了本次课设的要求,并不是一个合格游戏程序可取的,但是在前期的设想中是有更加完善的想法的,例如将飞机图片细化为一个不规则图形,利用直线进行描边,使得空白碰撞区域更少,但产生碰撞的区域范围很难用代码描述,且需要检测的游戏物品太多,工程量巨大,尚未实现,因为始终无法应用出来,逻辑很难实现而放弃了,之后可以在空余时间里将其完善实现出来,让程序更加的成熟。