【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时,根据字典内容或者字段编码转换 接口响应数据序列化时,…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...