JavaSwing游戏开发之Camera原理

server/2025/1/16 15:57:16/

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

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/server/158851.html

相关文章

接口测试总结(http与rpc)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传…

【行空板K10】上传温湿度信息到EasyIoT平台

目录 引言 EasyIoT平台 程序编写 测试结果 结语 引言 今天测试一下使用行空板K10上传数据到EasyIoT平台。这个平台是DFRobot自由的物联网云平台&#xff0c;也是Mind支持的4个MQTT平台之一。 EasyIoT平台 EasyIoT平台的优点是非常简单&#xff0c;没有阿里云、华为云那…

FPGA EDA软件的位流验证

位流验证&#xff0c;对于芯片研发是一个非常重要的测试手段&#xff0c;对于纯软件开发人员&#xff0c;最难理解的就是位流验证。在FPGA芯片研发中&#xff0c;位流验证是在做什么&#xff0c;在哪些阶段需要做位流验证&#xff0c;如何做&#xff1f;都是问题。 我们先整体的…

浅谈云计算02 | 云计算模式的演进

云计算计算模式的演进 一、云计算计算模式的起源追溯1.2 个人计算机与桌面计算 二、云计算计算模式的发展阶段2.1 效用计算的出现2.2 客户机/服务器模式2.3 集群计算2.4 服务计算2.5 分布式计算2.6 网格计算 三、云计算计算模式的成熟与多元化3.1 主流云计算服务模式的确立3.1.…

特制一个自己的UI库,只用CSS、图标、emoji图 第二版

图&#xff1a; 代码&#xff1a; index.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>M…

【STM32-学习笔记-1-】GPIO

文章目录 GPIOⅠ、GPIO函数Ⅱ、GPIO_InitTypeDef结构体参数①、GPIO_Mode②、GPIO_Pin③、GPIO_Speed GPIO Ⅰ、GPIO函数 // 将指定的GPIO端口寄存器重置为默认值 void GPIO_DeInit(GPIO_TypeDef* GPIOx);// 将GPIO的备用功能寄存器重置为默认值 void GPIO_AFIODeInit(void);…

stack_queue的底层,模拟实现,deque和priority_queue详解

文章目录 适配器Stack的模拟实现Queue的模拟实现vector和list的对比dequedeque的框架deque的底层 priority_queuepriority_queue的使用priority_queue的底层仿函数的使用仿函数的作用priority_queue模拟实现 适配器 适配器是一种模式&#xff0c;这种模式将类的接口转化为用户希…

9.7 visual studio 搭建yolov10的onnx的预测(c++)

1.环境配置 在进行onnx预测前&#xff0c;需要搭建的环境如下: 1.opencv环境的配置&#xff0c;可参考博客:9.2 c搭建opencv环境-CSDN博客 2.libtorch环境的配置&#xff0c;可参考博客&#xff1a;9.4 visualStudio 2022 配置 cuda 和 torch (c)-CSDN博客 3.cuda环境的配置…