【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>
[ 第一章:日常_JAVA_面试题集(含答案)](https://wenfeng.blog.csdn.net/article/details/109253627)
[ 第二章:日常_JAVA_面试题集(含答案)](https://wenfeng.blog.csdn.net/article/details/108773049)
 [平安壹钱包JAVA面试官:请你说一下Mybatis的实现原理](https://blog.csdn.net/Feng_wwf/article/details/117460385)
 [Java必备面试-热点-热门问题精华核心总结-推荐](https://blog.csdn.net/Feng_wwf/article/details/116524563)
[ 往期文章大全……](https://blog.csdn.net/Feng_wwf)
**<font color=#c7a>一键三连 ~一键三连~ 一键三连~</font>**
# [更多内容,点这里❤](https://wenfeng.blog.csdn.net/)
相关文章:
【JAVA】Java开发小游戏 - 简单的2D平台跳跃游戏 基本的2D平台跳跃游戏框架,适合初学者学习和理解Java游戏开发的基础概念
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默, 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把…...
分享3个国内使用正版GPT的网站【亲测有效!2025最新】
1. molica 传送入口:https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口:https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口:https://ai-to.cn/url/?ulihaimao...
CSDN Markdown编辑器设置视频居中完美解决方案
表格做中间容器,把视频放在表格里面,利用表格居中语法实现表格内元素居中对齐,从而完美实现视频居中。 【三角符文】jevil战无伤通关 这玩意整了我两个星期,焦头烂额都找不到解决方案。今天偶然想到可以用表格试试,没想…...
Java到底是值传递还是引用传递????
在搞懂这个问题之前, 我们要首先了解什么是值传递, 什么是引用传递? 值传递: 传递的是数据的副本,修改副本不会影响原始数据。引用传递: 传递的是数据的引用(地址),修改引用会直接影响原始数据. 也就是说,值传递和引…...
初学stm32 --- 电源监控
目录 STM32 电源监控介绍 上电/掉电复位POR/PDR(F1) 可编程电压检测器(PVD)(F1) PVD相关寄存器介绍(F1) 电源控制寄存器 PWR_CR 电源控制/状态寄存器 PWR_CSR PVD相关HAL库驱动介绍 PVD的使用步骤 …...
Win10本地部署大语言模型ChatGLM2-6B
鸣谢《ChatGLM2-6B|开源本地化语言模型》作者PhiltreX 作者显卡为英伟达4060 安装程序 打开CMD命令行,在D盘新建目录openai.wiki if not exist D:\openai.wiki mkdir D:\openai.wiki 强制切换工作路径为D盘的openai.wiki文件夹。 cd /d D:\openai.wik…...
[ LeetCode 75 ] 1768. 交替合并字符串
题目描述:(相关标签:双指针、字符串) 给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。 返…...
(三)通过WebGL绘制一个简单的三角形来理解渲染管线
理解 WebGL 绘图原理的关键是了解它的渲染管线。WebGL 渲染管线实际上是由多个阶段组成的,每个阶段都有特定的任务,最终输出的是屏幕上的图像。为了让你能轻松理解这些原理,我将通过一个简单的例子来详细解释。 绘制一个简单的三角形 我们将…...
医学图像分析工具02:3D Slicer || 医学影像可视化与分析工具 支持第三方插件
3D Slicer 是一款功能全面的开源医学影像分析软件,广泛应用于影像处理、三维建模、影像配准和手术规划等领域。它支持多种医学影像格式(如 DICOM、NIfTI)和丰富的插件扩展,是神经科学、放射学和生物医学研究中不可或缺的工具。 在…...
Ollama VS LocalAI:本地大语言模型的深度对比与选择指南
随着人工智能技术的快速发展,大语言模型逐渐成为多个行业的重要工具。从生成内容到智能问答,大模型展现了强大的应用潜力。然而,云端模型的隐私性、使用成本和网络依赖等问题也促使更多用户关注本地化解决方案。Ollama 和 LocalAI 是近年来备…...
虚表 —— 隐藏行(简单版)
因为隐藏行改变了listview内部行号处理机制,需要处理大量细节,如listview内部用于传递行号的各种消息、通知等、封装的各种读取行号的函数等。 所以在工作量很大,一处纰漏可能导致重大bug的情况下,仅对隐藏行功能进行了简单封装&…...
CAD批量打印可检索的PDF文件
本文虽介绍CAD使用方法,但还是劝告大家尽早放弃使用CAD软件。。。。太TM难用了 当你打开CAD时发现如下一堆图纸,但是不想一个一个打印时。你可以按照下面操作实现自动识别图框实现批量打印。 1.安装批量打印插件 2.安装后打开CAD,输入命令Bp…...
2025.1.7(c++基础知识点)
作业(练习) 练习:要求在堆区连续申请5个int的大小空间用于存储5名学生的成绩,分别完成空间的申请、成绩的录入、升序排序、成绩输出函数以及空间释放函数,并在主程序中完成测试 要求使用new和delete完成 #include &…...
jenkins入门12-- 权限管理
Jenkins的权限管理 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,我们使用Role-based Authorization Strategy 插件 只有项目读权限 只有某个项目执行权限...
Edge SCDN高效防护与智能加速
当今数字化时代,网络安全和内容分发效率已成为企业业务发展的关键因素。酷盾安全推出了Edge SCDN解决方案,为企业提供全方位的安全防护和高效的内容分发服务。 一、卓越的安全防护能力 1.DDoS攻击的精准防御:Edge SCDN具备强大的DDoS攻击检测…...
Ubuntu22.04配置静态ip
1. 编辑网络配置文件 sudo vim /etc/netplan/00-installer-config.yaml 2.输入下面配置 将静态ip设置为192.168.3.200 ,并设置路由器地址192.168.3.1,以及dns地址 223.5.5.5和223.6.6.6 dhcp4: false 表示取消动态分配ip network:ethernets:e…...
[Linux]线程的互斥与同步
目录 一、互斥 1.互斥的概念 2.互斥锁接口 3.线程加锁解锁本质 4.死锁 二、同步 1.同步的概念 2.条件变量 3.条件变量接口 一、互斥 1.互斥的概念 互斥指的是任何时刻,互斥保证有且只有一个执行流进入临界区,进行临界资源的访问,通…...
Java:缓存:LinkedHashMap实现Lru
文章目录 Lru源码分析 LinkedHashMap维护一个LinkedHashMapEntry<K,V>的双向链表对LinkedHashMap的增删查操作,也会对链表进行相同的操作并改变链表的链接顺序小结使用方法应用总结Lru Least Recently Used,…...
【形式篇】年终总结怎么写:PPT如何将内容更好地表现出来
——细节满满,看完立马写出一篇合格的PPT 总述 形式服务于内容,同时合理的形式可以更好地表达和彰显内容 年终总结作为汇报型PPT,内容一定是第一位的,在内容篇(可点击查看)已经很详细地给出了提纲思路,那如何落实到…...
自定义字典转换器用于easyExcel 导入导出
文章目录 引言I 字典转换器、注解、序列化器注解定义自定义字典转换器用于easyExcel 导入导出自定义字典序列化器II 字典存储设计数据库表结构redis缓存引言 需求导入Excel时,根据字典内容或者字段编码转换 导出Excel时,根据字典内容或者字段编码转换 接口响应数据序列化时,…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
