java植物大战僵尸思路_JAVA课程设计——植物大战僵尸(团队)
#1.團(tuán)隊(duì)名稱、團(tuán)隊(duì)成員介紹 ##團(tuán)名:嗷嗷嗷嗷嗷 ###吳軍霖(組長(zhǎng))
寫得一手好代碼也改得一手好bug
代碼整潔好看源于強(qiáng)迫癥
大概沒有什么不會(huì)的東西叭
真正的王者段位 ###歐陽震霆(組員)
同樣擅長(zhǎng)寫代碼
在青青草原上創(chuàng)造了僵尸家族
熟練掌握多線程等技術(shù)
也是王者段位 ###陳文杰(組員)
可代碼可PPT可畫圖
創(chuàng)造太陽落在青青草地
熟練******等等厲害技術(shù)
***(隱藏段位) ###劉艷欽(組員)
可代碼可bug可博客
豌豆射手吐出豌豆
在數(shù)據(jù)庫(kù)的危險(xiǎn)邊緣試探
擅長(zhǎng)叨逼叨和細(xì)節(jié)控
***(隱藏段位)
#2.項(xiàng)目git地址
戳我叭~!!!
#3.項(xiàng)目git提交記錄截圖(要體現(xiàn)出每個(gè)人的提交記錄、提交說明),老師將重點(diǎn)考核。
#4.項(xiàng)目功能架構(gòu)圖與主要功能流程圖
#5.項(xiàng)目UML圖
#6.項(xiàng)目運(yùn)行截圖
#7.項(xiàng)目關(guān)鍵代碼(不能太多) ###1.游戲界面效果###
JLayeredPane為容器添加了深度,允許組件在需要時(shí)互相重疊。
JLayeredPane將深度范圍按 層 劃分,在同一層內(nèi)又對(duì)組件按位置進(jìn)一步劃分,將組件放入容器時(shí)需要指定組件所在的層,以及組件在該層內(nèi)的 位置(position/index)。 層的編號(hào)越大越顯示在前面;同層內(nèi)位置編號(hào)越大越靠近底部
使用JLayeredPane對(duì)界面實(shí)現(xiàn)按層劃分,使各組件按層級(jí)相覆蓋,并實(shí)現(xiàn)組件對(duì)鼠標(biāo)監(jiān)聽的優(yōu)先級(jí)劃分
代碼定義了兩個(gè)層級(jí)面板,一個(gè)作為游戲的選擇界面,一個(gè)作為戰(zhàn)斗界面
在選擇界面中,在層級(jí)面板的底層添加背景圖,在較上層添加各個(gè)功能按鈕,而在最上層有一個(gè)不可見的登錄注冊(cè)組件(JPanel),點(diǎn)擊登錄按鈕時(shí)將登錄面板改為可見.點(diǎn)擊游戲開始時(shí),將窗體的層級(jí)面板換為戰(zhàn)斗面板戰(zhàn)斗面板中也是將背景圖置于底層,將其它組件放在面板的較上層.將陽光所在層級(jí)設(shè)置高于其他組件可以實(shí)現(xiàn)陽光對(duì)鼠標(biāo)的監(jiān)聽優(yōu)先于其他組件,使得陽光收集事件可以優(yōu)先于其他事件,如卡片的選取,鏟子的點(diǎn)擊和菜單的點(diǎn)擊.點(diǎn)擊時(shí)菜單時(shí),各線程暫停,同樣在最頂層使原來不可見的菜單面板設(shè)為可見.
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.僵尸的產(chǎn)生
通過根據(jù)狀態(tài)不斷重繪僵尸來達(dá)到動(dòng)畫效果
/***** 正常移動(dòng) *****/
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.太陽的收集
通過對(duì)鼠標(biāo)的監(jiān)聽來判斷是否收集到太陽
@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.植物攻擊
以豌豆射手發(fā)射子彈為例
碰撞檢測(cè):通過獲得豌豆的坐標(biāo)以及僵尸的坐標(biāo)來算出兩者的距離是否構(gòu)成碰撞
private boolean touchZombie(){
List 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.代碼靜態(tài)掃描
第一次靜態(tài)掃描的結(jié)果
全部修正后的結(jié)果
#9.尚待改進(jìn)或者新的想法 尚改進(jìn):游戲還是會(huì)出現(xiàn)卡頓現(xiàn)象,以及櫻桃炸彈只能攻擊前方的僵尸而不能攻擊后方的僵尸等小bug,沒有實(shí)現(xiàn)利用網(wǎng)絡(luò)技術(shù)進(jìn)行排名 新想法:實(shí)現(xiàn)更多的植物種植以及加入更多種類的僵尸,實(shí)現(xiàn)利用網(wǎng)絡(luò)技術(shù)進(jìn)行排名
#10.團(tuán)隊(duì)成員任務(wù)分配,標(biāo)明組長(zhǎng)
吳軍霖(組長(zhǎng)):大部分的模塊以及存檔,讀檔等
歐陽震霆:僵尸,道具,游戲界面等
陳文杰:太陽模塊等
劉艷欽:豌豆射手射出豌豆,登錄界面,dao模式結(jié)合數(shù)據(jù)庫(kù)以及團(tuán)隊(duì)博客等
總結(jié)
以上是生活随笔為你收集整理的java植物大战僵尸思路_JAVA课程设计——植物大战僵尸(团队)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教你添加百度分享按钮
- 下一篇: 上银驱动器使用手册_上银伺服电机调试说明