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.鍵盤控制坦克的移動。(第一,鍵盤事件,第二,一下鍵盤事件使圖片移動一下)
- 加鍵盤事件監測,獲得鍵盤事件,則執行適配器中的方法使圖片移動