新手小項目-java坦克大戰


1.界面(圖形化-前端部分)

  • 圖形化用於交互,不管是用文字形式給用戶選擇,還是圖形方式式的選擇都是一種交互方式。在java中如果我們需要用到圖形界面,就得想到GUI(Graphic user interface),那么我們需要用到什么,就直接去查看API(圖形化顯示能讓我們做完項目后將結果看得舒服,而不是全部都是代碼)
  • 要做GUI,就要想到java中的AWT(abstract windows toolkit),我們寫圖形化都需要用到這個類庫。那為什么叫抽象窗口呢?因為java是跨平台的,java編寫的界面源程序最后在計算機的實現可能由其他語言來最終完成。(AWT的初衷是與平台無關性,意思就是界面在任何操作系統上顯示的長寬等格局都不會發生變化,保持審美。但是AWT在設計的時候用了關於操作系統的相關東西,沒有做到完全的跨平台。AWT的運行沒有用到java虛擬機。但是swing開發包用到了java虛擬機,它是完全跨平台的,所以現在都用swing,但是它的基礎知識還是AWT)
  • 說到AWT我們就要理解component與container的的區別,見API。component是一切可顯示的東西,container繼承了component,所以container也是可顯示的東西,但是container又有一個特性,可以包含一切可見的東西。所以container可以容納conponent,也可以容納它自己。(知道前端工程師知識的也應該能理解container與conponent制之間的區別)
  •  

2.編寫窗口windows

  • 我們需要知道窗口顯示了哪些東西。百度搜索這個小游戲,或者上小游戲網站玩幾次就可以知道游戲規則了http://www.7k7k.com/swf/129505.htm
  • 我們可以看到游戲界面和游戲玩法
  •  

  •  

  • 先畫一個窗口,在編寫一個窗口時我們所需要的方法都可以在Frame類中copy下來,以防自己寫錯。我們需要的窗口:黑底,邊框可以隨着拖動而改變,設置窗口大小,窗口上方寫着tankgame(總共四個要求)
  •  

  • 在windows類中我們可以找到這些方法:(1)setSize(int width, int height)(2)setVisible(boolean b)
  • 在Frame類中我們可以找到這些方法:(1)setTitle(String title)(2)setResizable(boolean resizable) (3) setBackground(Color bgColor)
  • 編寫的程序遇到的問題(1)應該進入java文件所在的目錄。(2)數據類型的問題(見我的java數據類型)
  •  

     1 import java.awt.*;
     2 public class TankGame extends Frame {
     3   public void showFrame(){
     4     setBackground(Color.black);
     5     setTitle("tankgame");
     6     setResizable(true);
     7     setVisible(true);
     8     setSize(514,450);
     9     
    10     
    11 
    12   }
    13 
    14 
    15   
    16   public static void main(String[] args){
    17    
    18 
    19     new TankGame().showFrame();
    20 
    21 
    22   }
    23   

  •  

    關掉這個界面需要在命令行輸入ctrl+c(還沒進行事件處理,就像你為別人創造了一個東西,但是你還沒有為別人刪除一個東西的能力,那個叉叉只是一個圖像,沒有任何意義,跟界面上的每個圖像一樣,都是圖像)

  • 計算機屏幕的坐標是從左上方開始的,x軸朝上,y軸朝下
  • 但是這個窗口我們並不滿意,因為這個界面跟我們看到的不一樣(如下圖)
  •  

  • 所以我們需要用到panel(這個容器需要跟Frame一起使用才能顯示出來)見container的add方法

     

  • 我們可以通過panel一些方法(從container和component找到)。設置大小,背景顏色,可見的(1)setBackground(Color c)(2)setSize(int width, int height)(3)setVisible(boolean b)
  • 個人的代碼只是一種測試,不是完全按照要求來
  •  1 import java.awt.*;
     2 public class TankGame extends Frame {
     3   public void showFrame(){
     4     setBackground(Color.black);
     5     setTitle("tankgame");
     6     setResizable(true);
     7     setVisible(true);
     8     setSize(514,450);
     9     
    10     
    11 
    12   }
    13 
    14 
    15   
    16   public static void main(String[] args){
    17    
    18 
    19     TankGame tankgame=new TankGame();
    20     tankgame.showFrame();
    21     TankGameTwo tankgametwo=new TankGameTwo();
    22     tankgametwo.showPanel();
    23     tankgame.add(tankgametwo);
    24     
    25 
    26   }
    27   
    28 
    29 }
    30  class TankGameTwo extends Panel{
    31    void showPanel(){
    32     setBackground(Color.orange);
    33     setSize(90,90);
    34     setVisible(true);
    35   }
    36 
    37   
    38 
    39 }

     

  • 如果按照這個代碼,我們會發現,我們根本看不見frame的顏色,我們看見的顏色是panel的顏色(如果你晃動邊框,frame的顏色會顯示出來)
  • 解決辦法在兩個類中的方法中調用一個方法(因為默認有布局管理器,我們設置大小對他們就沒有用了,所以我們需要手動地設置,取消布局管理器)
  •  1 import java.awt.*;
     2 public class TankGame extends Frame {
     3   public void showFrame(){
     4     setBackground(Color.gray);
     5     setTitle("tankgame");
     6     setResizable(true);
     7     setVisible(true);
     8     setSize(514,450);
     9     setLayout(null);
    10     
    11     
    12 
    13   }
    14 
    15 
    16   
    17   public static void main(String[] args){
    18    
    19 
    20     TankGame tankgame=new TankGame();
    21     tankgame.showFrame();
    22     TankGameTwo tankgametwo=new TankGameTwo();
    23     tankgametwo.showPanel();
    24     tankgame.add(tankgametwo);
    25     
    26 
    27   }
    28   
    29 
    30 }
    31  class TankGameTwo extends Panel{
    32    void showPanel(){
    33     setBackground(Color.black);
    34     setSize(415,415);
    35     setVisible(true);
    36     setLayout(null);
    37   }
    38 
    39   
    40 
    41 }

     

     

  •  

  • 那么怎么使panel相對於Frame往中間去一點呢,有個設置x,y的方法,同時設置大小
  •  

  •  

  • 界面做的有點丑,這個需要自己花很多次調整,我沒有什么工具來慢慢調整的(或者對照網頁上游戲的界面來設置,截屏就知道大小了,前端工程師經常這樣做)
  • 那么問題來了怎么使panel跟着container改動呢?這種方法由布局管理器來實現
  •  

  • 這個接口下有很多種布局管理器
  •  

  •  

  • 這樣就可以讓panle隨着Frame動而不改變整體布局(這種邏輯關系是frame用弩據管理器來布局panel)
  • 怎么使鼠標按那個叉叉,然后窗口關掉。
  •  

    這樣發現不對,因為少了適配器的概念。而且實現接口是每個方法都必須實現,如果不全部實現,就是上述的錯誤。

  •  

  •  改正之后

  •  

  •  但是你還會發現有錯誤(因為沒有引入包)

  •  最后你還會發現一個問題,怎么在事件器中設置當前窗口的setvisible方法。

  •  

  •   1 import java.awt.*;

  •  2 import java.awt.event.*;  3 public class TankGame extends Frame {  4   public void showFrame(){  5  setBackground(Color.gray);  6     setTitle("tankgame");  7     setResizable(true);  8     setVisible(true);  9     setSize(514,450); 10     setLayout(new FlowLayout()); 11     
    12    li l=new li(); 13    this.addWindowListener(l); 14     
    15     
    16 
    17  } 18 
    19 
    20   
    21   public static void main(String[] args){ 22    
    23 
    24     TankGame tankgame=new TankGame(); 25  tankgame.showFrame(); 26     TankGameTwo tankgametwo=new TankGameTwo(); 27  tankgametwo.showPanel(); 28  tankgame.add(tankgametwo); 29     
    30     
    31 
    32  } 33   
    34 
    35 } 36 class li extends WindowAdapter{ 37 
    38 
    39    public void windowClosing(WindowEvent e){ 40     Window i=(Window)e.getWindow(); 41     i.setVisible(false); 42     System.exit(-1); 43 
    44 
    45 } 46 
    47 
    48 } 49 class TankGameTwo extends Panel{ 50   void showPanel(){ 51  setBackground(Color.black); 52     setBounds(35,38,415,415); 53     setVisible(true); 54     setLayout(null); 55     
    56  } 57  
    63       
    64 65 
    66   
    67 
    68   
    69 
    70 }

3.窗口圖片的處理(不是指窗口的背景)

  • 在窗口上面寫圖片,寫線條(圖形),寫字,都由paint方法來完成。而那些圖形對象是graphics。
  •  

  •  

  •  

  •  

  • 所以我們如果要畫圖,在小游戲界面上我們可以看出我們需要哪些圖片,截圖就行,然后保存一個文件。
  •  Image image1  = Toolkit.getDefaultToolkit().getImage("images/1.jpg");  獲取文件,但是第一次顯示的並沒有圖片,需要按最小化再打開就有了
  •  

  • 按照游戲頁面上的填圖片就行

4.動畫的處理(人工動畫+自動動畫)

  • 動畫的含義是什么,比如一串代碼a控制某個圖形在1的地方,又一串代碼b控制某個圖形在2的地方。我們只要執行a代碼后執行b代碼就可以了,n多個這樣的情況就成了動畫。
  • 比如手工動畫效果
  •  

  • 每次最小畫窗口,paint方法就要重新執行一次。(那么如何讓計算機自己這樣不停地執行paint方法呢。通過thread類。這個類能指定重復執行哪個代碼,以及執行幾次等

5.鍵盤控制坦克的移動。(第一,鍵盤事件,第二,一下鍵盤事件使圖片移動一下)

  • 加鍵盤事件監測,獲得鍵盤事件,則執行適配器中的方法使圖片移動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM