前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,
忍不住分享一下给大家。点击跳转到网站
学习总结
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();
}
// 游戏循环
@Override
public 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);
}
// 绘制游戏画面
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
player.draw(g);
for (Platform platform : platforms) {
platform.draw(g);
}
}
// 处理键盘输入
private class KeyInputHandler extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
player.keyPressed(e.getKeyCode());
}
@Override
public 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)
![在这里插入图片描述](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/)