學習使用java.awt.*、javax.swing.*、java.awt.event.*包進行簡單的tank大戰游戲編程,學習了JFrame、JPanel等容器和組件的使用,學習使用Graphics的各種方法繪製圖形,以及一些事件監聽和處理方法 ...
最近在學習swing編程,依據老師的教學視頻學習使用java.awt.*、javax.swing.*、java.awt.event.*包進行簡單的tank大戰游戲編程,學習了JFrame、JPanel等容器和組件的使用,學習使用Graphics的各種方法繪製圖形,以及一些事件監聽和處理方法。
JFrame這個類在目前的學習中都是繼承使用,然後調用三板斧把他顯示出來,例如:
public class MyTankGame extends JFrame {//繼承JFrame .... public static void main(String[] args) { MyTankGame mtg = new MyTankGame(); } public MyTankGame() { //三板斧 this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//關閉即退出,防記憶體泄漏 this.setVisible(true); } }
坦克是使用Graphics作為畫筆畫2個長矩形(作為坦克的履帶。也可用6個小矩形連接組成的大矩形代替更好看),1個短矩形,1個圓,1條線組合起來,其中矩形使用fill3DRect方法以顯示邊框,
for (int i = 0; i < 5; i++) { g.fill3DRect(x, y + 6 * i, 5, 6, false); g.fill3DRect(x + 15, y + 6 * i, 5, 6, false); } g.fill3DRect(x + 5, y + 5, 10, 20, false); g.fillOval(x + 4, y + 10, 10, 10); g.drawLine(x+10, y+1, x+10, y+10);
然後通過repaint方法刷新坦克實現坦克的移動,其中涉及到事件的監聽和事件處理方法,可在畫坦克的類JPanel調用KeyListener介面監聽JFrame,在JFrame中註冊JPanel的監聽,這樣JPanel就能監聽鍵盤的輸入,然後根據需要重寫KeyListener的keyPressed、keyReleased等方法,使用(e的類型也是KeyEvent)e.getKeyCode()==KeyEvent.VK_····進行判斷進行進一步的處理。
public class MyTankGame extends JFrame { MyPanel mp = null; public static void main(String[] args) { MyTankGame mtg = new MyTankGame(); } public MyTankGame() { mp = new MyPanel(); mp.setBackground(Color.black);//設置背景色 this.add(mp); this.addKeyListener(mp);//註冊監聽 ····· } } class MyPanel extends JPanel implements KeyListener { ········ @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub int speed=2; //移動坦克並改變方向 if((e.getKeyCode()==KeyEvent.VK_S)){ ty+=speed; h.setY(ty); h.setDirect(-1); }else if(·····){ ····· } } }
至此一個可以自由移動的坦克就出來了。
效果圖如下:
完整代碼如下:
/** * 自由移動的小坦克 */ package tankGame; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyTankGame extends JFrame { MyPanel mp = null; public static void main(String[] args) { MyTankGame mtg = new MyTankGame(); } public MyTankGame() { mp = new MyPanel(); mp.setBackground(Color.black); this.add(mp); this.addKeyListener(mp);//註冊監聽 this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class MyPanel extends JPanel implements KeyListener { int tx=10,ty=10; Hero h = null; public MyPanel() { h = new Hero(tx, ty); h.setDirect(1); } public void paint(Graphics g) { super.paint(g); this.drawTank(g, h.getX(), h.getY(), h.getDirect(), 1); } public void drawTank(Graphics g, int x, int y, int direct, int type) { switch (type) { case 0: g.setColor(Color.cyan); break; case 1: g.setColor(Color.yellow); break; default: break; } switch (direct) {//判斷坦克的方向 case 1://向上 for (int i = 0; i < 5; i++) { g.fill3DRect(x, y + 6 * i, 5, 6, false); g.fill3DRect(x + 15, y + 6 * i, 5, 6, false); } g.fill3DRect(x + 5, y + 5, 10, 20, false); g.fillOval(x + 4, y + 10, 10, 10); g.drawLine(x+10, y+1, x+10, y+10); break; case -1://向下 for (int i = 0; i < 5; i++) { g.fill3DRect(x, y + 6 * i, 5, 6, false); g.fill3DRect(x + 15, y + 6 * i, 5, 6, false); } g.fill3DRect(x + 5, y + 5, 10, 20, false); g.fillOval(x + 4, y + 10, 10, 10); g.drawLine(x+10, y+20, x+10, y+29); break; case 2://向右 for (int i = 0; i < 5; i++) { g.fill3DRect(x+6*i, y , 5, 6, false); g.fill3DRect(x+6*i, y +15, 5, 6, false); } g.fill3DRect(x + 5, y + 5, 20, 10, false); g.fillOval(x + 10, y + 4, 10, 10); g.drawLine(x+20, y+9, x+29, y+9); break; case -2://向左 for (int i = 0; i < 5; i++) { g.fill3DRect(x+6*i, y , 5, 6, false); g.fill3DRect(x+6*i, y +15, 5, 6, false); } g.fill3DRect(x + 5, y + 5, 20, 10, false); g.fillOval(x + 10, y + 4, 10, 10); g.drawLine(x+1, y+9, x+10, y+9); break; default: break; } } @Override public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub int speed=2; //移動坦克並改變方向 if((e.getKeyCode()==KeyEvent.VK_S)){ ty+=speed; h.setY(ty); h.setDirect(-1); }else if((e.getKeyCode()==KeyEvent.VK_W)){ ty-=speed; h.setY(ty); h.setDirect(1); }else if((e.getKeyCode()==KeyEvent.VK_A)){ tx-=speed; h.setX(tx); h.setDirect(-2); }else if((e.getKeyCode()==KeyEvent.VK_D)){ tx+=speed; h.setX(tx); h.setDirect(2); } this.repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } } class Tank{ private int x,y,direct; public int getDirect() { return direct; } public void setDirect(int direct) { this.direct = direct; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Tank(int x,int y){ this.x=x; this.y=y; } } class Hero extends Tank{ public Hero(int x, int y) { super(x, y); } }View Code