




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1簡(jiǎn)單坦克游戲的面向?qū)ο髮?shí)現(xiàn)2簡(jiǎn)單坦克游戲的面向?qū)ο髮?shí)現(xiàn)本章的游戲例子涵蓋了Java語(yǔ)言的眾多特點(diǎn),比如繼承、封裝、抽象方法、靜態(tài)方法和靜態(tài)變量等等,并結(jié)合Java畫圖機(jī)制、線程機(jī)制和Java網(wǎng)絡(luò)通信三部分的知識(shí)點(diǎn)。本講概要坦克游戲復(fù)習(xí)坦克游戲面向?qū)ο笤O(shè)計(jì)面向?qū)ο蠓治鎏箍说拿嫦驅(qū)ο笤O(shè)計(jì)主窗體的設(shè)計(jì)坦克游戲復(fù)習(xí)坦克:圓心坐標(biāo):x、y半徑大?。?0坦克朝向:dir子彈:圓心坐標(biāo)、半徑、移動(dòng)方向坦克的移動(dòng):使用鍵盤按鍵機(jī)制改變圓心坐標(biāo),改變之后刷新畫面子彈的移動(dòng),使用線程機(jī)制控制面向?qū)ο蠓治龇治鎏箍舜髴?zhàn)小游戲,如圖1所示,一共有三種實(shí)體:坦克:Tank子彈:Bullet障礙物:Block除了這三種實(shí)體以外,我們還需要實(shí)體所在的場(chǎng)景類:場(chǎng)景:GameCanvas三種對(duì)象為了簡(jiǎn)單起見,暫不考慮障礙物。在上一講中開發(fā)坦克大戰(zhàn)的方法是傳統(tǒng)的結(jié)構(gòu)化的思想,本講我們改用面向?qū)ο蟮姆椒▉韺?shí)現(xiàn),可以針對(duì)坦克和子彈寫各寫一個(gè)類坦克的面向?qū)ο笤O(shè)計(jì)對(duì)于坦克,把類名設(shè)定為Tank,類是由屬性和方法構(gòu)成的,Tank類中的屬性和方法如下表所示(代碼見例1)Tank類的屬性坦克圓心坐標(biāo)(x,y)坦克半徑radius坦克朝向dirTank類的方法坦克移動(dòng)move()構(gòu)造方法Tank()坦克射擊shoot()例1:Tank類publicclassTank{
intx=100,y=100,dir=0,radius=20;publicTank(int
x,inty){this.x=x;this.y=y;}publicvoidmove(int
moveDir){
switch(moveDir) { case0:x=x-5;break;//0表示左
case1:y=y-5;break;//1表示上
case2:x=x+5;break;//2表示右
case3:y=y+5;break;//3表示下
}}}面向?qū)ο筇箍死L制雖然實(shí)現(xiàn)了Tank類,但是這個(gè)實(shí)現(xiàn)有意義嗎?接下來要考慮的是如何通過畫圖機(jī)制把坦克表現(xiàn)出來。若要畫出坦克,必須要使用Frame類的paint()方法,每一次變動(dòng)的時(shí)候調(diào)用repaint()方法重繪。paint()方法中畫圖的關(guān)鍵部分是Graphics對(duì)象g,該對(duì)象包含了與畫圖相關(guān)的所有方法,能不能把該對(duì)象“拿出來”,傳給需要使用它的對(duì)象,在繪制圖形的時(shí)候調(diào)用呢?答案是肯定的,F(xiàn)rame類提供了一個(gè)getGraphics()方法,該方法返回一個(gè)Graphics對(duì)象,使用這個(gè)返回的對(duì)象就能在任何地方進(jìn)行繪圖了。Frame類中在得到Graphics對(duì)象以后,只要傳給Tank對(duì)象,Tank對(duì)象調(diào)用move()方法改變坦克位置以后就可以進(jìn)行重繪了。面向?qū)ο筇箍死L制若要畫出坦克,必須要使用Frame類的paint()方法每一次變動(dòng)的時(shí)候調(diào)用repaint()方法重繪。paint()方法中畫圖的關(guān)鍵部分是Graphics對(duì)象g,該對(duì)象包含了與畫圖相關(guān)的所有方法,能不能把該對(duì)象“拿出來”,傳給需要使用它的對(duì)象,在繪制圖形的時(shí)候調(diào)用呢?面向?qū)ο筇箍死L制答案是肯定的,F(xiàn)rame類提供了一個(gè)getGraphics()方法,該方法返回一個(gè)Graphics對(duì)象,使用這個(gè)返回的對(duì)象就能在任何地方進(jìn)行繪圖了。Frame類中在得到Graphics對(duì)象以后,只要傳給Tank對(duì)象,Tank對(duì)象調(diào)用move()方法改變坦克位置以后就可以進(jìn)行重繪了。需要在Tank類的定義中增加一個(gè)Graphics對(duì)象和一個(gè)draw()方法,請(qǐng)看例2所示的代碼
面向?qū)ο筇箍死L制例2:增加繪制方法的Tank類importjava.awt.*;publicclassTank{
staticGraphicsg;
intx=100,y=100,dir=0,radius=20;publicTank(int
x,inty){this.x=x;this.y=y;}publicvoidmove(int
moveDir){
switch(moveDir){case0:x=x-5;break;//0表示左
case1:y=y-5;break;//1表示上
case2:x=x+5;break;//2表示右
case3:y=y+5;break;//3表示下
}draw();}publicvoiddraw(){
g.setColor(Color.blue);
g.fillOval(x,y,40,40);g.setColor(Color.red);
switch(dir){case0:g.drawLine(x,y,x-20,y);break;case1:g.drawLine(x,y,x,y-20);break;case2:g.drawLine(x+20,y,x,y);break;case3:g.drawLine(x,y,x,y+20);break;}}//坦克的射擊方法
publicvoidshoot(){}}面向?qū)ο罄L制的注意事項(xiàng)屬性g是一個(gè)靜態(tài)屬性,需要從外面?zhèn)鬟M(jìn)來,draw()方法使用g對(duì)象對(duì)坦克進(jìn)行繪制。需要對(duì)上一講的GameCanvas類做一定變動(dòng),在鍵盤按鍵事件中,直接調(diào)用player對(duì)象的move()方法,在move()方法中改變坦克的位置并進(jìn)行重繪例10-3給出了GameCanvas的代碼和運(yùn)行結(jié)果GameCanvas類中調(diào)用畫布的getGraphics()方法為g賦值。改造后的GameCanvas類importjava.awt.*;importjava.awt.event.*;publicclassGameCanvasextendsFrame{Tankplayer;publicGameCanvas(){player=newTank(100,100);classKLimplementsKeyListener{publicvoidkeyPressed(KeyEvente){}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){switch(e.getKeyChar()){case'a':
player.dir=0;player.move(0);break;case'w':
player.dir=1;player.move(1);break;case'd':
player.dir=2;player.move(2);break;case's':
player.dir=3;player.move(3);break;}}}
addKeyListener(newKL());}publicvoidpaint(Graphicsg){Tank.g=this.getGraphics();
player.draw();}publicstaticvoidmain(String[]args){GameCanvasgame=newGameCanvas();game.setSize(600,400);
game.setVisible(true);}}注意這里的變化改造后的GameCanvas類運(yùn)行效果坦克移動(dòng)的尾巴從上圖可以看到,坦克行動(dòng)之后會(huì)留下一條長(zhǎng)長(zhǎng)的“尾巴”,這是我們不希望看到的,為了解決這個(gè)問題,我們必須在Tank類中設(shè)置兩個(gè)變量oldX和oldY,用來記錄坦克移動(dòng)之前的坐標(biāo),在移動(dòng)之后使用這兩個(gè)值擦掉“尾巴”,具體如例10-4所示。修改Tank類,使坦克移動(dòng)后不留下軌跡importjava.awt.*;publicclassTank{staticGraphicsg;
intx=100,y=100,dir=0,radius=20;
int
oldX,oldY;//保存移動(dòng)前的坐標(biāo)
publicTank(int
x,inty){this.x=x;this.y=y;}publicvoidmove(int
moveDir){oldX=x;oldY=y;
switch(moveDir){case0:x=x-5;break;//0表示左
case1:y=y-5;break;//1表示上
case2:x=x+5;break;//2表示右
case3:y=y+5;break;//3表示下
}draw();}
publicvoiddraw(){//擦除移動(dòng)前的圖形
g.setColor(Color.white);g.fillRect(oldX-20,oldY-20,40,40);
g.setColor(Color.blue);g.fillOval(x-20,y-20,40,40);
g.setColor(Color.red);
switch(dir){case0:g.drawLine(x,y,x-20,y);break;case1:g.drawLine(x,y,x,y-20);break;case2:g.drawLine(x+20,y,x,y);break;case3:g.drawLine(x,y,x,y+20);break;}}//坦克的射擊方法
publicvoidshoot(){}}子彈射擊的面向?qū)ο髮?shí)現(xiàn)Tank類中的shoot()方法是坦克射擊的方法,坦克射擊的動(dòng)作會(huì)產(chǎn)生一顆子彈,所以必須在實(shí)現(xiàn)子彈類后再來討論這個(gè)方法的實(shí)現(xiàn)。右表列出了子彈類Bullet的屬性和方法
Bullet類的屬性子彈圓心坐標(biāo)(x,y)移動(dòng)前的圓心坐標(biāo)(oldX,oldY)子彈方向dir子彈半徑radius是否可以移動(dòng)canMove繪圖對(duì)象gBullet類的方法子彈移動(dòng)move()繪圖方法draw()子彈自動(dòng)移動(dòng)go()Bullet類的代碼importjava.awt.*;publicclassBullet{staticGraphicsg;
int
x,y,dir=0,radius=5;
int
oldX,oldY;//保存移動(dòng)前的坐標(biāo)
boolean
canMove=true;publicBullet(int
x,int
y,intdir){this.x=x;this.y=y;this.dir=dir;}publicvoidmove(int
moveDir){oldX=x;oldY=y;
switch(moveDir){case0:x=x-5;break;//0表示左
case1:y=y-5;break;//1表示上
case2:x=x+5;break;//2表示右
case3:y=y+5;break;//3表示下
}draw();}
publicvoiddraw(){//擦除移動(dòng)前的圖形
g.setColor(Color.white);g.fillRect(oldX-5,oldY-5,10,10);
if(canMove){g.setColor(Color.red);g.fillOval(x-5,y-5,10,10);}}publicvoidgo(){}}Bullet類的說明Bullet類與Tank類的不同之處在于Bullet沒有shoot()方法子彈的半徑要比坦克的半徑小,顏色是紅色的Bullet多了一個(gè)布爾變量canMove,該對(duì)象的作用是判斷子彈是否已經(jīng)消失,因?yàn)樽訌棑糁心繕?biāo)或者移出邊界以后,就可以宣告子彈結(jié)束了生命周期了,當(dāng)canMove是true時(shí),子彈還在移動(dòng)中否則,子彈已經(jīng)“死亡”Bullet類的說明子彈的產(chǎn)生是由坦克決定的,當(dāng)我們按下鍵盤的某個(gè)鍵時(shí)候,就會(huì)調(diào)用坦克的shoot()方法,控制坦克發(fā)炮,然后產(chǎn)生一個(gè)子彈,子彈自動(dòng)向前移動(dòng)。我們?cè)O(shè)定按下“K”鍵的時(shí)候發(fā)射一顆子彈,需要對(duì)GameCanva做相應(yīng)改動(dòng)。坦克類的shoot()方法按照簡(jiǎn)單的設(shè)想,shoot()方法的流程應(yīng)該如下:第一步:產(chǎn)生一個(gè)Bullet對(duì)象;第二步:調(diào)用Bullet對(duì)象的go()方法,讓子彈自動(dòng)移動(dòng)。根據(jù)這個(gè)設(shè)想來實(shí)現(xiàn)Tank類的shoot()方法。shoot()方法的代碼publicvoidshoot(){ Bulletb=null;
switch(dir) { case0:b=newBullet(x-25,y,dir);break;//左
case1:b=newBullet(x,y-25,dir);break;//上
case2:b=newBullet(x+25,y,dir);break;//右
case3:b=newBullet(x,y+25,dir);break;//下
}
//讓自己go出去,自生自滅吧
b.go();}子彈移動(dòng)go()方法關(guān)鍵的邏輯就在于go()方法了,go()方法是子彈自動(dòng)移動(dòng)的方法,涉及到線程機(jī)制,應(yīng)該創(chuàng)建子彈移動(dòng)線程,在這個(gè)線程中調(diào)用move()方法定時(shí)移動(dòng),這個(gè)線程類的名字是BulletMovement子彈移動(dòng)類publicclassBull
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 西安建筑科技大學(xué)華清學(xué)院《安裝工程計(jì)量與計(jì)價(jià)實(shí)訓(xùn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州輕工業(yè)大學(xué)《數(shù)據(jù)分析與大數(shù)據(jù)技術(shù)的數(shù)學(xué)基礎(chǔ)》2023-2024學(xué)年第二學(xué)期期末試卷
- 做賬實(shí)操-快遞公司加盟商保證金的賬務(wù)處理分錄
- 2025年江西省建筑安全員考試題庫(kù)附答案
- 四川建筑職業(yè)技術(shù)學(xué)院《建筑材料(B)》2023-2024學(xué)年第二學(xué)期期末試卷
- 中國(guó)地質(zhì)大學(xué)(北京)《熱力系統(tǒng)工程與仿真》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟(jì)寧職業(yè)技術(shù)學(xué)院《植物營(yíng)養(yǎng)與肥料學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 河南水利與環(huán)境職業(yè)學(xué)院《栽培與耕作學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 楊凌職業(yè)技術(shù)學(xué)院《飛行控制系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣東文理職業(yè)學(xué)院《輻射防護(hù)課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- HRBP工作總結(jié)與計(jì)劃
- 八大危險(xiǎn)作業(yè)安全培訓(xùn)考試試題及答案
- 2025年湖南高速鐵路職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 2025年上半年中電科太力通信科技限公司招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年沙洲職業(yè)工學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- DB3502T052-2019 家政服務(wù)規(guī)范 家庭搬家
- 會(huì)計(jì)學(xué)專業(yè)數(shù)智化轉(zhuǎn)型升級(jí)實(shí)踐
- JJG 1204-2025電子計(jì)價(jià)秤檢定規(guī)程(試行)
- 中國(guó)糖尿病防治指南(2024版)解讀-1
- 2024年計(jì)算機(jī)二級(jí)WPS考試題庫(kù)(共380題含答案)
- 2024年德州職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)
評(píng)論
0/150
提交評(píng)論