|
|
package com.msb;
|
|
|
|
|
|
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;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
|
|
|
/**
|
|
|
* @Author bingor
|
|
|
* @Date 2022-09-29 16:24
|
|
|
* @Description: com.msb
|
|
|
* @Version: 1.0
|
|
|
*/
|
|
|
public class TankFrame extends Frame {
|
|
|
|
|
|
Tank myTank = new Tank(100, 500, DirEnum.RIGHT, GroupEnum.GOOD, this);
|
|
|
// Explode explode = new Explode(100, 100, this);
|
|
|
// Bullet bullet = new Bullet(200, 200, DirEnum.DOWN);
|
|
|
List<Bullet> bullets = new ArrayList<>();
|
|
|
List<Tank> tanks = new ArrayList<>(); //敌方坦克
|
|
|
List<Explode> explodes = new ArrayList<>(); //爆炸效果
|
|
|
public static final int GAME_WIDTH = 1000;
|
|
|
public static final int GAME_HEIGHT = 800;
|
|
|
|
|
|
public TankFrame() {
|
|
|
|
|
|
setTitle("Tank war");
|
|
|
setSize(GAME_WIDTH, GAME_HEIGHT);
|
|
|
setResizable(true);
|
|
|
setVisible(true);
|
|
|
setBackground(Color.BLACK);
|
|
|
|
|
|
addWindowListener(new WindowAdapter() {
|
|
|
@Override
|
|
|
public void windowClosing(WindowEvent e) {
|
|
|
super.windowClosing(e);
|
|
|
System.exit(0);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
addKeyListener(new MyKeyListener());
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void paint(Graphics g) {
|
|
|
// super.paint(g);
|
|
|
Color color = g.getColor();
|
|
|
g.setColor(Color.WHITE);
|
|
|
g.drawString("子弹的数量:" + bullets.size(), 10, 60);
|
|
|
g.drawString("敌方坦克数量:" + tanks.size(), 10, 90);
|
|
|
g.drawString("爆炸的数量:" + explodes.size(), 10, 120);
|
|
|
g.setColor(color);
|
|
|
myTank.paint(g);
|
|
|
|
|
|
// explode.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).collide(tanks.get(j));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//爆炸效果
|
|
|
for (int i=0; i<explodes.size(); i++) {
|
|
|
explodes.get(i).paint(g);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//双缓冲,解决闪烁现象
|
|
|
Image offScreenImage = null;
|
|
|
@Override //在paint方法之前会被调用,但是我做实验了,闪烁现象似乎还是存在
|
|
|
public void update(Graphics g) {
|
|
|
// super.update(g);
|
|
|
if(Objects.isNull(offScreenImage)) {
|
|
|
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
|
|
|
}
|
|
|
Graphics gOffScreen = offScreenImage.getGraphics();
|
|
|
Color color = gOffScreen.getColor();
|
|
|
gOffScreen.setColor(Color.BLACK);
|
|
|
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
|
|
|
gOffScreen.setColor(color);
|
|
|
paint(gOffScreen);
|
|
|
g.drawImage(offScreenImage, 0, 0, null);
|
|
|
}
|
|
|
|
|
|
//这里使用内部内的原因是,只有TankFrame用到
|
|
|
class MyKeyListener extends KeyAdapter {
|
|
|
|
|
|
private boolean bL = false;
|
|
|
private boolean bR = false;
|
|
|
private boolean bU = false;
|
|
|
private boolean bD = false;
|
|
|
|
|
|
@Override
|
|
|
public void keyPressed(KeyEvent e) {
|
|
|
super.keyPressed(e);
|
|
|
switch (e.getKeyCode()) {
|
|
|
case KeyEvent.VK_LEFT : bL = true; break;
|
|
|
case KeyEvent.VK_RIGHT : bR = true; break;
|
|
|
case KeyEvent.VK_UP : bU = true; break;
|
|
|
case KeyEvent.VK_DOWN : bD = true; break;
|
|
|
default: break;
|
|
|
}
|
|
|
setDir();
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public void keyReleased(KeyEvent e) {
|
|
|
super.keyReleased(e);
|
|
|
switch (e.getKeyCode()) {
|
|
|
case KeyEvent.VK_LEFT : bL = false; break;
|
|
|
case KeyEvent.VK_RIGHT : bR = false; break;
|
|
|
case KeyEvent.VK_UP : bU = false; break;
|
|
|
case KeyEvent.VK_DOWN : bD = false; break;
|
|
|
case KeyEvent.VK_SPACE: myTank.fire(); break;
|
|
|
default: break;
|
|
|
}
|
|
|
setDir();
|
|
|
}
|
|
|
|
|
|
private void setDir() {
|
|
|
//当没有任何方向键按下的时候,那么让坦克停止
|
|
|
if( !bL && !bR && !bU && !bD ) {
|
|
|
myTank.setMove(false);
|
|
|
} else {
|
|
|
myTank.setMove(true);
|
|
|
}
|
|
|
|
|
|
//为什么不用if-else 因为有可能是一起按两个方向键,那最后拿到哪个算哪个
|
|
|
if(bL) myTank.setDir(DirEnum.LEFT);
|
|
|
if(bR) myTank.setDir(DirEnum.RIGHT);
|
|
|
if(bU) myTank.setDir(DirEnum.UP);
|
|
|
if(bD) myTank.setDir(DirEnum.DOWN);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|