JavaSwing游戏开发之Camera原理

devtools/2025/1/16 16:28:04/

在这里插入图片描述
在这里插入图片描述

java">package org.timer;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;public class GameCameraWithObjects extends JPanel implements KeyListener {// 游戏世界大小private final int worldWidth = 2000;private final int worldHeight = 1500;// 摄像机位置private int cameraX = 0;private int cameraY = 0;// 摄像机视野大小private final int viewWidth = 800;private final int viewHeight = 600;// 玩家位置private int playerX = 400;private int playerY = 300;// 世界中的对象private final List<GameObject> gameObjects = new ArrayList<>();private final Random random = new Random();public GameCameraWithObjects() {setPreferredSize(new Dimension(viewWidth, viewHeight));addKeyListener(this);setFocusable(true);generateGameObjects(50); // 生成 50 个随机对象}// 生成游戏世界中的随机对象private void generateGameObjects(int count) {for (int i = 0; i < count; i++) {int x = random.nextInt(worldWidth);int y = random.nextInt(worldHeight);int size = 40; // 随机大小 10-40
//            int size = random.nextInt(30) + 10; // 随机大小 10-40Color color = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));gameObjects.add(new GameObject(x, y, size, color));}}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 填充背景g.setColor(Color.LIGHT_GRAY);g.fillRect(0, 0, viewWidth, viewHeight);// 绘制世界边界g.setColor(Color.BLACK);g.drawRect(-cameraX, -cameraY, worldWidth, worldHeight);// 绘制所有对象for (GameObject obj : gameObjects) {int screenX = obj.x - cameraX;int screenY = obj.y - cameraY;// 只绘制在视野内的对象if (screenX + obj.size > 0 && screenX < viewWidth && screenY + obj.size > 0 && screenY < viewHeight) {g.setColor(obj.color);g.fillRect(screenX, screenY, obj.size, obj.size);g.drawString("("+obj.x+","+obj.y+")", screenX, screenY);}}// 绘制玩家g.setColor(Color.RED);int screenX = playerX - cameraX;int screenY = playerY - cameraY;g.fillRect(screenX - 10, screenY - 10, 20, 20);// 显示调试信息g.setColor(Color.BLACK);g.drawString("Camera: (" + cameraX + ", " + cameraY + ")", 10, 20);g.drawString("Player: (" + playerX + ", " + playerY + ")", 10, 40);g.drawString("Objects: " + gameObjects.size(), 10, 60);}// 更新摄像机位置private void updateCamera() {
//        cameraX = playerX - viewWidth / 2;cameraX = Math.max(0, Math.min(playerX - viewWidth / 2, worldWidth - viewWidth));
//        cameraY = Math.max(0, Math.min(playerY - viewHeight / 2, worldHeight - viewHeight));cameraY = Math.max(0, Math.min(playerY - viewHeight / 2, worldHeight - viewHeight));}@Overridepublic void keyPressed(KeyEvent e) {int speed = 10;switch (e.getKeyCode()) {case KeyEvent.VK_UP -> playerY = Math.max(0, playerY - speed);case KeyEvent.VK_DOWN -> playerY = Math.min(worldHeight, playerY + speed);case KeyEvent.VK_LEFT -> playerX = Math.max(0, playerX - speed);case KeyEvent.VK_RIGHT -> playerX = Math.min(worldWidth, playerX + speed);}// 更新摄像机updateCamera();repaint();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}public static void main(String[] args) {JFrame frame = new JFrame("Game Camera with Objects");GameCameraWithObjects gamePanel = new GameCameraWithObjects();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(gamePanel);frame.pack();frame.setVisible(true);}// 内部类表示游戏对象private static class GameObject {int x, y, size;Color color;public GameObject(int x, int y, int size, Color color) {this.x = x;this.y = y;this.size = size;this.color = color;}}
}

http://www.ppmy.cn/devtools/150995.html

相关文章

NLP学习

第二周 一、深度学习步骤&#xff1a;1. 选定模型结构2. 模型参数随机初始化3. 构造模型损失函数4. 选择优化算法并设置超参数5. 数据准备与预处理6. 训练模型7. 模型评估8. 测试模型9. 应用模型 损失函数极小值、导向意义 超参数的影响迭代次数epoch批次量大小batch size学习率…

【PCIe 总线及设备入门学习专栏 5.3.3 -- PCIe 掩图 mask 介绍】

文章目录 Overview掩图的主要作用PCIe PHY 掩图使用的典型例子 Overview 本文将介绍 PCIe PHY 中掩图 mask的作用。 在 PCIe PHY&#xff08;物理层&#xff09;中&#xff0c;掩图&#xff08;mask&#xff09; 是用于控制特定位或信号行为的机制&#xff0c;通过屏蔽掉某些位…

Windows图形界面(GUI)-QT-C/C++ - Qt键盘与鼠标事件处理详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 事件处理机制概述 MFC与Qt事件处理对比 MFC事件处理 Qt事件处理 Qt事件传递机制 鼠标事件详解 鼠标事件类型 事件处理函数 ​编辑 鼠标相关信息与反馈 键盘事件详解 键盘事件…

年底了,2025年培训预算怎么整?

培训预算不仅仅是年度计划的一部分&#xff0c;更是企业提升竞争力和适应市场变化的重要工具。年底了&#xff0c;2025年的培训预算是许多HR的重要任务之一。该怎么做明年的培训呢&#xff1f; 培训预算的参考数据 制定培训预算时&#xff0c;企业应参考行业内的平均数据和标杆…

K8S中的Pod生命周期之重启策略

三种策略 Kubernetes 中的 Pod 支持以下三种重启策略&#xff1a; Always&#xff1a; 描述&#xff1a;无论容器退出的原因是什么&#xff0c;都会自动重启容器。 默认值&#xff1a;如果未指定重启策略&#xff0c;Kubernetes 默认使用 Always。 OnFailure&#xff1a; 描…

STL——map

目录 map类 map的构造 map的增删查 map的数据修改 map类 Key就是map底层关键字的类型&#xff0c;T是map底层value的类型&#xff0c;set默认要求Key⽀持 ⼩于⽐较&#xff0c;如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数&#xff0c;map底层存储数据的内存…

Ubuntu 系统支持高刷显示:探索与实践

Ubuntu 系统支持高刷显示&#xff1a;探索与实践 引言 随着技术的发展&#xff0c;显示器的刷新率从传统的60Hz逐渐提升到了120Hz、144Hz甚至更高。高刷新率屏幕能够提供更加流畅的视觉体验&#xff0c;尤其在游戏和动画播放中显得尤为重要。对于使用Ubuntu操作系统的用户来说…

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…