You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tank/src/com/msb/TankFrame.java

153 lines
4.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
}