package com.Xml;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
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.File;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JPanel;
import util.SoundUtils;
import util.Utils;
public class MyPanel extends JPanel {
Bird bird=new Bird();
LinkedList<BufferedImage> maps=new LinkedList<BufferedImage>();
Pipe[] p1=new Pipe[2];
Pipe[] p2=new Pipe[2];
int mx=0;//默认地图X坐标为0
boolean space=true;
double t=0.25;//飞行的时间间隔
double g=3;//小鸟重力加速度
double alpha;//小鸟的倾斜角
int scoro=0;//分数
int distance1=200;//水管水平方向的间距
int distance2=120;//水管竖直方向的间距
boolean gameStart;//游戏开始
boolean gameOver; //游戏结束
Rectangle mapRec;
public MyPanel() {
initMap();
initBird();
initPipe1();
new myThread1().start();
new myThread2().start();
//添加鼠标事件
// this.addMouseListener(new Mouse());
//添加键盘事件
this.addKeyListener(new Key());
}
//初始化地图---------------------------------------------
public void initMap(){
maps.add(Utils.imgs.get("background (5_1).png"));
maps.add(Utils.imgs.get("background (5_2).png"));
}
//初始化小鸟---------------------------------------------
public void initBird(){
bird.setMaxPage(3);
bird.setX(100);
bird.setY(250);
bird.setSpeed(20);
bird.setAlpha(0);
bird.setState(Utils.STATE_FLY);
}
//初始化管道---------------------------------------------
public void initPipe1(){
Random r=new Random();
for (int i = 0; i < p1.length; i++) {
//上面管道
p1[i]=new Pipe();
p1[i].setImg("background (8).png");
p1[i].setX((i)*distance1+Utils.WIDTH);
p1[i].setY(-150-(r.nextInt(220)+1));
//下面管道
p2[i]=new Pipe();
p2[i].setImg("background (7).png");
p2[i].setX((i)*distance1+Utils.WIDTH);
p2[i].setY(p1[i].getY()+p1[i].getHight()+distance2);
}
}
//鼠标事件内部类
public class Mouse extends MouseAdapter{
public void mousePressed(MouseEvent e) {
if(space){
if(gameOver){
reStart();
}else{
gameStart=true;
}
}
}
// public void keyPressed(KeyEvent e) {
// if(e.getKeyCode()==KeyEvent.VK_SPACE){
// if(space){
// if(gameOver){
// reStart();
// }else{
// gameStart=true;
// }
// }
// }
// }
// public void keyReleased(KeyEvent e) {
// if(e.getKeyCode()==KeyEvent.VK_SPACE){
// space=true;
// }
// }
public void mouseReleased(MouseEvent e) {
space=true;
}
}
//键盘事件内部类
public class Key extends KeyAdapter{
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_SPACE){
if(space){
if(gameOver){
reStart();
}else{
gameStart=true;
}
}
}
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_SPACE){
space=true;
}
}
}
//小鸟移动
public void birdFly(){
double v0=bird.getSpeed();//获得小鸟初始速度
double v=v0-g*t;//当前速度
double s=v0*t-0.5*g*t*t;//竖直的位移
bird.setSpeed(v);//下次执行时的速度
bird.setAlpha(Math.atan(s/8));
bird.setY(bird.getY()-(int)s);//让鸟移动
}
//让水管移动
public void pipeStart(){
for (int i = 0; i < p1.length; i++) {
Random r=new Random();
p1[i].setX(p1[i].getX()-1);
p2[i].setX(p2[i].getX()-1);
if(p1[i].getX()<=-p1[i].getWidth()){
p1[i].setX(Utils.WIDTH+p1[i].getWidth()/2);
p2[i].setX(Utils.WIDTH+p1[i].getWidth()/2);
p1[i].setY(-100-(r.nextInt(150)+1));
p2[i].setY(p1[i].getY()+p1[i].getHight()+distance2);
}
}
}
//判断小鸟矩形有没有和管道矩形相交
public void getBirdHit(){
for (int i = 0; i < p1.length; i++) {
if(bird.getRec().intersects(p1[i].getRec())||
bird.getRec().intersects(p2[i].getRec())){
bird.setState(Utils.STATE_STUN);
//声音必须使用线程实现
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Hit.wav"));
};
}.start();
//声音必须使用线程实现
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Die.wav"));
};
}.start();
}
}
}
//切换小鸟图片
public void getBirdImg(){
int page =bird.getPage()+1;
if(page>=bird.getMaxPage()){
bird.setPage(0);
}else{
bird.setPage(page);
}
}
//空格控制小鸟跳跃
public void pressSpace(){
if(space){
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Wing.wav"));
};
}.start();
//当小鸟坐标Y小于10时候,不能让他继续飞
if(bird.getY()>=10){
bird.setSpeed(17);
}
space=false;
}
}
//小鸟通过管道分数++
public void scoroAdd(){
for (int i = 0; i < p1.length; i++) {
if(bird.getX()==p1[i].getX()){
scoro++;
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Point.wav"));
};
}.start();
}
}
}
//重新启动游戏
protected void reStart() {
initMap();
initBird();
initPipe1();
scoro=0;
gameStart=false;
gameOver=false;
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Swooshing.wav"));
};
}.start();
}
//线程1---------------------------------------------------
public class myThread1 extends Thread{
public void run() {
while(true){
try {
if(gameOver==false){
if(gameStart){
if(bird.getY()<440){
//小鸟飞
birdFly();
}else{
if(bird.getState()!=Utils.STATE_STUN){
//声音必须使用线程实现
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Hit.wav"));
};
}.start();
//声音必须使用线程实现
new Thread(){
public void run() {
SoundUtils.playMusic(false, new File("img/Die.wav"));
};
}.start();
}
//触碰地面摔死
bird.setState(Utils.STATE_DEATH);
gameOver=true;
}
//如果小鸟没死亡
if(bird.getState()!=Utils.STATE_DEATH){
//让地图的X坐标累减少
mx-- ;
//如果小鸟没晕眩
if(bird.getState()!=Utils.STATE_STUN){
//让水管移动
pipeStart();
//键盘事件控制小鸟跳跃
pressSpace();
//判断小鸟矩形有没有和管道矩形相交
//getBirdHit();
//小鸟通过管道分数+1
scoroAdd();
}
}
}else{
//让游戏没开始的时候 地面也在动
mx--;
}
}
//重绘
repaint();
Thread.sleep(12);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//线程2---------------------------------------------------
public class myThread2 extends Thread{
public void run() {
while(true){
try {
if(bird.getState()==Utils.STATE_FLY){
//切换小鸟图片
getBirdImg();
}
Thread.sleep(80);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//画图---------------------------------------------------------
@Override
protected void paintComponent(Graphics g) {
//画天空
drawSky(g);
//画水管
drawPipe(g);
//开场画面和结束画面
drawStartAndOver(g);
//分数
drawScoro(g);
//地面
drawMap(g);
//画小鸟
drawBird(g);
}
//画图方法------------------------------------------------------------------
//画小鸟
public void drawBird(Graphics g){
BufferedImage bigImg=Utils.imgs.get("birds.png");
BufferedImage birdImg=
bigImg.getSubimage(bird.getPage()*(bigImg.getWidth()/bird.getMaxPage()), 0,
没有合适的资源?快使用搜索试试~ 我知道了~
FlappyBird源码(愚蠢的小鸟)
共77个文件
png:30个
class:17个
wav:10个
需积分: 13 16 下载量 89 浏览量
2015-09-16
23:30:20
上传
评论
收藏 1.67MB RAR 举报
温馨提示
FlappyBird源码,注释的也比较详细,java语言编写,直接导入项目即可学习
资源推荐
资源详情
资源评论
收起资源包目录
FlappyBird.rar (77个子文件)
FlappyBird
.project 386B
hs_err_pid36372.log 16KB
hs_err_pid56376.log 14KB
hs_err_pid5760.log 14KB
hs_err_pid56908.log 14KB
src
com
Xml
Bird.java 2KB
MainPanel.java 565B
Pipe.java 866B
MyPanel.java 15KB
util
SoundUtils.java 2KB
Utils.java 879B
img
background (9).png 5KB
background (3).png 12KB
background (13).png 5KB
Wing.wav 28KB
Die.wav 137KB
background (5_1).png 3KB
background (11).png 3KB
Hit.wav 94KB
start.png 9KB
Swooshing.wav 345KB
background (1).png 11KB
background (8).png 5KB
background (10).png 3KB
background (4).png 6KB
birds.png 1KB
background (7).png 5KB
background (6).png 7KB
background (12).png 11KB
background (5_2).png 3KB
Point.wav 172KB
gameover.png 8KB
hs_err_pid59016.log 14KB
hs_err_pid58840.log 13KB
hs_err_pid59212.log 16KB
.settings
org.eclipse.jdt.core.prefs 629B
org.eclipse.core.resources.prefs 73B
hs_err_pid56860.log 14KB
.classpath 301B
素材
img
background (9).png 5KB
background (3).png 12KB
background (13).png 5KB
background (11).png 3KB
background (5).png 3KB
background (1).png 11KB
background (8).png 5KB
background (10).png 3KB
background (4).png 6KB
birds.png 1KB
background (7).png 5KB
background (6).png 7KB
background (12).png 11KB
flappybird.java 13KB
Sounds
bird_mid.png 2KB
Wing.wav 28KB
Die.wav 137KB
Hit.wav 94KB
Swooshing.wav 345KB
Point.wav 172KB
FlappyCopter.rar 1021KB
bin
com
Xml
MyPanel$5.class 659B
MyPanel$myThread1$1.class 734B
MyPanel$myThread1$2.class 734B
MyPanel$3.class 657B
MyPanel$Key.class 906B
Pipe.class 2KB
MyPanel$myThread1.class 1KB
MyPanel$4.class 656B
MainPanel.class 882B
MyPanel$Mouse.class 829B
MyPanel$1.class 656B
MyPanel.class 10KB
MyPanel$2.class 656B
MyPanel$myThread2.class 851B
Bird.class 3KB
util
SoundUtils.class 2KB
Utils.class 1KB
共 77 条
- 1
资源评论
小丶毛驴
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 《软件测试训练营》学习笔记-举例注册测试用例
- 机器学习预测.rar机器学习预测.rar机器学习预测.rar
- VIS 110Nm lib ip
- 848694479200715布谷鸟配音_1.10.8.0.apk
- 基于改进粒子群算法微电网日前优化(matlab程序)
- Energy Hub Integration: Optimizing Electricity and Heat Market P
- 基于C51单片机蓝牙控制小车proteus仿真程序源码+相关技术文档资料.zip
- Integrated-Energy-Systems-with-CAES-(注释完全,可直接运行)
- PDF为英语文本绘制热区(DEMO)
- Python一种新的需求响应机制DR-VCG研究(注释完全,可直接运行)(文档加Matlab源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功