java游戏制作-飞翔的鸟游戏

一.准备工作
首先创建一个新的Java项目命名为“飞翔的鸟”,并在src中创建一个包命名为“com.qiku.bird",在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”,并向需要的图片素材导入到包内。

二.代码呈现
package com.qiku.bird;
 
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
 
/*
 * 小鸟类
 * */
public class Bird {
    int x;// 坐标
    int y;
    int width; // 宽高
    int height;
    BufferedImage image; // 图片
    BufferedImage[] images; // 小鸟所有图片
 
    public Bird() {
        // 初始化数组 保存八张图片
        images = new BufferedImage[8];
        // 使用循环结构 将小鸟所有图片 存入数组
        for (int i = 0; i < images.length; i++) {
            try {
                images[i] = ImageIO.read(Bird.class.getResourceAsStream(i + ".png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        image = BirdGame.bird_image;
        width = image.getWidth();
        height = image.getHeight();
        x = 120;
        y = 240;
    }
 
    // 小鸟飞翔的方法
    int index = 0;
 
    public void fly() {
        image = images[index % images.length];
        index++;
    }
 
    // h = v * t + g * t * t / 2
    int g = 6; //重力加速度
    double t = 0.15; // 下落时间
    double v = 0; // 初速度
    double h = 0; // 下落距离
 
    //小鸟下落一次
    public void down() {
        h = v * t + g * t * t / 2; // 具体下落的距离
        v = v + g * t; // 末速度 = 当前速度 + 重力加速度 * 时间
        y += (int) h;
    }
 
    // 小鸟向上飞
    public void up() {
        // 给一个 负方向的初速度
        v = -30;
    }
    /*
     * 小鸟撞地面
     * */
    public boolean hitGround(Ground ground) {
        boolean isHit = this.y + this.height >= ground.y;
        return isHit;
    }
 
    // 小鸟撞天花板
    public boolean hitCeiling() {
        boolean isHit = this.y <= 0;
        return isHit;
    }
 
    // 小鸟撞柱子
    public boolean hitColumn(Column c) {
        boolean b1 = this.x + this.width >= c.x;
        boolean b2 = this.x <= c.x + c.width;
        boolean b3 = this.y <= c.y + c.height / 2 - c.gap / 2;
        boolean b4 = this.y + this.height >= c.y + c.height / 2 + c.gap / 2;
        // 满足b1 b2表示水平方向 相撞 b1 b2 b3 同时满足 撞上柱子 b1 b2 b4 同时满足撞下柱子
        return b1 && b2 && (b3 || b4);
 
    }
 
}

package com.qiku.bird;
import javax.imageio.ImageIO;
import javax.swing.*;
 
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
 
/**
 * 游戏启动类
 * 使用extends 关键字 继承JPanel 画板类 ==> 于是BirdGame 就具备了画板类的功能
 */
public class BirdGame extends JPanel {
    //    定义游戏状态
    public static final int START = 0;  // 开始
    public static final int RUNNING = 1;  // 运行
    public static final int GAME_OVER = 2;  // 结束
    // 游戏当前状态 默认0 开始状态
    int state = START;
    int score = 0; //玩家得分
 
    static BufferedImage bg = null; // 背景图片
    static BufferedImage start = null; //开始图片
    static BufferedImage ground_image = null; // 地面
    static BufferedImage bird_image = null; // 小鸟
    static BufferedImage column_image = null; // 柱子
    static BufferedImage gameOver_image = null; // game游戏
 
    // 静态代码块 一般用于加载静态资源(视频,音频,图片等)
    static {
        // 将本地的图片bg.png读取到程序中的bg
        try {
            bg = ImageIO.read(BirdGame.class.getResourceAsStream("bg.png"));
            start = ImageIO.read(BirdGame.class.getResourceAsStream("start.png"));
            ground_image = ImageIO.read(BirdGame.class.getResourceAsStream("ground.png"));
            column_image = ImageIO.read(BirdGame.class.getResourceAsStream("column.png"));
            bird_image = ImageIO.read(BirdGame.class.getResourceAsStream("0.png"));
            gameOver_image = ImageIO.read(BirdGame.class.getResourceAsStream("gameover.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    Ground ground;//声明地面
    Bird bird;
    Column column1;
    Column column2;
 
    // BirdGame 的构造方法
    public BirdGame() {
        bird = new Bird();
        ground = new Ground();
        column1 = new Column();
        column2 = new Column();
        // 柱子2的x坐标 = 柱子1的坐标基础上+244保持水平间距
        column2.x = column1.x + column1.distance;
 
    }
 
    /*
     * 用于在画板上绘制内容的方法
     * 想在画板上显示什么 在这个方法写就行了
     * @param g 画笔
     *  */
    @Override
 
    public void paint(Graphics g) {
        // g.fillRect(0,0,100,200); // 设置颜色落笔点 宽高
        g.drawImage(bg, 0, 0, null); // 画背景
        if (state == START) {
            g.drawImage(start, 0, 0, null);  // 开始图片
        }
        g.drawImage(column1.image, column1.x, column1.y, null); // 画柱子
        g.drawImage(column2.image, column2.x, column2.y, null); // 画柱子2
        g.drawImage(bird.image, bird.x, bird.y, null); //小鸟图片
        g.drawImage(ground.image, ground.x, ground.y, null);  // 地面图片
        if (state == GAME_OVER) {
            g.drawImage(gameOver_image, 0, 0, null); // 结束图片
 
        }
        // 画分数
        Font font = new Font("微软雅黑", Font.BOLD, 25); // 创建字体
        g.setFont(font);  // 给画笔设置字体
        g.setColor(Color.BLACK);  // 设置字体黑色颜色
        g.drawString("分数:  " + score, 30, 50);
        g.setColor(Color.WHITE);  // 设置字体白色颜色
        g.drawString("分数:  " + score, 28, 48);
    }
 
    // 判断小鸟与柱子是否相撞 游戏结束
    public boolean isGameOver() {
        boolean isHit = bird.hitGround(ground) || bird.hitCeiling() || bird.hitColumn(column1) || bird.hitColumn(column2);
        return isHit;
    }
 
 
    // 游戏流程控制的方法
    public void action() throws Exception {
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                System.out.println(e.getKeyCode());
                if(e.getKeyCode() == 32){
                    if (state == START) {  // 如果是开始状态 单击转换运行
                        state = RUNNING;
                    }
 
                    if (state == RUNNING) {
                        bird.up(); //小鸟上升
                    }
                    if (state == GAME_OVER) {
                        bird = new Bird();
                        column1 = new Column();
                        column2 = new Column();
                        column2.x = column1.x + column1.distance;
                        score = 0;
                        state = START;
                    }
                }
            }
        });
 
 
        // 给当前对象()添加鼠标单击事件
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) { // 鼠标单击执行代码
                if (state == START) {  // 如果是开始状态 单击转换运行
                    state = RUNNING;
                }
 
                if (state == RUNNING) {
                    bird.up(); //小鸟上升
                }
                if (state == GAME_OVER) {
                    bird = new Bird();
                    column1 = new Column();
                    column2 = new Column();
                    column2.x = column1.x + column1.distance;
                    score = 0;
                    state = START;
                }
 
            }
        });
 
        // 死循环 {}的代码会一直反复执行
        while (true) {
            if (state == START) {
                ground.step(); // 地面移动
                bird.fly(); // 小鸟飞翔
            } else if (state == RUNNING) {
                ground.step(); // 地面移动
                column1.step(); // 柱子1移动
                column2.step(); // 柱子2移动
                bird.fly(); // 小鸟飞翔
                bird.down(); // 小鸟下落
                if (isGameOver() == true) {
                    state = GAME_OVER;
                }
                // 设置增加分数
                if (bird.x == column1.x + column1.width + 1 || bird.x == column2.x + column2.width + 1) {
                    score +=5;
                }
            }
 
            repaint(); //重画 即重新执行paint 方法
            Thread.sleep(10); //每隔10毫秒,让程序休眠一次
        }
    }
    static  JFrame frame = new JFrame();
    // main方法 - 程序的入口(即:有main方法 程序才能运行)
    public static void main(String[] args) throws Exception {
        BirdGame game = new BirdGame(); // 创建画板对象
        frame.setSize(432, 644);//设置宽高
        frame.setLocationRelativeTo(null); // 居中显示
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口,同时使程序结束
        frame.setVisible(true); //设置可见性
        frame.add(game); // 将画板放到画框上
        frame.setTitle("飞翔的小鸟");// 设置标题
        frame.setResizable(false);// 设置不允许玩家拖动界面
 
        // 调用action
        game.action();
    }
 
}

package com.qiku.bird;
 
import java.awt.image.BufferedImage;
 
/*
 * 柱子类
 * */
public class Column {
    int x;// 坐标
    int y;
    int width; // 宽高
    int height;
    BufferedImage image; // 图片
    int gap; //上下柱子之间的间隙
    int distance; //水平方向柱子之间的距离
    int min = -(1200 / 2 - 144 / 2);
    int max = 644 - 146 - 144 / 2 - 1200 / 2;
 
    public Column() {
        gap = 144;
        distance = 244;
        image = BirdGame.column_image;
        width = image.getWidth();
        height = image.getHeight();
        x = BirdGame.bg.getWidth();
        y = (int) (Math.random() * (max - min) + min);
 
    }
 
    public void step() {
        x--;
        if (x <= -width) {
            x = BirdGame.bg.getWidth();
            y = (int) (Math.random() * (max - min) + min);
        }
    }
}
 

package com.qiku.bird;
 
import java.awt.image.BufferedImage;
 
/*
* 地面类
* */
public class Ground {
    int x ;// 地面坐标
    int y ;
    int width ; // 地面的宽高
    int height;
    BufferedImage image; // 地面图片
 
    public Ground(){
        image = BirdGame.ground_image;
        x = 0;
        y = BirdGame.bg.getHeight() - image.getHeight();
 
        width = image.getWidth();
        height = image.getHeight();
    }
    /*
    * 地面走一步的方法
    * */
    public void step(){
        x--;
        if(x <= 432 - width){
            x=0;
        }
    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。 Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。 Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不断提升自己。Java语言游戏项目实战资源包 内容概览: 这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整的代码实现。 项目文档:详细的项目文档,介绍了项目的背景、功能、架构以及实现细节,帮助你更好地理解项目。 操作手册与使用说明:针对每个游戏项目,都准备了详细的操作手册和使用说明,手把手教你如何运行和测试项目。 学习笔记:整理了Java语言在游戏开发中的核心知识点和常用技术,方便你随时查阅和学习。 适用人群: 这份资源包适用于所有对Java游戏开发感兴趣的朋友,无论你是计算机专业的学生,还是希望业余时间尝试游戏开发的爱好者,都可以从中受益。 使用建议: 由浅入深实践:建议先从简单的游戏项目开始,逐步深入,既能增强自信,也能逐步提升技术水平。 结合文档与代码:在实践过程中,结合项目文档和代码,理解每一行代码背后的意义和原理。 持续学习与探索:Java语言和游戏开发技术都在不断更新,建议你在实践中持续学习新的技术和工具,不
当然可以!以下是一个简单的Java游戏飞翔小鸟的代码示例: ```java import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class BirdGame extends JFrame implements KeyListener { private int birdY = 250; // 小鸟的初始位置 private int speed = 0; // 小鸟的初始速度 public BirdGame() { setTitle("飞翔小鸟"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(false); setVisible(true); addKeyListener(this); } public void paint(Graphics g) { super.paint(g); g.fillRect(100, birdY, 20, 20); // 绘制小鸟 } public void keyTyped(KeyEvent e) {} public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_SPACE) { speed = -10; // 按下空格键,小鸟向上飞行 } } public void keyReleased(KeyEvent e) {} public void birdMove() { birdY += speed; // 更新小鸟的位置 speed += 1; // 更新小鸟的速度 if (birdY >= 530) { birdY = 530; // 小鸟触底时停止下落 } repaint(); // 重绘界面 } public static void main(String[] args) { BirdGame game = new BirdGame(); while (true) { game.birdMove(); try { Thread.sleep(20); // 控制小鸟的速度 } catch (InterruptedException e) { e.printStackTrace(); } } } } ``` 这个代码示例实现了一个简单的飞翔小鸟游戏。通过按下空格键,小鸟会向上飞行,松开空格键后小鸟会自由下落。小鸟的位置和速度会不断更新,并通过重绘界面来实现动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值