坦克大战(JAVA项目)
1.项目简介
复刻童年经典小游戏——坦克大战:用户进入游戏界面后,通过键盘上的数字1,2键选择游戏模式,选择1并按回车键进入单人模式;选择2并按回车键进入双人模式。玩家1可通过按键WASD控制坦克方向及移动,并且按空格发射子弹。玩家2通过方向键控制坦克方向移动,并且按K键发射子弹。子弹碰到围墙后消失,子弹碰到坦克后产生爆炸特效。左上角记录敌方坦克的实时数量。玩家击败所有敌方坦克,游戏胜利;若所有我方坦克被击败,或者我方基地被摧毁,则游戏失败。
2.小组成员及分工
成员 | 负责任务 | |
---|---|---|
组长 | 黄抒鸿 | 博客撰写,游戏规则的制定,碰撞检测,爆炸特效的实现,随机事件的编写 |
组员 | 雷正伟 | 前期调研,面向对象设计,窗体绘制,闪动问题的解决,键盘事件的编写 |
3.项目功能架构图与主要功能流程图
3.1项目功能架构图
3.2主要功能流程图
3.3面向对象类设计图
4.功能详解
4.1 窗体绘制及添加键盘事件
4.1.1 创建窗口
·创建类继承JFrame
·创建启动方法launch()
4.1.2 为窗口上色
·重写paint()方法,设置图形颜色和大小
4.1.3 添加选项文字
4.1.4 为窗口添加键盘事件
添加内部类,实现KeyAdapter类,重写keyPressed方法,写入键盘事件,1选择单人模式,2选择双人模式
窗口添加键盘监视器
添加指针图片
在项目文件夹下创建文件夹images,关于项目的图片,插件都放在这个文件夹内
创建图片对象
在launch()方法中重绘图形
4.2双缓冲解决闪动问题
创建一个图片
Image offScreemImage = null;
重写paint()方法
创建一个和弹出窗口宽高相同的图片,
获取该图片的图形对象,把所有内容添加到该图片中
//创建和容器一样大小的Image图片
if(offScreemImage == null) {
offScreemImage = this.createImage(width,height);
}
//获的该图片的图形
Graphics gImage = offScreemImage.getGraphics();
gImage.setColor(Color.GRAY);
gImage.fillRect(0, 0, width, height);
//添加游戏选项
gImage.setColor(Color.BLUE);
gImage.setFont(new Font("仿宋", Font.BOLD, 50));
if (state == 0 ) {
gImage.drawString("选择游戏模式", 220, 100);
gImage.drawString("单人模式", 220, 200);
gImage.drawString("双人模式", 220, 300);
//绘制指针
gImage.drawImage(select, 160, y, null);
} else if (state ==1 || state ==2) {
gImage.drawString("游戏开始", 220, 100);
if (state ==1) {
gImage.drawString("单人模式", 220, 200);
} else if(state ==2) {
gImage.drawString("双人模式", 220, 200);
}
}
4.3面向对象设计
游戏父类:
坦克类:
玩家一和玩家二
玩家2和玩家1的方法都是一样的,只需要修改键盘事件。在图形界面更换打印玩家2的图片
子弹类
4.4敌方坦克的随机事件
4.4.1敌方坦克随机方向移动
用一个random类的变量,在0-3中任意生成一个数,通过switch方法,根据随机数的数值来返回相应的方向。
新写一个int变量moveTime表示敌方坦克移动的次数,当次数大于等于20时,我们随机生成并改变敌方坦克的方向,然后重新给移动次数赋值为0;如果移动次数小于20,就加1;
新写一个go的移动方法,首先生成一个随机的方向,最后通过switch来判断方向并调用相应的方法;最后将go方法添加到paintSelf中。
4.4.2敌方坦克随机发射子弹
实现随机发射,需要一个random类,让他在区间内随机返回一个数,如果这个数小于某个值,就发射子弹。
4.5碰撞检测
碰见检测:就是检测两个物体是否碰撞。判断坦克是否与子弹发生碰撞,如果碰撞,坦克发生爆炸。
方法:把两个物体当作矩形,在他们移动过程中调用intersects方法判断两个矩形是否相交,如果是,证明被碰撞到了。
考虑碰撞后续的状态变化。如果消失,用到的方法是,把它从paint遍历的列表中去掉。
新建一个removeList,在遍历完子弹列表后,删除removeList里面要删除的子弹。
子弹与坦克,边界,墙之间的碰撞检测:
4.6爆炸特效
先准备一串完整的动画,再获得爆炸坐标,通过连续切换图片实现爆炸特效。
把爆炸连续的一串图片添加到images文件夹中,创建爆炸类:Blast
4.7游戏规则
设计思路:设计int 变量state,当state=1,按回车进入单人模式;当state=2,按回车进入双人模式。当state等于5时,游戏胜利;当state=3时,游戏暂停;state等于4时,游戏失败。当游戏不处于暂停模式时,先用a记录state的值,再给state赋值。