![第一講-面向?qū)ο笥螒蛟O(shè)計_第1頁](http://file4.renrendoc.com/view8/M01/0B/22/wKhkGWb22CmARYy9AAHzkG_8oIM348.jpg)
![第一講-面向?qū)ο笥螒蛟O(shè)計_第2頁](http://file4.renrendoc.com/view8/M01/0B/22/wKhkGWb22CmARYy9AAHzkG_8oIM3482.jpg)
![第一講-面向?qū)ο笥螒蛟O(shè)計_第3頁](http://file4.renrendoc.com/view8/M01/0B/22/wKhkGWb22CmARYy9AAHzkG_8oIM3483.jpg)
![第一講-面向?qū)ο笥螒蛟O(shè)計_第4頁](http://file4.renrendoc.com/view8/M01/0B/22/wKhkGWb22CmARYy9AAHzkG_8oIM3484.jpg)
![第一講-面向?qū)ο笥螒蛟O(shè)計_第5頁](http://file4.renrendoc.com/view8/M01/0B/22/wKhkGWb22CmARYy9AAHzkG_8oIM3485.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1簡單坦克游戲的面向?qū)ο髮崿F(xiàn)2簡單坦克游戲的面向?qū)ο髮崿F(xiàn)本章的游戲例子涵蓋了Java語言的眾多特點,比如繼承、封裝、抽象方法、靜態(tài)方法和靜態(tài)變量等等,并結(jié)合Java畫圖機制、線程機制和Java網(wǎng)絡(luò)通信三部分的知識點。本講概要坦克游戲復(fù)習(xí)坦克游戲面向?qū)ο笤O(shè)計面向?qū)ο蠓治鎏箍说拿嫦驅(qū)ο笤O(shè)計主窗體的設(shè)計坦克游戲復(fù)習(xí)坦克:圓心坐標:x、y半徑大?。?0坦克朝向:dir子彈:圓心坐標、半徑、移動方向坦克的移動:使用鍵盤按鍵機制改變圓心坐標,改變之后刷新畫面子彈的移動,使用線程機制控制面向?qū)ο蠓治龇治鎏箍舜髴?zhàn)小游戲,如圖1所示,一共有三種實體:坦克:Tank子彈:Bullet障礙物:Block除了這三種實體以外,我們還需要實體所在的場景類:場景:GameCanvas三種對象為了簡單起見,暫不考慮障礙物。在上一講中開發(fā)坦克大戰(zhàn)的方法是傳統(tǒng)的結(jié)構(gòu)化的思想,本講我們改用面向?qū)ο蟮姆椒▉韺崿F(xiàn),可以針對坦克和子彈寫各寫一個類坦克的面向?qū)ο笤O(shè)計對于坦克,把類名設(shè)定為Tank,類是由屬性和方法構(gòu)成的,Tank類中的屬性和方法如下表所示(代碼見例1)Tank類的屬性坦克圓心坐標(x,y)坦克半徑radius坦克朝向dirTank類的方法坦克移動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制雖然實現(xiàn)了Tank類,但是這個實現(xiàn)有意義嗎?接下來要考慮的是如何通過畫圖機制把坦克表現(xiàn)出來。若要畫出坦克,必須要使用Frame類的paint()方法,每一次變動的時候調(diào)用repaint()方法重繪。paint()方法中畫圖的關(guān)鍵部分是Graphics對象g,該對象包含了與畫圖相關(guān)的所有方法,能不能把該對象“拿出來”,傳給需要使用它的對象,在繪制圖形的時候調(diào)用呢?答案是肯定的,F(xiàn)rame類提供了一個getGraphics()方法,該方法返回一個Graphics對象,使用這個返回的對象就能在任何地方進行繪圖了。Frame類中在得到Graphics對象以后,只要傳給Tank對象,Tank對象調(diào)用move()方法改變坦克位置以后就可以進行重繪了。面向?qū)ο筇箍死L制若要畫出坦克,必須要使用Frame類的paint()方法每一次變動的時候調(diào)用repaint()方法重繪。paint()方法中畫圖的關(guān)鍵部分是Graphics對象g,該對象包含了與畫圖相關(guān)的所有方法,能不能把該對象“拿出來”,傳給需要使用它的對象,在繪制圖形的時候調(diào)用呢?面向?qū)ο筇箍死L制答案是肯定的,F(xiàn)rame類提供了一個getGraphics()方法,該方法返回一個Graphics對象,使用這個返回的對象就能在任何地方進行繪圖了。Frame類中在得到Graphics對象以后,只要傳給Tank對象,Tank對象調(diào)用move()方法改變坦克位置以后就可以進行重繪了。需要在Tank類的定義中增加一個Graphics對象和一個draw()方法,請看例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制的注意事項屬性g是一個靜態(tài)屬性,需要從外面?zhèn)鬟M來,draw()方法使用g對象對坦克進行繪制。需要對上一講的GameCanvas類做一定變動,在鍵盤按鍵事件中,直接調(diào)用player對象的move()方法,在move()方法中改變坦克的位置并進行重繪例10-3給出了GameCanvas的代碼和運行結(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類運行效果坦克移動的尾巴從上圖可以看到,坦克行動之后會留下一條長長的“尾巴”,這是我們不希望看到的,為了解決這個問題,我們必須在Tank類中設(shè)置兩個變量oldX和oldY,用來記錄坦克移動之前的坐標,在移動之后使用這兩個值擦掉“尾巴”,具體如例10-4所示。修改Tank類,使坦克移動后不留下軌跡importjava.awt.*;publicclassTank{staticGraphicsg;
intx=100,y=100,dir=0,radius=20;
int
oldX,oldY;//保存移動前的坐標
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(){//擦除移動前的圖形
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ū)ο髮崿F(xiàn)Tank類中的shoot()方法是坦克射擊的方法,坦克射擊的動作會產(chǎn)生一顆子彈,所以必須在實現(xiàn)子彈類后再來討論這個方法的實現(xiàn)。右表列出了子彈類Bullet的屬性和方法
Bullet類的屬性子彈圓心坐標(x,y)移動前的圓心坐標(oldX,oldY)子彈方向dir子彈半徑radius是否可以移動canMove繪圖對象gBullet類的方法子彈移動move()繪圖方法draw()子彈自動移動go()Bullet類的代碼importjava.awt.*;publicclassBullet{staticGraphicsg;
int
x,y,dir=0,radius=5;
int
oldX,oldY;//保存移動前的坐標
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(){//擦除移動前的圖形
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多了一個布爾變量canMove,該對象的作用是判斷子彈是否已經(jīng)消失,因為子彈擊中目標或者移出邊界以后,就可以宣告子彈結(jié)束了生命周期了,當canMove是true時,子彈還在移動中否則,子彈已經(jīng)“死亡”Bullet類的說明子彈的產(chǎn)生是由坦克決定的,當我們按下鍵盤的某個鍵時候,就會調(diào)用坦克的shoot()方法,控制坦克發(fā)炮,然后產(chǎn)生一個子彈,子彈自動向前移動。我們設(shè)定按下“K”鍵的時候發(fā)射一顆子彈,需要對GameCanva做相應(yīng)改動。坦克類的shoot()方法按照簡單的設(shè)想,shoot()方法的流程應(yīng)該如下:第一步:產(chǎn)生一個Bullet對象;第二步:調(diào)用Bullet對象的go()方法,讓子彈自動移動。根據(jù)這個設(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();}子彈移動go()方法關(guān)鍵的邏輯就在于go()方法了,go()方法是子彈自動移動的方法,涉及到線程機制,應(yīng)該創(chuàng)建子彈移動線程,在這個線程中調(diào)用move()方法定時移動,這個線程類的名字是BulletMovement子彈移動類publicclassBull
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 攪拌罐車租賃合同
- 三農(nóng)產(chǎn)品電商平臺運營與管理作業(yè)指導(dǎo)書
- 農(nóng)業(yè)投資項目評估與分析作業(yè)指導(dǎo)書
- 頒獎活動策劃書
- 2025年三明貨車上崗證理論模擬考試題庫
- 2025年松原貨運資格證考試
- 2025年臨夏貨運從業(yè)資格證模擬考試題
- 2025年婁底貨運運輸駕駛員從業(yè)資格證考試試題
- 電力設(shè)備采購合同(2篇)
- 2024年領(lǐng)軍高考生物一輪復(fù)習(xí)專題01走近細胞含解析
- 2024年計算機二級WPS考試題庫(共380題含答案)
- 【履職清單】2024版安全生產(chǎn)責(zé)任體系重點崗位履職清單
- 2022年全國醫(yī)學(xué)博士英語統(tǒng)一考試試題
- 學(xué)校工作總結(jié)和存在的不足及整改措施
- 《工業(yè)自動化技術(shù)》課件
- (績效考核)鉗工技能鑒定考核試題庫
- 215kWh工商業(yè)液冷儲能電池一體柜用戶手冊
- 裝卸工安全培訓(xùn)課件
- 腿部經(jīng)絡(luò)課件教學(xué)課件
- 中小學(xué)校崗位安全工作指南
- 小數(shù)加減乘除計算題大全(300題大全)
評論
0/150
提交評論