【实例简介】
【实例截图】
【核心代码】
package game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
/**
* 画板类
* @author Mr.yi
*
*/
public class GamePanel extends JPanel{
//声明一个变量用于存放背景图片
BufferedImage bg;
//声明一个变量用于存放地面对象
Ground ground;
//声明一个变量用于存放第一根管子对象
Column column1;
//声明一个变量用于存放第二根管子对象
Column column2;
//声明一个变量存放小鸟对象
Bird bird;
//声明一个变量存放导弹对象
Guided guided;
//声明游戏的准备状态对象
boolean start;
//声明游戏结束状态
boolean gameover;
//声明分数对象
int score;
//构造器
public GamePanel(){
//设置背景色
setBackground(Color.PINK);
//设置背景图片
try {
bg = Tools.getimg("../img/bg.png");
} catch (IOException e) {
e.printStackTrace();
}
//初始化地面对象
ground=new Ground();
//初始化第一根管子对象
column1=new Column(1,ground.h);
//初始化第二根管子对象
column2=new Column(2,ground.h);
//初始化鸟对象
bird=new Bird();
//初始化导弹对象
guided=new Guided(ground.h);
//初始化游戏开始状态
start=false;
//初始化游戏结束状态
gameover=false;
//设置初始分数
score=0;
//创建鼠标监听器
MouseAdapter adapter = new MouseAdapter() {
//鼠标点击事件
@Override
public void mouseClicked(MouseEvent e) {
if(start == false){
//将游戏状态改变为游戏开始状态
start = true;
//启动
start();
//刷新
repaint();
}else if(gameover==true){
//切换到游戏准备状态
start = false;
gameover=false;
//重新初始化所有属性
//初始化地面对象
ground=new Ground();
//初始化第一根管子对象
column1=new Column(1,ground.h);
//初始化第二根管子对象
column2=new Column(2,ground.h);
//初始化鸟对象
bird=new Bird();
//初始化导弹对象
guided=new Guided(ground.h);
//初始化分数
score =0;
//刷新
repaint();
}
//小鸟上移
bird.moveup();
}
};
//将监听器适配到画板中
this.addMouseListener(adapter);
}
/**
* 画图的方法
* g就相当于画笔
*/
@Override
public void paint(Graphics g) {
//绘制背景图片
g.drawImage(bg,0,0,null);//0,0表示起始坐标x,y在左上角
//绘制第一根管子图片
g.drawImage(column1.bg2,column1.x,column1.y,column1.w,column1.h,null);
//绘制第二根管子图片
g.drawImage(column2.bg2,column2.x,column2.y,column2.w,column2.h,null);
//绘制地面图片
g.drawImage(ground.img,ground.x,ground.y,ground.w,ground.h,null );
//绘制鸟图片
g.drawImage(bird.bg3,bird.x,bird.y,bird.w,bird.h,null );
//绘制导弹图片
g.drawImage(guided.bg4,guided.x,guided.y,guided.w,guided.h,null );
if(start == false){
try {
g.drawImage(Tools.getimg("../img/start.png"),0,0,null);
} catch (IOException e) {
e.printStackTrace();
}
}
if(gameover){
try {
g.drawImage(Tools.getimg("../img/gameover.png"),0,0,null);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建字体
Font font = new Font("楷体", Font.BOLD, 30);
//将字体设置到画笔中
g.setFont(font);
//设置画笔颜色
g.setColor(Color.red);
//设置分数字符串
g.drawString("分数" score, 30, 30);
}
//游戏启动方法
public void start(){
//创建线程工作流对象
MyThread thread = new MyThread();
//将任务放到线程对象中
Thread t = new Thread(thread);
//启动线程
t.start();//将线程纳入线程调度
//MyThread2 t2 = new MyThread2();
//t2.start();
}
//线程另一种创建方式
//public class MyThread2 extends Thread{
//@Override
//public void run() {
//while(true){
//ground.move();
//.......}}}}
//内部类创建一个线程
public class MyThread implements Runnable{
@Override
public void run() {
while(true){
ground.move();//地面移动
column1.move(ground.h);//管子1移动
column2.move(ground.h);//管子2移动
column1.moveUD(ground.h);//管子1上下移动
column2.moveUD(ground.h);//管子2上下移动
//小鸟飞行
bird.fly();
//小鸟下落
bird.drop();
//导弹移动
guided.move(ground.h);
//检测小鸟是否撞击顶部
boolean boo = bird.hitUp();
//检测小鸟是否撞击地面
boolean boo2 =bird.hitdown(ground.h);
//检测小鸟是否撞击管子1
boolean boo3 =bird.hit(column1);
//检测小鸟是否撞击管子2
boolean boo4 =bird.hit(column2);
//检测小鸟是否撞击导弹
boolean boo5 =bird.hitguided(guided);
//判断游戏是否结束
if(boo || boo2 || boo3 || boo4 || boo5){
//结束游戏
gameover=true;
//终止游戏运行
return;
}
//计分
if(bird.x == column1.x column1.w || bird.x == column2.x column2.w){
score ;
}
try{
//休眠
if(score<2){
Thread.sleep(20);
}else if(score<3){
Thread.sleep(15);
}else if(score<4){
Thread.sleep(10);
}
Thread.sleep(7);
//刷新
repaint();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}