猿學(xué)-java實現(xiàn)坦克大戰(zhàn)游戲--坦克發(fā)射子彈

一唉窃、任務(wù)需求

添加hero坦克子彈并且發(fā)射窟蓝。

二、思路

1.創(chuàng)建子彈類

1.由于每顆子彈都是一個獨立的線程篮绿,會不斷變換子彈坐標孵延,所以子彈類要實現(xiàn)Runnable接口。

2.子彈需要坐標x,y以及方向亲配,所以構(gòu)造函數(shù)有三個參數(shù)尘应。

3.實現(xiàn)Runnable接口后惶凝,要覆蓋run方法:

????1.如果不讓線程sleep,子彈飛出去很快犬钢,快到在屏幕如上瞬間消失苍鲜。

????2.所以增加一個sleep()

????3.另外,子彈需要判斷四個方向玷犹,增加switch語句

????4.子彈跑出屏幕需要死亡混滔,增加變量islive判斷是否存活。否則無限制飛行歹颓,不斷占用內(nèi)存空間坯屿。

2.hero坦克類中加入shotEnemy()方法,表示發(fā)射子彈

1.新建子彈變量s

????Shot s = null;

2.判斷開火的方向巍扛,增加switch語句领跛。

3.開火后,啟動線程撤奸。

Thread t =newThread(s);

????t.start();

3.完成子彈實現(xiàn)過程吠昭,接著要在屏幕中讓子彈顯示,即畫出子彈

1.paintComponent方法里加入寂呛,畫出子彈

????判斷子彈是否存活

????hero.s!=null很重要怎诫,游戲剛開始沒有發(fā)射子彈,hero.s=null贷痪,此時進入if去畫子彈會出現(xiàn)異常。

????if(hero.s!=null&&hero.s.isLive==true){

????????g.setColor(Color.red);

????????g.draw3DRect(hero.s.x, hero.s.y, 1, 1, false);

????}

2.在KeyPressed監(jiān)聽器處添加蹦误,按下J鍵發(fā)射一顆子彈

????if(e.getKeyCode()==KeyEvent.VK_J){

????????hero.shotEnemy();

????}

4.MyPanel實現(xiàn)Runnable接口

1.由于子彈打出去后劫拢,需要不斷讓它顯示,屏幕每隔一段時間需要repaint()

????所以重載run()方法强胰,讓MyPanel每隔一段時間repaint()一次

????publicvoidrun() {

????while(true){

????????try{

????????????Thread.sleep(100);//休息100ms舱沧,重畫一次MyPanel

????????} catch(Exception e) {

????????????e.printStackTrace();

????????}

????????repaint();

????}

5.由于MyPanel實現(xiàn)了Runnable接口,所以讓該線程跑起來

1.在MyTankGame方法中啟動線程即可

????p1 = newMyPanel();

????????Thread t = newThread(p1);

????????t.start();

三偶洋、代碼如下

MyTankGame.java

<?喎?"https://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;">?/** * 功能:坦克游戲的2.0 * 1.畫出坦克 * 2.坦克的移動 * 3.坦克發(fā)射子彈 */ package Tank_03; import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JPanel; @SuppressWarnings("serial") public class MyTankGame2 extends JFrame{ MyPanel p1 = null; public MyTankGame2(){ p1 = new MyPanel(); Thread t = new Thread(p1); t.start(); add(p1); setSize(400, 300); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addKeyListener(p1);//注冊監(jiān)聽 } public static void main(String[] args) { new MyTankGame2(); } } //畫圖 @SuppressWarnings("serial") class MyPanel extends JPanel implements KeyListener,Runnable{ Hero hero = null; Vector?ets = new Vector(); int enSize = 3; public MyPanel(){ hero = new Hero(100,100);//設(shè)置坦克出現(xiàn)的位置(10熟吏,10) // 初始化敵人的坦克 for(int i=0;i坦克的顏色(類型:敵方坦克,我方坦克)玄窝,方向牵寺,出現(xiàn)的坐標 * * 如果type是default 則默認顏色為畫出黑色坦克 * * 封裝性:將坦克封裝到方法中。 * */ public void drawTank(int x,int y,Graphics g,int direct,int type){ switch (type) { case 0: g.setColor(Color.cyan); break; case 1: g.setColor(Color.yellow); default: break; } switch (direct) { case 0: //向上 g.fill3DRect(x , y , 5 , 30, false); g.fill3DRect(x+15, y , 5 , 30, false); g.fill3DRect(x+5 , y+5 , 10, 20, false); g.fillOval(x+4, y+10, 10 , 10); g.drawLine(x+9, y+15, x+9, y ); break; case 1: //向下w g.fill3DRect(x , y , 5 , 30, false); g.fill3DRect(x+15, y , 5 , 30, false); g.fill3DRect(x+5 , y+5 , 10, 20, false); g.fillOval(x+4, y+10, 10 , 10); g.drawLine(x+9, y+15, x+9, y+30 ); break; case 2: //向左 g.fill3DRect(x , y , 30, 5 , false); g.fill3DRect(x , y+15 , 30, 5 , false); g.fill3DRect(x+5 , y+5 , 20, 10, false); g.fillOval(x+9 , y+4, 10 , 10 ); g.drawLine(x+5, y+9, x-4, y+9); break; case 3: //向右 g.fill3DRect(x , y , 30, 5 , false); g.fill3DRect(x , y+15 , 30, 5 , false); g.fill3DRect(x+5 , y+5 , 20, 10, false); g.fillOval(x+9 , y+4, 10 , 10 ); g.drawLine(x+15, y+9, x+30, y+9); break; default: break; } //repaint(); 因為監(jiān)聽器里面有repaint() 所以不用在加repaint()了 } @Override public void keyTyped(KeyEvent e) { } @Override public void keyPressed(KeyEvent e) {//實現(xiàn)接口 根據(jù)按鍵上下左右移動 可以控制速度和移動 if(e.getKeyCode()==KeyEvent.VK_W){ hero.setDirect(0); hero.moveUp(); }else if(e.getKeyCode()==KeyEvent.VK_S){ hero.setDirect(1); hero.moveDown(); }else if(e.getKeyCode()==KeyEvent.VK_A){ hero.setDirect(2); hero.moveLeft(); }else if(e.getKeyCode()==KeyEvent.VK_D){ hero.setDirect(3); hero.moveRight(); } if(e.getKeyCode()==KeyEvent.VK_J){ //開火 hero.shotEnemy(); } //判斷玩家是否按下J攻擊鍵 repaint(); } @Override public void keyReleased(KeyEvent e) { } //@Override public void run() { //每隔100毫秒 重新畫圖 while(true){ try { Thread.sleep(100); } catch (Exception e) { e.printStackTrace(); } repaint(); } } }

members.java

packageTank_03;

//坦克父類? 可以設(shè)置坦克出現(xiàn)位置(x恩脂,y)

classTank {

????intx = 0;

????inty = 0;

????intspeed = 10;

????intDirect = 0;

????intcolor;

????publicintgetColor() {

????????returncolor;

????}

????publicvoidsetColor(intcolor) {

????????this.color = color;

????}

????publicintgetDirect() {

????????returnDirect;

????}

????publicvoidsetDirect(intdirect) {

????????Direct = direct;

????}

????publicintgetSpeed() {

????????returnspeed;

????}

????publicvoidsetSpeed(intspeed) {

????????this.speed = speed;

????}

????publicTank (intx,inty){

????????this.x = x;

????????this.y = y;

????}

????publicintgetX() {

????????returnx;

????}

????publicvoidsetX(intx) {

????????this.x = x;

????}

????publicintgetY() {

????????returny;

????}

????publicvoidsetY(inty) {

????????this.y = y;

????}



????//視頻中是把移動放在hero類中


}

//敵方坦克

classEnemyTank extendsTank{


????publicEnemyTank(intx, inty) {

????????super(x, y);

????}

}

//我的英雄坦克

classHero extendsTank{


????//子彈

????Shot s = null;


????publicHero(intx,inty){

????????super(x, y);

????}

????//開火

????publicvoidshotEnemy(){


????????switch(Direct) {

????????case0:

????????????s = newShot(x+8,y-4,0);

????????????break;

????????case1:

????????????s = newShot(x+9,y+32,1);

????????????break;

????????case2:

????????????s = newShot(x-8,y+8,2);

????????????break;

????????case3:

????????????s = newShot(x+32,y+9,3);

????????????break;

????????default:

????????????break;

????????}

????????Thread t =newThread(s);

????????t.start();

????}

????publicvoidmoveUp(){

????????y-=speed;

????}

????publicvoidmoveDown(){

????????y+=speed;

????}

????publicvoidmoveLeft(){

????????x-=speed;

????}

????publicvoidmoveRight(){

????????x+=speed;

????}

}

//子彈類

classShot implementsRunnable{

????intx;

????inty;

????intDirect;

????intspeed = 5;

????booleanisLive = true;

????publicShot(intx,inty,intDirect){

????????this.x=x;

????????this.y=y;

????????this.Direct = Direct;

????}

????@Override


????publicvoidrun() {

????????while(true){

????????????try{

????????????????Thread.sleep(50);

????????????} catch(Exception e) {

????????????????// TODO: handle exception

????????????}

????????????switch(Direct){

????????????case0:

????????????????y-=speed;

????????????????break;

????????????case1:

????????????????y+=speed;

????????????????break;

????????????case2:

????????????????x-=speed;

????????????????break;

????????????case3:

????????????????x+=speed;

????????????????break;

????????????default:

????????????????break;

????????????}


//????????? System.out.println(""+x+" "+y);

????????????//子彈何時死亡

????????????if(x<0||x>400||y<0||y>300){

????????????????isLive = false;

????????????????break;

????????????}

????????}

????}

}

四帽氓、效果圖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俩块,隨后出現(xiàn)的幾起案子黎休,更是在濱河造成了極大的恐慌浓领,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势腮,死亡現(xiàn)場離奇詭異联贩,居然都是意外死亡,警方通過查閱死者的電腦和手機捎拯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門泪幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玄渗,你說我怎么就攤上這事座菠。” “怎么了藤树?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵浴滴,是天一觀的道長。 經(jīng)常有香客問我岁钓,道長升略,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任屡限,我火速辦了婚禮品嚣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钧大。我一直安慰自己翰撑,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布啊央。 她就那樣靜靜地躺著眶诈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓜饥。 梳的紋絲不亂的頭發(fā)上逝撬,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音乓土,去河邊找鬼宪潮。 笑死,一個胖子當著我的面吹牛趣苏,可吹牛的內(nèi)容都是我干的狡相。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼拦键,長吁一口氣:“原來是場噩夢啊……” “哼谣光!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芬为,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤萄金,失蹤者是張志新(化名)和其女友劉穎蟀悦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氧敢,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡日戈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了孙乖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浙炼。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖唯袄,靈堂內(nèi)的尸體忽然破棺而出弯屈,到底是詐尸還是另有隱情,我是刑警寧澤恋拷,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布资厉,位于F島的核電站,受9級特大地震影響蔬顾,放射性物質(zhì)發(fā)生泄漏宴偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一诀豁、第九天 我趴在偏房一處隱蔽的房頂上張望窄刘。 院中可真熱鬧,春花似錦舷胜、人聲如沸娩践。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欺矫。三九已至,卻和暖如春展氓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脸爱。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工遇汞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人簿废。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓空入,卻偏偏與公主長得像,于是被迫代替她去往敵國和親族檬。 傳聞我的和親對象是個殘疾皇子歪赢,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容