Java小游戏编写(飞翔的小鸟🐦)
概述:
主要使用面向对象,线程,继承、ImageIO流等完成的一个小游戏
主要文件:
🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅🎉🐅
- GrameJFrame类~游戏窗体
- GrameJPanel类~游戏画布(重点)
- Bird类~游戏主角
- Ground类~游戏内地面
- Column类~游戏内柱子障碍物
- Tools类~自己为导入图片定义的工具类
🐦游戏整体大概思维框架(自制,如有纰漏还请包涵):
🐦游戏效果
🐦
🎁一、GameJFrame类的具体描述
♥GameJFrame♥:
public class GameJFrame extends JFrame {//构造器(作用是用来做初始化操作)public GameJFrame(){//设置尺寸setSize(430,650);//设置关闭窗体的同时终止程序setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置标题setTitle("FlyBird");//设置窗体居中显示setLocationRelativeTo(null);//设置窗体大小不能改变setResizable(false);}//程序启动的入口public static void main(String[] args) {//创建窗体对象GameJFrame frame = new GameJFrame();//创建画板对象GameJPanel panel = new GameJPanel();//向窗体中添加画板frame.add(panel);//显示窗体对象frame.setVisible(true);//启动游戏
// panel.start();}
🎁二、GameJPanel类的具体描述
♥GameJPrame♥:
具体划分:
⭐ - 声明游戏所需要的对象
public class GameJPanel extends JPanel {//声明一个图片类型的变量BufferedImage bg;//游戏背景图片对象声明BufferedImage bgstart;//游戏开始背景声明//声明地面对象的变量Ground ground;//声明柱子对象Column column1; Column column2;//声明鸟对象Bird bird;//声明游戏状体(开始)boolean gameStart;//游戏结束的状态boolean gameOver;//分数int score;·······················略·······················}
⭐ - 画布构造器:public GameJPanel(){}
//画板构造器public GameJPanel(){bg = Tool.getImg("../img/bg.png"); //设置背景图片bgstart=Tool.getImg("../img/start.png");ground = new Ground(); //初始化地面对象column1 = new Column(1); //初始化柱子对象column2 = new Column(2);bird = new Bird(); //初始化鸟对象gameStart = false; //初始化游戏状态gameOver = false;score = 0; //初始化分数//鼠标监听器MouseAdapter adapter = new MouseAdapter() {//监听鼠标单击事件@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);
// System.out.println("点了我一下");if(gameStart == false){//准备状态//将状态更改为启动状态gameStart = true;//运行游戏start();}else if(gameOver){//结束状态gameStart = false;gameOver = false;//将有所对象初始化ground = new Ground();column1 = new Column(1);column2 = new Column(2);bird = new Bird();score = 0; //分数归零repaint();//刷新}else{bird.moveUp(); //小鸟的上抛}}};this.addMouseListener(adapter); //将监听器添加到适配器中
⭐ - public void start(){} 游戏的启动方法
//游戏启动的方法public void start(){//启动线程MyThread thread = new MyThread();Thread t = new Thread(thread);t.start();//将线程纳入线程调度}
⭐ - class MyThread implements Runnable{} 创建线程
//创建线程class MyThread implements Runnable{//该线程要执行的内容就写入到run方法中@Overridepublic void run() {while(true){//地面移动ground.move();//柱子移动column1.move();column2.move();//小鸟飞bird.fly();//小鸟移动bird.move();//检测鸟是否与地面或顶部发生碰撞boolean boo = bird.hit(ground);//检测鸟是否碰到柱子boolean boo1 = bird.hit(column1);boolean boo2 = bird.hit(column2);if(boo || boo1 || boo2){//修改游戏状体结束gameOver = true;break;//结束游戏}//判断是否安全通过if(bird.x == column1.x+column1.w|| bird.x == column2.x + column2.w){//得分score++;}try {//线程休眠 根据得分线程的休眠时间越短,游戏速度会越来越快if (score<5) {Thread.sleep(25);}if (score>4&score<10) {Thread.sleep(20);}if (score>9&score<15) {Thread.sleep(15);}if (score>14&score<20) {Thread.sleep(10);}if (score>19) {Thread.sleep(7);}//刷新repaint();} catch (InterruptedException e) {e.printStackTrace();}}}}
⭐ - 重写画笔pubic void paint(Graphics g){}
@Override
public void paint(Graphics g) {super.paint(g);//画背景图g.drawImage(bg,0,0,null);//画柱子g.drawImage(column1.img,column1.x,column1.y,column1.w,column1.h,null);g.drawImage(column2.img,column2.x,column2.y,column2.w,column2.h,null);//画地面(图片,原点x坐标,原点y坐标,所画的宽度,所画高度,null)g.drawImage(ground.img,ground.x,ground.y,ground.w,ground.h,null);//画鸟g.drawImage(bird.img,bird.x,bird.y,bird.w,bird.h,null);//画游戏准备状态的图片if(gameStart == false){g.drawImage(bgstart,0,0,440,650,null);}//画游戏结束状态的图片if(gameOver){g.drawImage(Tool.getImg("../img/gameover.png"),0,0,null);}//设置字体大小Font f = new Font("楷体",Font.BOLD,26);//将画笔设置为指定的字体g.setFont(f);//设置画笔颜色g.setColor(Color.ORANGE);//画分数g.drawString("分数: " + score, 5, 35);}
🎁三、Bird类的具体描述
♥Bird♥:
/*** 鸟类*/
public class Bird {//图片BufferedImage img;//宽度//高度 //x坐标 //y坐标int w,h,x,y;//声明集合对象List<BufferedImage> list;//初速度//时间间隔 //距离 //重力double v0,t,s,g;//构造器做初始化操作public Bird(){//初始化集合list = new ArrayList();//循环将图片装入到集合中for(int i = 0;i<8;i++){//1+2+"123"+1+2+"3"list.add(Tool.getImg("../img/"+i+".png"));}//初始化图片img = Tool.getImg("../img/0.png");//初始化宽度w = img.getWidth()/3;//初始化高度h = img.getHeight()/3;//初始化xx = 120;//初始化y;y = 150;//初始化初速度v0 = 3;//初始化时间间隔t = 0.15;//初始化距离s = 0;//初始化重力g = 5;}//小鸟翅膀飞的方法int i = 0;public void fly(){img = list.get(i%list.size());i++;}//小鸟动的方法public void move(){//计算上抛的距离s = v0*t;//计算出最高点的y坐标y = y - (int)s;//计算运动时间t以后的速度double v2 = v0 - g*t;//时间t以后的速度就是下落时的初速度v0 = v2;}//小鸟上抛的方法public void moveUp(){v0 = 20;}//鸟与顶部或底部发生碰撞public boolean hit(Ground ground){if(y <= 0 || y >= ground.y-h){return true;//撞了}return false;//没撞}//鸟和柱子的碰撞public boolean hit(Column column){if(x >= column.x-w && x < column.x + column.w){if(y > column.h/2 + column.y - column.gap/2&& y < column.h/2 + column.y + column.gap/2-h){return false;//安全通过}return true;//撞到了}return false;}
}
🎁四、Ground类的具体描述
♥Ground♥:
/*** 地面类*/
public class Ground {//地面的图片BufferedImage img;//地面的宽度//地面的高度//地面原点x坐标 //地面原点y坐标int w,h,x,y;//地面的构造器public Ground(){//读取地面图片img = Tool.getImg("../img/ground.png");//获取图片的宽度w = img.getWidth();//获取图片的高度h = img.getHeight();//初始化x坐标x = 0;//初始化y坐标y = 644-146;}//地面移动的方法public void move(){x--;//每次减一if(x<=-350){x = 0;}}
}
🎁五、Column类的具体描述
♥Column♥:
//定义一个柱子类
public class Column {//图片BufferedImage img;//宽度 //高度 //x坐标//y坐标 //间距int w,h,x,y,distance;//随机数对象(随机柱子)Random ran;//安全间隙(柱子之间的空隙)int gap;//构造器做初始化操作public Column(int i){//初始化图片if (i==1) {img = Tool.getImg("../img/column.png");}if (i==2) {img = Tool.getImg("../img/column.png");}//初始化宽度w = img.getWidth()/3;//初始化高度h = img.getHeight()/2;//初始化间距distance = 250;//初始化安全间隙gap = 74;//初始化xx = 300 + distance*(i-1);//令柱子之间间隔300//初始化随机数对象ran = new Random();//初始化y坐标//0 ~ -(h - (650-146))之内随机y = -ran.nextInt(h - (650-146)+1);//0~(n-1)之间的随机正整数,随机柱子的高低}//柱子移动的方法public void move(){x--;if(x <= -w){x = 2*distance-w;y = -ran.nextInt(h - (650-146)+1);}}
}
🎁六、Tools工具类的具体描述
♥Tools♥:
/*** 工具类,为重复的导入图片提供便捷,于是创建了这个工具类*/
public class Tool{//通过路径获取图片public static BufferedImage getImg(String path){//声明一张图片,初始化为null;BufferedImage img = null;//获取图片try {img = ImageIO.read(Tool.class.getResource(path));} catch (IOException e) {e.printStackTrace();}return img;}
}
🎁至此!完工🎉🎉,以上是全部代码!以及代码的解释,如需源码及其素材直接到资源里自行下载😜🎉🎉