小鸟 java_java 飞翔小鸟源码

这是一个使用Java编写的简单小鸟飞行游戏,包含主类BirdDemo和多个类如BirdGame、Bird、Column、Ground等,实现了游戏窗口、小鸟的飞行、柱子的移动以及碰撞检测等功能。游戏画面包括背景、开始和结束的图片,小鸟通过点击开始游戏并根据物理规则上下移动,避免碰撞到柱子。
摘要由CSDN通过智能技术生成

import java.io.IOException;

import javax.swing.JFrame;

public class BirdDeom {

//这是主类用来启动JFrame

public static void main(String[] args) throws IOException{

JFrame jf=new JFrame();

//实例化窗口对象

BirdGame birdgame=new BirdGame();

//实例化BirdGame面板对象,这是自己写的一个继承JPanel的面板类,用来显示整个游戏

jf.add(birdgame);

//将面板加入窗口容器

jf.setSize(432,644);

//设置窗口大小为宽432,高644

jf.setLocationRelativeTo(null);

//窗口居中显示

jf.setVisible(true);

//显示窗口

birdgame.BirdAction();

//调用小鸟运动的游戏,这个方法用来实时改变游戏的状态

}

}

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.JPanel;

//继承JPanel,由于原生的JPanel无法完成我们想要的功能

public class BirdGame extends JPanel {

BufferedImage bg,startImage,gameOverImage;

//创建背景,开始,结束的图片对象

Bird bird;

//创建小鸟对象

Column column1,column2;

//创建柱子对象

int score;

//创建分数

boolean startgame,gameover;

//创建开始结束的boolean值

Ground ground;

//创建地面对象

public BirdGame() throws IOException{

//构造方法,初始化各个参数

bg=ImageIO.read(getClass().getResource("bg.png"));

//实例化(读入)背景图片对象

startImage=ImageIO.read(getClass().getResource("start.png"));

//实例化(读入)开始图片对象

gameOverImage=ImageIO.read(getClass().getResource("gameover.png"));

//实例化(读入)结束图片对象

ground=new Ground();

//实例化地面对象

column1=new Column(1);

//实例化柱子对象1

column2=new Column(2);

//实例化柱子对象2

bird=new Bird();

//实例化小鸟对象

score=0;

//初始化

startgame=false;

//初始化开始游戏的booelan值

gameover=false;

//初始化结束游戏的值

}

@Override

public void paint(Graphics g) {

//绘图方法,继承过来的

g.drawImage(bg, 0, 0, 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);

//绘制两根柱子对象,这也说明其实我们只有两根柱子

Font f=new Font(Font.SANS_SERIF, Font.BOLD, 40);

//实例化一个字体对象

g.setFont(f);

//绘制的字的字体为f

g.drawString(""+score,40, 60);

//绘制分数

g.setColor(Color.WHITE);

//设置字体为白色

g.drawString(""+score,40-3, 60-3);

//重绘一次出现双重效果

g.drawImage(ground.image,ground.x, ground.y, null);

//绘制地面

Graphics2D g2=(Graphics2D)g;

//实例化一个g2的2d效果对象

g2.rotate(-bird.aphal, bird.x, bird.y);

//绘制小鸟的倾斜角度

g.drawImage(bird.image, bird.x-bird.width/2,bird.y-bird.height/2, null);

//绘制小鸟

g2.rotate(bird.aphal, bird.x, bird.y);

//配合上面的控制小鸟的倾斜角度

if(gameover){

//开始gameover为false所以不绘制结束的图像

g.drawImage(gameOverImage, 0, 0, null);

//从点(0,0)的地方开始绘制

}

if(!startgame){

//还没点击开始是为false所以先绘制开始状态的图片,覆盖上面的所有图片

g.drawImage(startImage, 0, 0,null);

//从点(0,0)的地方开始绘制

}

}

//小鸟游戏运动的最重要的方法

public void BirdAction() throws IOException{

MouseListener m=new MouseAdapter() {

//添加鼠标点击的监听事件

@Override

public void mousePressed(MouseEvent e) {

//触发事件

if(gameover){

//如果gameover为true说明游戏结束,重新初始化各个参数

try {

column1=new Column(1);

column2=new Column(2);//实例化两根柱子

bird=new Bird();//实例化小鸟对象

ground=new Ground();//实例化地面对象

startgame=false;//开始状态改为false重新回到最初的开始界面

gameover=false;//结束状态改为false

score=0;//分数重置为0

} catch (IOException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

}else{//如果结束boolean值为false,那么设置开始状态为true,点击小鸟就开始飞

startgame=true;

bird.hitfly();//小鸟的点击飞起方法

}

}

};

this.addMouseListener(m);

//添加鼠标点击监听事件

while(true){

//死循环

if(!gameover&&startgame){

//如果游戏开始了,且没有死,柱子地面开始自己运动,否则停止所有移动

ground.step();//地面运动方法

column1.step();//柱子运动的方法

column2.step();

bird.step();//小鸟运动的方法

bird.fly();//小鸟飞翔的方法,确定是否掉落到地面

if(bird.x==column1.x||bird.x==column2.x){

score++;

//如果过了一根柱子,分数就加1

}

}

synchronized(BirdGame.this){//同步

if(ground.higround(bird)||column1.hitColumn(bird)||column2.hitColumn(bird)){

gameover=true;

//如果掉落到地上游戏结束,触发结束图片显示,停止所有运动

}

}

repaint();

try {

Thread.sleep(1000/60);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

//地面类

public class Ground {

BufferedImage image;

//创建地面图片

int x,y;

//定义图片的坐标

public Ground() throws IOException{

//构造方法初始化各参数

image=ImageIO.read(getClass().getResource("ground.png"));

//读取地面图片

x=0;

//初始化x坐标为0

y=500;

//初始化y坐标为500

}

public void step(){

//地面运动方法

x--;

if(x<=-108){

x=0;

}

}

public boolean higround(Bird bird){

//判断是否碰到地面方法

if(bird.y>=500-bird.width/2){

bird.aphal = -3.14159265358979323/2;

//改变为小鸟为垂直状态

return true;//撞击到地面

}

return false;

}

}

import java.awt.AlphaComposite;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.imageio.ImageIO;

//小鸟类

public class Bird {

BufferedImage[] images;

//定义图片集

BufferedImage image;

//小鸟当前的图片

int x,y,index;

//小鸟当前坐标和图片的下标

int width,height;

//图片的宽度和高度

double v0,v,t;

//初始速度,实时速度,时间间隔

double g,s;

//重力加速度,运动距离

double aphal;

//小鸟图片倾斜角度

public Bird() throws IOException{

//构造方法初始化各个参数

index=0;

//第一张图片

images=new BufferedImage[8];

for(int i=0;i

//读取所有小鸟图片

images[i]=ImageIO.read(getClass().getResource(i+".png"));

}

//图片的宽度和高度

width=images[0].getWidth();

height=images[0].getHeight();

v0=20;

//促使速度为20

x=132;

y=250;

//坐标为(132,250)

g=4.5;

//重力加速度为4.5(因为9.8太快这里不适合,所以改小了)

t=0.25;

//时间间隔为0.25秒

s=0;

//初始运动距离

v=v0;

//吧初始速度给v(实时速度)

}

public void step(){

//小鸟展翅的效果方法,原理就是切换图片

index++;

image=images[index/8%8];

}

public void fly(){

//小鸟飞的方法

s=v*t-g*t*t/2;

//垂直的运动距离

v=v-g*t;

//实时速度,这是物理公式,实时速度等于初始速度-加速度*时间

y=(int)(y-s);

//算出小鸟的y坐标

aphal = Math.atan(s/8);

//算出倾角

if(y>=500-width/2){

y=500-width/2;

}

//如果掉到地上,就死

}

public void hitfly(){

//点击就飞,其实就是再给一个促使速度

v=20;

}

}

import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; //柱子类 public class Column {      BufferedImage image;      //创建图片对象      int x,y;      //定义柱子的坐标      int width,height;      //定义柱子的高度和宽度      int distance;      //柱子之间的距离      int gap;      //柱子之间的间隙      public Column(int n) throws IOException{     //构造方法,初始化各个参数     image=ImageIO.read(getClass().getResource("column.png"));     //读取柱子图片     distance=240;     //两根柱子之间的距离设置为240     gap=144;     //间隙设置为144     x=500+(n-1)*distance;     //柱子的x坐标,这里以图片中心的坐标为准     Random r=new Random();     //随机生成柱子的y坐标     y=40+gap/2+r.nextInt(460-gap/2-(40+gap/2));     //保证柱子在40+gap/2~460-gap/2     width=image.getWidth();     //获得柱子的宽度     height=image.getHeight();     //获得柱子的高度      }      public void step(){     //柱子运动     x--;     if(x<=-width/2){//当柱子移除界面     x=2*distance-width/2;//初始化下一次柱子的坐标     Random r=new Random();         y=40+gap/2+r.nextInt(460-gap/2-(40+gap/2));     }      }      public boolean hitColumn(Bird bird){     //小鸟是否闯到柱子     int x1=x-width/2-bird.width/2;//得x最小界限     int x2=x+width/2+bird.width/2;//得到x最大范围     int y1=y-gap/2+bird.height/2;//得到y的最小值     int y2=y+gap/2-bird.height/2;//得到y的最大值     //上述是在柱子之间的临界值     if(bird.x>x1&&bird.xy1&&bird.y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值