首页>代码>基于java swing的飞鸟小游戏>/FlyBird/src/game/BirdGame.java
package game;

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 javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BirdGame extends JPanel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	BufferedImage background;
	BufferedImage startImage;
	BufferedImage gameOverImage;
	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=ImageIO.read(getClass().getResource("/resources/bg.png"));
		startImage=ImageIO.read(getClass().getResource("/resources/start.png"));
		gameOverImage=ImageIO.read(getClass().getResource("/resources/gameover.png"));
		//初始化地面
		ground = new Ground();
		//初始化柱子
		column1 = new Column(1);
		column2 = new Column(2);
		//初始化小鸟
		bird = new Bird();

		// 初始化分数
		score = 0;

		// 初始化状态
		state = START;

	}
	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字体类
		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(gameOverImage, 0, 0, null);
			break;
		}
	}

	// 开始游戏
	public void action() throws Exception {
		//鼠标监听器MouseListener
		//添加鼠标事件的时候,用适配器mouseAdapter可以不用实现所有的方法。只需要写自己需要的方法即可 
		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++;
				}
				// 检测是否发生碰撞
				if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
					state = GAME_OVER;
				}
				break;
			}
			// 重新绘制界面
			repaint();
			// 休眠 1000/60 毫秒
			Thread.sleep(1000 / 60);
		}

	}

	/**
	 * 启动方法
	 */
	public static void main(String[] args) throws Exception {
		//JFrame类编程窗口,类似一个容器
		JFrame frame = new JFrame();
		BirdGame game = new BirdGame();
		frame.add(game);
		frame.setTitle("FlyBird");
		frame.setSize(440, 670);//设置窗体尺寸大小
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);//可视化
		game.action();//程序主入口,由此进入

	}
}

	


最近下载更多
微信网友_6191697646571520  LV6 2022年10月27日
迷迭香  LV10 2022年9月22日
zxy135201  LV5 2022年9月16日
agjbvfhjbg  LV6 2022年9月9日
jackzhang123  LV2 2022年9月3日
cuijunjie  LV3 2022年7月2日
java代写  LV7 2022年6月4日
Yj1009  LV2 2022年6月2日
牛牛最棒哈哈  LV3 2022年5月31日
最近浏览更多
名居一栋一你 2024年6月7日
暂无贡献等级
鬼屋报道  LV3 2024年6月1日
不不要  LV1 2024年5月15日
847214276 2024年5月14日
暂无贡献等级
yq312672546  LV1 2024年2月22日
axdfer 2024年1月4日
暂无贡献等级
bssheep  LV1 2023年12月31日
sjshsj 2023年12月21日
暂无贡献等级
潘润之 2023年12月20日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友