package com.study.tank; import com.study.tank.factory.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; /** * @Description: * @Auther: xiaoshengjie * @Date: 2022/10/22/上午9:14 */ public class TankFrame extends Frame { public static final int GAME_WIDTH = Integer.parseInt((String) PropertyMgr.get("gameWidth")); public static final int GAME_HEIGHT = Integer.parseInt((String) PropertyMgr.get("gameHeight")); public ArrayList tanks = new ArrayList(); public Tank myTank = new Tank(150, 150, Dir.DOWN, Group.GOOD, this); public ArrayList bullets = new ArrayList(); public ArrayList explodes = new ArrayList(); public GameFactory gf = new DefaultFactory(); public TankFrame() { //设置窗口大小 this.setSize(GAME_WIDTH, GAME_HEIGHT); this.setResizable(false);//不可改变窗口大小 this.setTitle("Tank War");//设置标题 this.setVisible(true);//设置窗口可见 this.addKeyListener(new MyKeyListener()); //窗口关闭系统停止运行 this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } Image offScreenImage = null; @Override public void update(Graphics g) { if (offScreenImage == null) { offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT); } Graphics gOffScreen = offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.BLACK); gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); gOffScreen.setColor(c); paint(gOffScreen); g.drawImage(offScreenImage, 0, 0, null); } @Override public void paint(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLUE); g.drawString("子弹的数量:" + bullets.size(), 5, 40); g.drawString("敌人的数量:" + tanks.size(), 5, 60); g.setColor(c); myTank.paint(g); for (int i = 0; i < tanks.size(); i++) { tanks.get(i).paint(g); } for (int i = 0; i < bullets.size(); i++) { bullets.get(i).paint(g); } for (int i = 0; i < bullets.size(); i++) { for (int j = 0; j < tanks.size(); j++) { bullets.get(i).collideWithTank(tanks.get(j)); } } for (int i = 0; i < explodes.size(); i++) { explodes.get(i).paint(g); } } /** * 按键监听类 */ class MyKeyListener extends KeyAdapter { boolean bL = false; boolean bR = false; boolean bU = false; boolean bD = false; @Override public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch (key) { case KeyEvent.VK_A: bL = true; break; case KeyEvent.VK_D: bR = true; break; case KeyEvent.VK_W: bU = true; break; case KeyEvent.VK_S: bD = true; break; } setDirMethod(); } @Override public void keyReleased(KeyEvent e) { super.keyReleased(e); int key = e.getKeyCode(); System.out.println("弹起:" + key); switch (key) { case KeyEvent.VK_A: bL = false; break; case KeyEvent.VK_D: bR = false; break; case KeyEvent.VK_W: bU = false; break; case KeyEvent.VK_S: bD = false; break; case KeyEvent.VK_SPACE: myTank.fire(); break; } setDirMethod(); } public void setDirMethod() { if (!bD && !bU && !bR && !bL) { myTank.setMoving(false); } else { myTank.setMoving(true); } if (bL) myTank.setDir(Dir.LEFT); if (bR) myTank.setDir(Dir.RIGHT); if (bU) myTank.setDir(Dir.UP); if (bD) myTank.setDir(Dir.DOWN); } } }