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;

}

}

}

三.结果呈现

相关推荐
Swift社区15 小时前
鸿蒙游戏中的“智能 NPC”架构设计
游戏·华为·harmonyos
王杨游戏养站系统15 小时前
3分钟!玩转游戏下载站系统!蜘蛛池seo功能完善部署!
游戏·游戏下载站养站系统·游戏养站系统
魔士于安15 小时前
unity 低多边形 无人小村 木质建筑 晾衣架 盆子手推车,桌子椅子,罐子,水井
游戏·unity·游戏引擎·贴图·模型
魔士于安16 小时前
unity 骷髅人 连招 武器 刀光 扭曲空气
游戏·unity·游戏引擎·贴图·模型
前端不太难16 小时前
为什么 AI 游戏更适合鸿蒙?
人工智能·游戏·harmonyos
沙振宇17 小时前
【Web】使用Vue3+PlayCanvas开发3D游戏(十一)渲染3D高斯泼溅效果
前端·游戏·3d
wanhengidc17 小时前
服务器 数据科技发展
运维·服务器·爬虫·科技·游戏·智能手机
Clank的游戏栈17 小时前
AI实战:如何更好的使用AI开发游戏项目
人工智能·游戏
风酥糖18 小时前
Godot游戏练习01-第29节-游戏导出
游戏·游戏引擎·godot
芝士就是力量啊 ೄ೨19 小时前
游戏里老触发中文输入法怎么办?
游戏