package com.mashibing.tank;
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;
/**
* @date 2020/4/17 - 9:27
*/
public class TankFrame extends Frame {
Tank myTank = new Tank(200, 400, Dir.DOWN,Group.GOOD,this);
List<Bullet> bullets = new ArrayList<>();
List<Tank> tanks = new ArrayList<>();
List<Explode> explodes = new ArrayList<>();
static final int GAME_WIDTH = 1080, GAME_HEIGHT = 735;
public TankFrame() {
// 窗口可见
this.setVisible(true);
//窗口大小
this.setSize(GAME_WIDTH, GAME_HEIGHT);
//窗口是否可以改变大小
this.setResizable(false);
this.setTitle(" trank war....");
// 添加键盘监听处理类
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); // 调用paint方法把坦克和子弹画到内存里
g.drawImage(offScreenImage, 0, 0, null); // 最后调用系统画笔 把内存中的图片一次性画出来
}
// 如何画
@Override
public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.WHITE);
g.drawString("子弹的数量:" + bullets.size(), 10, 60);
g.drawString("敌方坦克的数量:" + tanks.size(), 10, 80);
g.drawString("爆炸的数量:" + explodes.size(), 10, 100);
g.setColor(c);
// 如果用foreach循环的话,在其他地方调用bullets集合的remove方法会报错
// ConcurrentModifyException 因为这种情况只能调用iterator迭代器的remove方法 不能调用集合的remove方法
myTank.paint(g);
// 画子弹
for (int i=0;i<bullets.size();i++) {
bullets.get(i).paint(g);
}
//画坦克
for (int i=0;i<tanks.size();i++) {
tanks.get(i).paint(g);
}
// 画爆炸
for (int i=0;i<explodes.size();i++) {
explodes.get(i).paint(g);
}
// 碰撞检测
for(int i=0;i<bullets.size();i++){
for (int j=0;j<tanks.size();j++){
bullets.get(i).collideWith(tanks.get(j));
}
}
}
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(); // 得到key按键的代码
switch (key) {
case KeyEvent.VK_LEFT:
bL = true;
break;
case KeyEvent.VK_UP:
bU = true;
break;
case KeyEvent.VK_RIGHT:
bR = true;
break;
case KeyEvent.VK_DOWN:
bD = true;
break;
default:
break;
}
setMainTankDir();
}
@Override //键盘抬起来
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode(); // 得到key按键的代码
switch (key) {
case KeyEvent.VK_LEFT:
bL = false;
break;
case KeyEvent.VK_UP:
bU = false;
break;
case KeyEvent.VK_RIGHT:
bR = false;
break;
case KeyEvent.VK_DOWN:
bD = false;
break;
case KeyEvent.VK_CONTROL:
myTank.fire();
break;
default:
break;
}
setMainTankDir();
}
private void setMainTankDir() {
if (!bL && !bR && !bU && !bD) {
myTank.setMoving(false);
} else {
myTank.setMoving(true);
if (bL) myTank.setDir(Dir.LEFT);
if (bU) myTank.setDir(Dir.UP);
if (bR) myTank.setDir(Dir.RIGHT);
if (bD) myTank.setDir(Dir.DOWN);
}
}
}
}
土豆片片
- 粉丝: 1856
- 资源: 5869
最新资源
- SEO化在线检测分析PHP源码,获得更高收录.7z
- 软包动力锂电池高效率真空注液封装机step全套技术资料100%好用.zip
- 泊车路径规划 几何方法实现泊车路径规划 高效率,消耗算力小
- 毕业论文设计 Matlab实现EEMD集合经验模态分解时间序列信号分解(含完整的程序,GUI设计和代码详解)
- prescan和simulink联合仿真AEB模型,可实现自动避撞停车(自己做的场景+传感器+算法)
- 图漾《Percipio Viewer用户指南 》相机基础操作手册
- 毕业论文设计 Python 实现基于WOA-CNN-BiLSTM鲸鱼算法优化卷积双向长短期记忆神经网络进行多输入单输出回归预测模型的详细项目实例(含完整的程序,GUI设计和代码详解)
- 滑模相关(是一个大文件夹) 1.永磁电机的滑模观测器Simulink模型 2.永磁同步电机趋近律滑膜控制NSMC 3.MATLAB四旋翼仿真滑模控制 simulink 5.传统滑模控制器设计 6.分散
- 热铆焊接设备(ug12+cad+bom)全套技术资料100%好用.zip
- 永磁同步电机的控制算法仿真模型: 1. 永磁同步电机的MRAS无传感器矢量控制: 2. 永磁同步电机的SMO无传感器矢量控制(反正切+锁相环); 3. 永磁同步电机DTC直接转矩控制; 4. 永磁同步
- 毕业论文设计 基于网络的虚拟仪器测试系统的详细项目实例(含完整的程序,GUI设计和代码详解)
- HTML5实现好看的满屏电商购物前端框架网站源码.zip
- HTML5实现好看的马尔代夫旅游公司网站源码.zip
- HTML5实现好看的绿植盆景商城网站源码.zip
- HTML5实现好看的美发染发行业网站源码.zip
- HTML5实现好看的美甲彩妆修眉店网站模板.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈