1.团队名称、团队成员介绍
团名:嗷嗷嗷嗷嗷
吴军霖(组长)
- 写得一手好代码也改得一手好bug
- 代码整洁好看源于强迫症
- 大概没有什么不会的东西叭
- 真正的王者段位
欧阳震霆(组员)
- 同样擅长写代码
- 在青青草原上创造了僵尸家族
- 熟练掌握多线程等技术
- 也是王者段位
陈文杰(组员)
- 可代码可PPT可画图
- 创造太阳落在青青草地
- 熟练******等等厉害技术
- ***(隐藏段位)
刘艳钦(组员)
- 可代码可bug可博客
- 豌豆射手吐出豌豆
- 在数据库的危险边缘试探
- 擅长叨逼叨和细节控
- ***(隐藏段位)
2.项目git地址
3.项目git提交记录截图(要体现出每个人的提交记录、提交说明),老师将重点考核。
4.项目功能架构图与主要功能流程图
5.项目UML图
6.项目运行截图
7.项目关键代码(不能太多)
1.游戏界面效果###
- JLayeredPane为容器添加了深度,允许组件在需要时互相重叠。
- JLayeredPane将深度范围按 层 划分,在同一层内又对组件按位置进一步划分,将组件放入容器时需要指定组件所在的层,以及组件在该层内的 位置(position/index)。
层的编号越大越显示在前面;同层内位置编号越大越靠近底部 - 使用JLayeredPane对界面实现按层划分,使各组件按层级相覆盖,并实现组件对鼠标监听的优先级划分
- 代码定义了两个层级面板,一个作为游戏的选择界面,一个作为战斗界面
- 在选择界面中,在层级面板的底层添加背景图,在较上层添加各个功能按钮,而在最上层有一个不可见的登录注册组件(JPanel),点击登录按钮时将登录面板改为可见.点击游戏开始时,将窗体的层级面板换为战斗面板战斗面板中也是将背景图置于底层,将其它组件放在面板的较上层.将阳光所在层级设置高于其他组件可以实现阳光对鼠标的监听优先于其他组件,使得阳光收集事件可以优先于其他事件,如卡片的选取,铲子的点击和菜单的点击.点击时菜单时,各线程暂停,同样在最顶层使原来不可见的菜单面板设为可见.
private void chooseCards(){
Card card1 = new Card(GameFrame,"SunFlower", plantMap, controller);
card1.setBounds(85, 7, card1.getCardWidth(), card1.getCardHeight());
Cardboard.add(card1);
cardList.add(card1);
Card card2 = new Card(GameFrame,"Peashooter", plantMap, controller);
card2.setBounds(145, 7, card2.getCardWidth(), card2.getCardHeight());
Cardboard.add(card2);
cardList.add(card2);
}
class PaintThread implements Runnable{
JFrame frame;
PaintThread(LaunchFrame launchFrame) {
this.frame = launchFrame;
}
2.僵尸的产生
- 通过根据状态不断重绘僵尸来达到动画效果
/***** 正常移动 *****/
for (int i=1 ; this.x> minx && this.state==1 ; i++){
if(this.life<=50) {
this.state=2;
zombie.setPic(0);
zombie.setState(state);
break;
}
if(this.x==350)
this.life=20;
try {
if (i%11==0){
zombie.normalpicChange();
}
zombie.setBounds(x,y,300,300);
Thread.sleep(8);
if (i%7==0){
this.x--;
}
zombie.repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//正常换图
public void normalpicChange(){
if (pic < allPic[type])
pic++;
else
pic = 0;
}
public void normalwalk(){
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if(state == 1) {
ImageIcon img = new ImageIcon("Img\\Zombie"+type+"\\Frame"+pic+".png");
image = img.getImage();
Graphics2D g2 = (Graphics2D) g;
g2.drawImage(image, 0, 0, img.getIconWidth(), img.getIconHeight(), this);
}
}
3.太阳的收集
- 通过对鼠标的监听来判断是否收集到太阳
@Override
public void mouseClicked(MouseEvent e) {
if (!isCollected){
new Thread(new Collect(sun, x, y)).start();
frame.setCursor(Frame.DEFAULT_CURSOR);
isCollected = true;
}
}
class Collect implements Runnable{
private Sun sun;
private int x;
private int y;
Collect(Sun sun, int x, int y){
this.sun = sun;
this.sun.alpha = 100;
this.x = x;
this.y = y;
}
4.植物攻击
- 以豌豆射手发射子弹为例
- 碰撞检测:通过获得豌豆的坐标以及僵尸的坐标来算出两者的距离是否构成碰撞
private boolean touchZombie(){
List<Zombie> zombies = controller.getZombieLists().get(r);
if (zombies.isEmpty())
return false;
for (Zombie zombie:zombies){
int dis = Math.abs(x-40-zombie.getX());
if (dis<25&& zombie.getLife()>0){
zombie.getHurt();
return true;
}
}
return false;
}
8.代码静态扫描
-
第一次静态扫描的结果
-
全部修正后的结果
9.尚待改进或者新的想法
尚改进:游戏还是会出现卡顿现象,以及樱桃炸弹只能攻击前方的僵尸而不能攻击后方的僵尸等小bug,没有实现利用网络技术进行排名
新想法:实现更多的植物种植以及加入更多种类的僵尸,实现利用网络技术进行排名
10.团队成员任务分配,标明组长
- 吴军霖(组长):大部分的模块以及存档,读档等
- 欧阳震霆:僵尸,道具,游戏界面等
- 陈文杰:太阳模块等
- 刘艳钦:豌豆射手射出豌豆,登录界面,dao模式结合数据库以及团队博客等