当前位置: 首页 > news >正文

从零开发Java坦克大战:架构设计与难点突破 (下)

  • 6. 游戏引擎类:

    • 6.1 完整源码展示: 

    • import javax.swing.*;
      import java.awt.*;
      import java.awt.event.KeyEvent;
      import java.awt.event.KeyListener;
      import java.util.ArrayList;
      import java.util.HashSet;
      import java.util.Random;
      import java.util.Set;public class GamePanel extends JPanel implements KeyListener {//GamePanel类是游戏的核心控制器,负责管理游戏循环、输入处理和游戏状态更新。private TankA tankA;private TankB tankB;private final Set<Integer> pressedKeys = new HashSet<>();private final Timer gameTimer;private final Random ran = new Random();private final BattleMaps map;private final scorePanel sPanel;private final ArrayList<Bullet> bullets = new ArrayList<>();private boolean gameOver = false;private String winner = "";public GamePanel() {map = new BattleMaps();sPanel = new scorePanel();// 生成坦克A的合法位置tankA = generatePositionA(45, 35);tankB = generatePositionB(45, 35);// 生成坦克B的合法位置(且不与A重叠)// 初始化游戏定时器(每16ms≈60FPS)//使用游戏循环(Timer)来定期处理按键状态,更新坦克位置。gameTimer = new Timer(7, e -> {processInput();// 处理输入updateGame();// 更新游戏状态SwingUtilities.invokeLater(this::repaint);// 请求重绘});gameTimer.start();setFocusable(true);addKeyListener(this);}private TankA generatePositionA(int width, int height) {Random ran = new Random();Rectangle tempRect;int x, y;do {x = 120 + ran.nextInt(900);y = 60 + ran.nextInt(750);tempRect = new Rectangle(x, y, width, height);} while (map.isCollidingWithWall(tempRect)); // 确保不生成在墙上return new TankA(x, y); // 或 TankB}private TankB generatePositionB(int width, int height) {Random ran = new Random();Rectangle tempRect;int x, y;do {x = 120 + ran.nextInt(900);y = 60 + ran.nextInt(750);tempRect = new Rectangle(x, y, width, height);} while (map.isCollidingWithWall(tempRect)); // 确保不生成在墙上return new TankB(x, y); // 或 TankB}private void processInput() {// 游戏结束时忽略所有输入if (gameOver) return;// 处理坦克A// 每次循环先重置速度tankA.setSpeedX(0);tankA.setSpeedY(0);// 根据当前按下的键设置速度if (pressedKeys.contains(KeyEvent.VK_A)) {tankA.setDirection(0);tankA.setSpeedX(-4);}if (pressedKeys.contains(KeyEvent.VK_D)) {tankA.setDirection(2);tankA.setSpeedX(4);}if (pressedKeys.contains(KeyEvent.VK_W)) {tankA.setDirection(1);tankA.setSpeedY(-4);}if (pressedKeys.contains(KeyEvent.VK_S)) {tankA.setDirection(3);tankA.setSpeedY(4);}// 处理坦克BtankB.setSpeedX(0);tankB.setSpeedY(0);if (pressedKeys.contains(KeyEvent.VK_LEFT)) {tankB.setDirection(0);tankB.setSpeedX(-4);}if (pressedKeys.contains(KeyEvent.VK_RIGHT)) {tankB.setDirection(2);tankB.setSpeedX(4);}if (pressedKeys.contains(KeyEvent.VK_UP)) {tankB.setDirection(1);tankB.setSpeedY(-4);}if (pressedKeys.contains(KeyEvent.VK_DOWN)) {tankB.setDirection(3);tankB.setSpeedY(4);}}private void updateGame() {if (gameOver) {return;}handleTankMovement(tankA);handleTankMovement(tankB);//更新子弹位置for (Bullet bullet : new ArrayList<>(bullets)) {bullet.move();//检测子弹与墙壁的碰撞if (map.isCollidingWithWall(bullet.getBounds())) {bullet.setActive(false);}//检测子弹与坦克碰撞if (bullet.isActive()) {
      
http://www.dtcms.com/a/298822.html

相关文章:

  • Java测试题(上)
  • Effective C++ 条款02:尽量以 const, enum, inline 替换 #define
  • I/O 控制方式
  • docker部署的ragflow服务迁移 数据卷迁移
  • 内存优化:从堆分配到零拷贝的终极重构
  • Web前端:JavaScript 随机点名系统案例详解
  • 肺癌预测模型实战案例
  • C51:用DS1302时钟读取和设置时间
  • 静电释放检测误报率↓79%:陌讯多模态融合算法实战解析
  • 算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地
  • 2025年ASOC SCI2区TOP,无人机集群路径规划与任务分配的组合优化在多障碍战场环境中的应用,深度解析+性能实测
  • 汽车功能安全 -- TC3xx Error Pin监控机制
  • Post-Training on PAI (5): PAI-EasyDistill, PAI 自研大模型蒸馏框架
  • JAVA知识点(二):数据库
  • rk3588跑通速腾雷达RS16的ros点云读取
  • 装修进度管理系统功能对比:主流工具9选
  • Apipost:离线可用+AI全栈覆盖,国产API开发协作工具新标杆
  • HTTP响应状态码详解
  • 通过Deepseek找工作
  • java-方法的综合练习
  • 屏幕适配--像素篇
  • 100条常用SQL语句大全
  • Linux系统编程——进程
  • 两个MCU互联采集数据
  • kubesphere安装使用
  • 手写数组洗牌算法
  • Vue2 element cascader级联选择器懒加载编辑时回显数据
  • 【VLAs篇】06:从动作词元化视角谈VLA模型的综述
  • 异常(全)
  • which soffice soffice not found