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

【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,
忍不住分享一下给大家。点击跳转到网站

学习总结

1、掌握 JAVA入门到进阶知识(持续写作中……
2、学会Oracle数据库入门到入土用法(创作中……
3、手把手教你开发炫酷的vbs脚本制作(完善中……
4、牛逼哄哄的 IDEA编程利器技巧(编写中……
5、面经吐血整理的 面试技巧(更新中……

在这里插入图片描述

Java开发小游戏 - 简单的2D平台跳跃游戏

下面是一个使用Java和javax.swing以及java.awt库创建的简单2D平台跳跃游戏。这个游戏将包括一个玩家角色,能够左右移动并跳跃。为了简化,我们不会涉及复杂的物理引擎或图形资源管理,而是专注于基础的游戏循环、输入处理和简单的碰撞检测。

项目结构

  • GamePanel.java: 游戏的主要面板,包含游戏逻辑。
  • Player.java: 玩家角色类。
  • Platform.java: 平台类。
  • Main.java: 启动游戏的主类。
    在这里插入图片描述

依赖

此示例仅依赖于Java标准库中的类,因此不需要额外的依赖项。确保你的开发环境已经配置好Java JDK,并且可以编译和运行Java程序。

游戏代码

GamePanel.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;public class GamePanel extends JPanel implements Runnable {// 游戏窗口尺寸private static final int WIDTH = 800;private static final int HEIGHT = 600;// 线程和帧率private Thread gameThread;private boolean running = false;private final int FPS = 60;private final int UPDATE_TIME = 1000 / FPS;// 玩家和平台private Player player;private List<Platform> platforms;// 构造函数public GamePanel() {setPreferredSize(new Dimension(WIDTH, HEIGHT));setBackground(Color.BLACK);setFocusable(true);addKeyListener(new KeyInputHandler());player = new Player(100, HEIGHT - 100, 50, 50, this);platforms = new ArrayList<>();platforms.add(new Platform(0, HEIGHT - 30, WIDTH, 30)); // 地面platforms.add(new Platform(200, HEIGHT - 200, 100, 10)); // 中间平台}// 开始游戏线程public void startGame() {running = true;gameThread = new Thread(this);gameThread.start();}// 游戏循环@Overridepublic void run() {long start, elapsed, wait;while (running) {start = System.nanoTime();update(); // 更新游戏状态repaint(); // 绘制游戏画面elapsed = System.nanoTime() - start;wait = UPDATE_TIME - elapsed / 1_000_000;if (wait < 0) wait = 5;try {Thread.sleep(wait);} catch (Exception e) {e.printStackTrace();}}}// 更新游戏状态private void update() {player.update(platforms);}// 绘制游戏画面@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);player.draw(g);for (Platform platform : platforms) {platform.draw(g);}}// 处理键盘输入private class KeyInputHandler extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {player.keyPressed(e.getKeyCode());}@Overridepublic void keyReleased(KeyEvent e) {player.keyReleased(e.getKeyCode());}}
}

Player.java

import java.awt.*;public class Player {private int x, y, width, height;private int velX, velY;private boolean onGround;private GamePanel gamePanel;// 玩家属性private final int JUMP_STRENGTH = -15;private final int GRAVITY = 1;private final int MAX_FALL_SPEED = 15;private final int SPEED = 5;public Player(int x, int y, int width, int height, GamePanel gamePanel) {this.x = x;this.y = y;this.width = width;this.height = height;this.gamePanel = gamePanel;this.velY = 0;this.onGround = false;}public void update(List<Platform> platforms) {// 水平移动x += velX;// 检测与平台的水平碰撞checkCollisions(platforms, true, false);// 垂直移动(重力)if (!onGround) {velY += GRAVITY;if (velY > MAX_FALL_SPEED) velY = MAX_FALL_SPEED;}y += velY;// 检测与平台的垂直碰撞onGround = checkCollisions(platforms, false, true);}// 检测碰撞private boolean checkCollisions(List<Platform> platforms, boolean horizontal, boolean vertical) {Rectangle playerRect = new Rectangle(x, y, width, height);for (Platform platform : platforms) {Rectangle platformRect = platform.getRectangle();if (horizontal && playerRect.intersects(platformRect)) {if (velX > 0) { // 右移时碰撞x = platformRect.x - width;} else if (velX < 0) { // 左移时碰撞x = platformRect.x + platformRect.width;}velX = 0; // 停止水平移动}if (vertical && playerRect.intersects(platformRect)) {if (velY > 0) { // 下落时碰撞onGround = true;y = platformRect.y - height;velY = 0;} else if (velY < 0) { // 上升时碰撞y = platformRect.y + platformRect.height;velY = 0;}}}return onGround;}// 键盘事件处理public void keyPressed(int keyCode) {if (keyCode == KeyEvent.VK_LEFT) {velX = -SPEED;}if (keyCode == KeyEvent.VK_RIGHT) {velX = SPEED;}if (keyCode == KeyEvent.VK_SPACE && onGround) {velY = JUMP_STRENGTH;onGround = false;}}public void keyReleased(int keyCode) {if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_RIGHT) {velX = 0;}}// 绘制玩家public void draw(Graphics g) {g.setColor(Color.BLUE);g.fillRect(x, y, width, height);}
}

Platform.java

import java.awt.*;public class Platform {private int x, y, width, height;public Platform(int x, int y, int width, int height) {this.x = x;this.y = y;this.width = width;this.height = height;}// 获取平台矩形public Rectangle getRectangle() {return new Rectangle(x, y, width, height);}// 绘制平台public void draw(Graphics g) {g.setColor(Color.GRAY);g.fillRect(x, y, width, height);}
}

Main.java

import javax.swing.*;public class Main {public static void main(String[] args) {JFrame frame = new JFrame("2D Platformer Game");GamePanel gamePanel = new GamePanel();frame.add(gamePanel);frame.pack();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocationRelativeTo(null);frame.setVisible(true);gamePanel.startGame(); // 启动游戏}
}

运行游戏

要运行这个游戏,只需编译并执行Main.java文件。它会打开一个窗口,显示一个简单的2D平台跳跃游戏,其中你可以控制一个蓝色方块在平台上移动和跳跃。

扩展功能

这个简单的游戏框架可以扩展为更复杂的游戏,例如:

  • 添加更多的关卡和平台。
  • 实现敌人和障碍物。
  • 引入得分系统和生命值。
  • 使用图像代替简单的颜色填充来提高视觉效果。
  • 实现音效和背景音乐。
  • 添加用户界面元素,如开始菜单和暂停按钮。

通过逐步增加新特性,你可以构建出一个更加丰富和有趣的游戏体验。请根据自己的需求调整代码,并考虑使用游戏开发库如LibGDX或LWJGL来实现更高级的功能。


上述代码提供了一个基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念。随着你对游戏开发的理解加深,你可以逐渐添加更多复杂的功能和优化性能。如果你是新手,建议先掌握这段代码的工作原理,然后再尝试添加新的元素。
# <font color=#56aaa>往期文章</font>
[&emsp;第一章:日常_JAVA_面试题集(含答案)](https://wenfeng.blog.csdn.net/article/details/109253627)
[&emsp;第二章:日常_JAVA_面试题集(含答案)](https://wenfeng.blog.csdn.net/article/details/108773049)
&emsp;[平安壹钱包JAVA面试官:请你说一下Mybatis的实现原理](https://blog.csdn.net/Feng_wwf/article/details/117460385)
&emsp;[Java必备面试-热点-热门问题精华核心总结-推荐](https://blog.csdn.net/Feng_wwf/article/details/116524563)
[&emsp;往期文章大全……](https://blog.csdn.net/Feng_wwf)
![在这里插入图片描述](https://img-blog.csdnimg.cn/b2246eb64888442e94b341f853ee4daf.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Zlbmdfd3dm,size_16,color_FFFFFF,t_70)**<font color=#c7a>一键三连 ~一键三连~ 一键三连~</font>**
# [更多内容,点这里❤](https://wenfeng.blog.csdn.net/)

相关文章:

【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

分享3个国内使用正版GPT的网站【亲测有效!2025最新】

1. molica 传送入口&#xff1a;https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口&#xff1a;https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口&#xff1a;https://ai-to.cn/url/?ulihaimao...

CSDN Markdown编辑器设置视频居中完美解决方案

表格做中间容器&#xff0c;把视频放在表格里面&#xff0c;利用表格居中语法实现表格内元素居中对齐&#xff0c;从而完美实现视频居中。 【三角符文】jevil战无伤通关 这玩意整了我两个星期&#xff0c;焦头烂额都找不到解决方案。今天偶然想到可以用表格试试&#xff0c;没想…...

Java到底是值传递还是引用传递????

在搞懂这个问题之前, 我们要首先了解什么是值传递, 什么是引用传递? 值传递: 传递的是数据的副本&#xff0c;修改副本不会影响原始数据。引用传递: 传递的是数据的引用&#xff08;地址&#xff09;&#xff0c;修改引用会直接影响原始数据. 也就是说&#xff0c;值传递和引…...

初学stm32 --- 电源监控

目录 STM32 电源监控介绍 上电/掉电复位POR/PDR&#xff08;F1&#xff09; 可编程电压检测器(PVD)&#xff08;F1&#xff09; PVD相关寄存器介绍&#xff08;F1&#xff09; 电源控制寄存器 PWR_CR 电源控制/状态寄存器 PWR_CSR PVD相关HAL库驱动介绍 PVD的使用步骤 …...

Win10本地部署大语言模型ChatGLM2-6B

鸣谢《ChatGLM2-6B&#xff5c;开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行&#xff0c;在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…...

[ LeetCode 75 ] 1768. 交替合并字符串

题目描述&#xff1a;&#xff08;相关标签&#xff1a;双指针、字符串&#xff09; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返…...

(三)通过WebGL绘制一个简单的三角形来理解渲染管线

理解 WebGL 绘图原理的关键是了解它的渲染管线。WebGL 渲染管线实际上是由多个阶段组成的&#xff0c;每个阶段都有特定的任务&#xff0c;最终输出的是屏幕上的图像。为了让你能轻松理解这些原理&#xff0c;我将通过一个简单的例子来详细解释。 绘制一个简单的三角形 我们将…...

医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件

3D Slicer 是一款功能全面的开源医学影像分析软件&#xff0c;广泛应用于影像处理、三维建模、影像配准和手术规划等领域。它支持多种医学影像格式&#xff08;如 DICOM、NIfTI&#xff09;和丰富的插件扩展&#xff0c;是神经科学、放射学和生物医学研究中不可或缺的工具。 在…...

Ollama VS LocalAI:本地大语言模型的深度对比与选择指南

随着人工智能技术的快速发展&#xff0c;大语言模型逐渐成为多个行业的重要工具。从生成内容到智能问答&#xff0c;大模型展现了强大的应用潜力。然而&#xff0c;云端模型的隐私性、使用成本和网络依赖等问题也促使更多用户关注本地化解决方案。Ollama 和 LocalAI 是近年来备…...

虚表 —— 隐藏行(简单版)

因为隐藏行改变了listview内部行号处理机制&#xff0c;需要处理大量细节&#xff0c;如listview内部用于传递行号的各种消息、通知等、封装的各种读取行号的函数等。 所以在工作量很大&#xff0c;一处纰漏可能导致重大bug的情况下&#xff0c;仅对隐藏行功能进行了简单封装&…...

CAD批量打印可检索的PDF文件

本文虽介绍CAD使用方法&#xff0c;但还是劝告大家尽早放弃使用CAD软件。。。。太TM难用了 当你打开CAD时发现如下一堆图纸&#xff0c;但是不想一个一个打印时。你可以按照下面操作实现自动识别图框实现批量打印。 1.安装批量打印插件 2.安装后打开CAD&#xff0c;输入命令Bp…...

2025.1.7(c++基础知识点)

作业&#xff08;练习&#xff09; 练习&#xff1a;要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩&#xff0c;分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数&#xff0c;并在主程序中完成测试 要求使用new和delete完成 #include &…...

jenkins入门12-- 权限管理

Jenkins的权限管理 由于jenkins默认的权限管理体系不支持用户组或角色的配置&#xff0c;因此需要安装第三发插件来支持角色的配置&#xff0c;我们使用Role-based Authorization Strategy 插件 只有项目读权限 只有某个项目执行权限...

Edge SCDN高效防护与智能加速

当今数字化时代&#xff0c;网络安全和内容分发效率已成为企业业务发展的关键因素。酷盾安全推出了Edge SCDN解决方案&#xff0c;为企业提供全方位的安全防护和高效的内容分发服务。 一、卓越的安全防护能力 1.DDoS攻击的精准防御&#xff1a;Edge SCDN具备强大的DDoS攻击检测…...

Ubuntu22.04配置静态ip

1. 编辑网络配置文件 sudo vim /etc/netplan/00-installer-config.yaml 2.输入下面配置 将静态ip设置为192.168.3.200 &#xff0c;并设置路由器地址192.168.3.1&#xff0c;以及dns地址 223.5.5.5和223.6.6.6 dhcp4: false 表示取消动态分配ip network:ethernets:e…...

[Linux]线程的互斥与同步

目录 一、互斥 1.互斥的概念 2.互斥锁接口 3.线程加锁解锁本质 4.死锁 二、同步 1.同步的概念 2.条件变量 3.条件变量接口 一、互斥 1.互斥的概念 互斥指的是任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&#xff0c;进行临界资源的访问&#xff0c;通…...

Java:缓存:LinkedHashMap实现Lru

文章目录 Lru源码分析 ​​​​​​​​​​​​​​LinkedHashMap维护一个LinkedHashMapEntry<K,V>的双向链表对LinkedHashMap的增删查操作,也会对链表进行相同的操作并改变链表的链接顺序小结使用方法​​​​​​​​​​​​​​应用总结Lru Least Recently Used,…...

【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来

——细节满满&#xff0c;看完立马写出一篇合格的PPT 总述 形式服务于内容&#xff0c;同时合理的形式可以更好地表达和彰显内容 年终总结作为汇报型PPT&#xff0c;内容一定是第一位的&#xff0c;在内容篇(可点击查看)已经很详细地给出了提纲思路&#xff0c;那如何落实到…...

自定义字典转换器用于easyExcel 导入导出

文章目录 引言I 字典转换器、注解、序列化器注解定义自定义字典转换器用于easyExcel 导入导出自定义字典序列化器II 字典存储设计数据库表结构redis缓存引言 需求导入Excel时,根据字典内容或者字段编码转换 导出Excel时,根据字典内容或者字段编码转换 接口响应数据序列化时,…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...