【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

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

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

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

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/)
相关推荐
连胜优佳2 分钟前
19、javase- System类常用方法
java·开发语言
DanceDonkey4 分钟前
基于wait/notify方法 实现生产/消费者模型
java·数据库·中间件
宇宙李19 分钟前
微服务中熔断和降级的区别,具体使用场景有哪些?
java·数据库·微服务
连胜优佳35 分钟前
20、javase-API.容器
java·开发语言
leo_hush1 小时前
【Flink】flink或java异常日志输出不完整问题解决
java·大数据·flink
binqian1 小时前
【Docker】安装registry本地镜像库,开启Https功能
java·docker·https
计算机-秋大田1 小时前
基于Spring Boot的扶贫助农系统设计与实现(LW+页码+讲解)
java·vue.js·spring boot·后端·课程设计
fchampion2 小时前
太原理工大学软件设计与体系结构 --javaEE
java·开发语言·java-ee
我命由我123452 小时前
Android Process 问题:NoSuchMethodError,No static method myProcessName()
android·java·java-ee·android studio·安卓·android-studio·安卓开发
秦老师Q2 小时前
JavaWeb—Servlet详解
java