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 / 2int 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读取到程序中的bgtry {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 画笔*  */@Overridepublic 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); // 画柱子2g.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() {@Overridepublic 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() {@Overridepublic 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);// 设置不允许玩家拖动界面// 调用actiongame.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;}}
}

三.结果呈现

         

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/202182.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日一题】2216.美化数组的最少删除数-2023.11.21

题目&#xff1a; 2216. 美化数组的最少删除数 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果满足下述条件&#xff0c;则认为数组 nums 是一个 美丽数组 &#xff1a; nums.length 为偶数对所有满足 i % 2 0 的下标 i &#xff0c;nums[i] ! nums[i 1] 均成立 …

【Vue】自定义指令

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如果对您有用&#xff0c;可以点赞收藏哈~ 自定义指令 自定义指令就是自己定义的指令&#xff0c;是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM&#xff…

【开源】基于Vue.js的高校实验室管理系统的设计和实现

项目编号&#xff1a; S 015 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S015&#xff0c;文末获取源码。} 项目编号&#xff1a;S015&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

2023 最新 PDF.js 在 Vue3 中的使用(长期更新)

因为自己写业务要定制各种 pdf 预览情况&#xff08;可能&#xff09;&#xff0c;所以采用了 pdf.js 而不是各种第三方封装库&#xff0c;主要还是为了更好的自由度。 一、PDF.js 介绍 官方地址 中文文档 PDF.js 是一个使用 HTML5 构建的便携式文档格式查看器。 pdf.js 是社区…

ABB机 器 人 操 作 培 训

目 录 1 培训手册介绍 ---------------------------------------------2 2 系统安全与环境保护 ---------------------------------------------3 3 机器人综述 ---------------------------------------------5 4 机器人示教 --------------------------------------------12…

自动解决IP冲突的问题 利用批处理更改末位IP循环+1直到网络畅通为止 解放双手 事半功倍

好久没出来写点什么了&#xff0c;难道今天有点时间&#xff0c;顺便把这两天碰到的问题出个解决方法吧。 这几天去客户那儿解决网络问题&#xff0c;因为客户的网络是固定的静态IP&#xff0c;因为没做MAC绑定&#xff0c;IP固定在本地电脑上&#xff0c;只要上不了网&#xf…

微信小程序面试题【100道】

文章目录 小程序面试题100问前言一、技术性问题1.有哪些参数传值的方法2.小程序修改数据值与Vue和React有什么差异3.如何实现下拉刷新与上拉加载4.bindtap和catchtap的区别是什么5.小程序有哪些导航API&#xff0c;它们各自的应用场景与差异区别是什么6.小程序中如何使用第三方…

python爬虫扣代码案例:某智能商业分析平台

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly93d3cucWltYWkuY24vcmFuaw’) 拿到网址&#xff0c;F12打开调试工具&#…

拆解:淘宝客新玩法之微信淘礼金创建怎么做

最近看到一种新的淘宝客玩法&#xff0c;迫不及待的想分享给大家。微信公众号查券大家都不陌生&#xff0c;也有不少人都在做这个。最近看到有人在做微信公众号创建淘礼金。之所以说这个玩法新是因为目前大多数淘客还在做返利。返利有周期长、提现有门槛等痛点。 微信公众号创建…

BW4HANA 从头到脚 概念详解 ---- 持续更新中

1. 理解BW4HANA是干嘛的 好歹干了这么久的活了&#xff0c;从当初的啥也不懂到现在感觉啥都知道点&#xff0c;虽然知道的有限&#xff0c;但是也不是小白。渐渐的也知道了SAP开发的一些逻辑。本来咱是想当个BW的大牛的。但是现在感觉这条船要沉了是怎么回事。个人才稍微摸到点…

信息系统的安全保护等级的五个级别

信息系统的安全保护等级分为五级&#xff1a;第一级为自主保护级、第二级为指导保护级、第三级为监督保护级、第四级为强制保护级、第五级为专控保护级。 法律依据&#xff1a;《信息安全等级保护管理办法》第四条 信息系统的安全保护等级分为以下五级&#xff1a;   &#…

Python + Docker 还是 Rust + WebAssembly?

在不断发展的技术世界中&#xff0c;由大语言模型驱动的应用程序&#xff0c;通常被称为“LLM 应用”&#xff0c;已成为各种行业技术创新背后的驱动力。随着这些应用程序的普及&#xff0c;用户需求的大量涌入对底层基础设施的性能、安全性和可靠性提出了新的挑战。 Python 和…

基于单片机直流电机调速(proteus仿真+源程序)

一、系统方案 1、本设计采用这51单片机作为主控器。 2、转速值送到液晶1602显示。 3、按键设加减速&#xff0c;开始暂停、正反转。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 en0; rw0; write_com(0x01); //lcd初始化 write_com(0x38)…

如何提高图片转excel的效果?(软件选择篇)

在日常的工作中&#xff0c;我们常常会遇到一些财务报表类的图片需要转换成可编辑的excel&#xff0c;但是&#xff0c;受各种条件的限制&#xff0c;常常只能通过手工录入这种原始的方式来实现&#xff0c;随着人工智能、深度学习以及网络技术的发展&#xff0c;这种原始的录入…

机器学习中的特征选择:方法和 Python 示例

布拉加德什桑达拉拉詹 一、说明 特征选择是机器学习流程中至关重要且经常被低估的步骤。它涉及从数据集中的原始特征集中选择最相关的特征&#xff08;输入变量或属性&#xff09;的子集。特征选择的重要性怎么强调都不为过&#xff0c;因为它直接影响机器学习模型的质量、效率…

网络知识学习(笔记二)

ios模型规定的网络模型一共有7层&#xff0c;但是实际使用过程中&#xff0c;4层的TCP/IP模型是经常使用的&#xff0c;网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的&#xff0c;前面已经讲了&#xff1a;&#xff08;1&#xff09;物理层&#xff0c;&#xff08;2&a…

Kubernetes+Gitlab+Jenkins+ArgoCD多集群部署

KubernetesGitlabJenkinsArgoCD多集群部署 文章目录 KubernetesGitlabJenkinsArgoCD多集群部署1. KubernetesGitlabJenkinsArgoCD多集群部署2. 添加WebHooks自动触发3. Jenkins-构建-执行Shell4. 制作镜像及修改Yaml文件4.1 Dockerfile4.2 Build-Shell 5.自动部署Demo测试5.1 推…

nginx学习(4)Nginx 配置高可用集群(主从配置)

Nginx 配置高可用集群 Nginx的高可用集群是指由两台或多台Nginx服务器组成的集群系统&#xff0c;通过负载均衡和故障转移等技术&#xff0c;实现高可用性和可伸缩性的目标。在这种集群系统中&#xff0c;每个Nginx服务器都配置为主节点&#xff08;master&#xff09;或从节点…

【Delphi】使用TWebBrowser执行JavaScript命令传入JSON参数执行出错解决方案

目录 一、问题背景&#xff1a; 二、实际示例&#xff1a; 三、解决方案&#xff1a; 1. Delphi 代码&#xff1a; 2. javaScript代码&#xff1a; 一、问题背景&#xff1a; 在用Delphi开发程序&#xff0c;无论是移动端还是PC端&#xff0c;都可以很方便的使用TWebBrows…

基于SSM的焦作旅游协会管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…