只用400行Java代码就能实现的飞翔的小鸟游戏

目录一、效果图二、设计步骤1.素材准备2.预备知识及其运用3.大体流程三、源码1.游戏类2.地面类3.小鸟类4.柱子类

一、效果图

二、设计步骤

1.素材准备

相关的素材我放到了github仓库。

github地址https://github.com/ORikkaO/BirdGame

2.预备知识及其运用

1.面向对象的封装:设计包装出小鸟、地面、柱子、游戏四个类。2.swing和awt包:图形界面工具,绘制出游戏场景。3.Math类:运用atan等方法辅助完成小鸟旋转角度转换。4.事件监听器:运用鼠标监听器完成游戏状态转换及小鸟移动。5.多线程:该项目就用到了一个sleep休眠。

相关的知识用到的不多,一边做一边学习(熟悉)运用就好。

3.大体流程

1.绘制面板,放入背景图。2.设计地面、柱子类完成移动的效果(移动方法实现)。3.设计小鸟,完成飞行轨迹、与柱子是否碰撞的方法等。4.设计游戏类,完成游戏类界面的绘制。5.设计游戏开始的方法与流程。6.增加鼠标监听器完成对小鸟飞行及游戏运行的控制。

三、源码

1.游戏类

package game;import javax.imageio.ImageIO;import java.util.*;import javax.swing.*;import java.awt.Graphics;import java.awt.event.MouseAdapter;import java.awt.event.*;import java.awt.image.BufferedImage;import javax.imageio.*;import java.awt.*;public class BirdGame extends JPanel {Image background;//背景图片Image startImage;//开始图片Image overImage;//游戏结束图片Ground ground;//地面Column column1,column2;//两根柱子Bird bird;//小鸟int score;//游戏分数int state;//游戏状态//状态常量public static final int START=0;//开始public static final int RUNNING=1;//运行public static final int GAME_OVER=2;//结束public BirdGame() throws Exception{//初始背景图片//background = new ImageIcon("D:\\java\\elipse\\project_workplace\\Bird\\src\\resources\\bg.png").getImage();//绝对路径//background = new ImageIcon("src\\resources\\bg.png").getImage();//相对路径,一开始默认位置是Bird项目文件夹background = new ImageIcon("./source/bg.png").getImage();startImage = new ImageIcon("./source/start.png").getImage();overImage=new ImageIcon("./source/gameover.png").getImage();//初始化地面、柱子、小鸟、分号、状态ground=new Ground();column1=new Column(1);column2=new Column(2);bird=new Bird();score=0;state=0;}public void paint(Graphics g){//绘制背景g.drawImage(background, 0, 0,null);//绘制地面g.drawImage(ground.image, ground.x, ground.y, null);//绘制柱子g.drawImage(column1.image,column1.x-column1.width/2,column1.y-column1.height/2,null);g.drawImage(column2.image,column2.x-column2.width/2,column2.y-column2.height/2,null);//绘制小鸟Graphics2D g2=(Graphics2D) g;g2.rotate(-bird.alpha,bird.x,bird.y);g.drawImage(bird.image,bird.x-bird.width/2,bird.y-bird.height/2,null);g2.rotate(bird.alpha,bird.x,bird.y);//绘制分数Font f=new Font(Font.SANS_SERIF,Font.BOLD,40);g.setFont(f);g.drawString(""+score, 40, 60);g.setColor(Color.WHITE);g.drawString(""+score,40-3, 60-3);//一个阴影效果//绘制开始和结束界面switch(state){case START:g.drawImage(startImage, 0, 0, null);break;case GAME_OVER:g.drawImage(overImage, 0, 0, null);break;}}public void action() throws Exception{//不断重复和绘制MouseListener l=new MouseAdapter(){public void mousePressed(MouseEvent e){try {switch(state) {case START://在开始前按下鼠标转为运行状态state=RUNNING;break;case RUNNING://在运行状态,按下鼠标小鸟向上飞行bird.flappy();break;case GAME_OVER://在结束状态,按下鼠标重置数据变为开始column1=new Column(1);column2=new Column(2);bird=new Bird();score=0;state=START;break;}}catch (Exception ex){ex.printStackTrace();}}};addMouseListener(l);while(true){switch(state){case START:bird.fly();ground.step();break;case RUNNING:ground.step();column1.step();column2.step();bird.fly();bird.step();//if(bird.x==column1.x||bird.x==column2.x)//{//score++;//}score++;//检测是否碰撞if(bird.hit(ground)||bird.hit(column1)||bird.hit(column2)){state=GAME_OVER;}break;}//休眠1000/60毫秒Thread.sleep(1000/60);repaint();}}//启动方法public static void main(String[] args) throws Exception{JFrame frame=new JFrame();BirdGame game=new BirdGame();frame.add(game);frame.setSize(440,670);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);game.action();}}

2.地面类

package game;import javax.swing.*;import java.awt.*;public class Ground {Image image;int x,y;//位置int width,height;//地面初始化public Ground() throws Exception{image =new ImageIcon("source/ground.png").getImage();width=image.getWidth(null);height=image.getHeight(null);x=0;y=500;}//左移public void step(){x-=4;if(x<=-109){x=0;}}}

3.小鸟类

package game;import java.awt.*;import javax.swing.*;import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width,height;int size;//重力加速度double g;//位移间隔时间double t;//最初速度double v0;//当前上抛速度double speed;//经过时间t后的位移double s;//小鸟的倾角(弧度)double alpha;//一组图片记录小鸟动画帧Image[] images;//帧数下标int index;public Bird() throws Exception{image=new ImageIcon("source/0.png").getImage();width = image.getWidth(null);height = image.getHeight(null);x=132;y=280;size=40;//位移参数g=4;v0=20;t=0.25;speed=v0;s=0;//小鸟偏转角度alpha=0;//初始化动画帧参数images=new Image[8];for(int i=0;i<8;i++){images[i]=new ImageIcon("source/"+i+".png").getImage();}index=0;}//飞行动作(变化一帧)public void fly(){index++;image=images[(index/12)%8];}//移动一步public void step(){double v0=speed;//计算上跑位移s=v0*t+g*t*t/2;//计算鸟的坐标y=y-(int)s;//计算下次移动速度double v=v0-g*t;speed =v;//计算倾角(反正切函数)alpha=Math.atan(s/8);}//向上飞行public void flappy(){//重置速度speed=v0;}//检测小鸟是否碰撞到地面public boolean hit(Ground ground){boolean hit =y+size/2>ground.y;if(hit){y=ground.y-size/2;alpha=Math.PI/2;}return hit;}//检测小鸟是否撞到柱子public boolean hit(Column column){//检测是否在柱子范围内if(x>column.x-column.width/2-size/2&&x<column.x+column.width/2+size/2){if(y>column.y-column.gap/2+size/2&&y<column.y+column.gap/2-size/2) return false;return true;}return false;}}

4.柱子类

package game;import java.util.*;import java.awt.*;import javax.imageio.ImageIO;import javax.swing.*;public class Column {Image image;int x,y;int width,height;//柱子之间缝隙int gap;//柱子之间的距离int distance;Random random =new Random();//初始第N根柱子public Column(int n) throws Exception{image=new ImageIcon("source/column.png").getImage();width=image.getWidth(null);height=image.getHeight(null);gap=144;distance=245;x=550+(n-1)*distance;y=random.nextInt(218)+132;}public void step(){x-=4;if(x<= -width/2){x=distance*2-width/2;y=random.nextInt(218);}}}

到此这篇关于只用400行Java代码就能实现的飞翔的小鸟游戏的文章就介绍到这了,更多相关Java飞翔的小鸟游戏内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

没有什么可凭仗,只有他的好身体,没有地方可去,只想到处流浪。

只用400行Java代码就能实现的飞翔的小鸟游戏

相关文章:

你感兴趣的文章:

标签云: