Java课程设计——个人

飞机大战

1.小组博客链接

https://www.cnblogs.com/yt0617/p/14337817.html)

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类和各个类名来在程序运行过程中动态的创建对象,从而高效的减轻了工作量,提高了代码效率

②不足之处及展望

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

posted @ 2021-01-28 10:43  明旭·  阅读(80)  评论(0编辑  收藏  举报