package com.angsi.demo;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JPanel;
public class MainGame extends JPanel implements Runnable, MouseListener{
private Image offScreenImage; //图形缓存
private int width;
private int height;
private int lag = 15;
Font font1 = new Font("",Font.BOLD,30);
private Image land = Toolkit.getDefaultToolkit().getImage("res/land.png");
private Bird bird;
private Bg bg;
private Score score;
private boolean isStart = false;
public MainGame(int width, int height){
this.width = width;
this.height = height;
this.setBounds(0, 0, width, height);
bird = new Bird(width, height);
bg = new Bg(width, height-100);
score = new Score();
Pipe.pipes[0] = new Pipe(500, 0);
Pipe.pipes[1] = new Pipe(700, 1);
Pipe.pipes[2] = new Pipe(900, 2);
this.addMouseListener(this);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
bg.draw(g2d, this);
for(int i = 0; i < Pipe.pipes.length; i++){
Pipe.pipes[i].draw(g2d, this);
}
bird.draw(g2d, this);
score.draw(g2d, this);
g2d.drawImage(land, 0, height-200, width, 200, this);
}
public void update(Graphics g) {
if(offScreenImage == null){
offScreenImage = this.createImage(width, height); //新建一个图像缓存空间,这里图像大小为800*600
}
Graphics gImage = offScreenImage.getGraphics(); //把它的画笔拿过来,给gImage保存着
paint(gImage); //将要画的东西画到图像缓存空间去
g.drawImage(offScreenImage, 0, 0, null); //然后一次性显示出来
}
public void logic() {
bird.logic();
if(!GlobalUtil.isGameOver){
bg.logic();
for(int i = 0; i < Pipe.pipes.length; i++){
Pipe.pipes[i].logic();
}
}
update(getGraphics());
}
public void start(){
new Thread(this).start();
}
@Override
public void run() {
try {
while(true){
long startTime = System.currentTimeMillis();
logic();
long endTime = System.currentTimeMillis();
Thread.sleep(endTime - startTime>=lag ? 0: lag - (endTime - startTime) );
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(!isStart){
isStart = true;
this.start();
}
bird.click();
if(GlobalUtil.isGameOver){
GlobalUtil.isGameOver = false;
bird.reset();
for(int i = 0 ; i < Pipe.pipes.length; i++){
Pipe.pipes[i].reset();
}
GlobalUtil.score = 0;
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}