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模式結合數據庫以及團隊博客等