前言
基于Java的飞翔小鸟游戏,本代码来自b站up主分享。本游戏所需的图片素材需要自己获取并下载,在此视频下,视频链接:【Java经典小游戏项目之飞翔的小鸟】 https://www.bilibili.com/video/BV1ou411o7br/?p=10&share_source=copy_web&vd_source=4611ec45767280678018f593c547e388。
启动入口
package com.bird.app;
import com.bird.main.GameFrame;
public class GameApp {
? ? public static void main(String[] args) {
? ? ? ? new GameFrame();
? ? }
}
主类
游戏主窗口类
package com.bird.main;
import static com.bird.util.Constant.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
/**
?* 游戏的主窗口类,所有的关于游戏中绘制的内容都在此类中完成。
?*/
public class GameFrame extends Frame {
? ? //实例化gamebackGround类
? ? private GameBackGround gameBackGround;
? ? //实例化Bird类
? ? private Bird bird;
? ? //实例化GameBarrierLayer类
? ? private GameBarrierLayer gameBarrierLayer;
? ? //实例化GameFrontGround类
? ? private GameFrontGround gameFrontGround;
? ? //存放图片的图片
? ? private BufferedImage buffimg = new BufferedImage(FRAM_WIDTH,FRAM_HEIGNT,BufferedImage.TYPE_4BYTE_ABGR);
? ? //构造方法中初始化一些参数
? ? public GameFrame(){
? ? ? ? //窗口是否可见
? ? ? ? setVisible(true);
? ? ? ? //窗口的大小
? ? ? ? setSize(FRAM_WIDTH,FRAM_HEIGNT);
? ? ? ? //窗口的标题
? ? ? ? setTitle(FRAM_TITLE);
? ? ? ? //窗口的初始化位置
? ? ? ? setLocation(FRAM_X,FRAM_Y);
? ? ? ? //窗口的大小不可改变
? ? ? ? setResizable(false);
? ? ? ? //窗口的关闭事件
? ? ? ? addWindowListener(new WindowAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void windowClosing(WindowEvent e) {
? ? ? ? ? ? ? ? System.exit(0);//结束程序
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //初始化游戏对象
? ? ? ? initGamg();
? ? ? ? new run().start();
? ? ? ? //添加按键监听
? ? ? ? addKeyListener(new KeyAdapter() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void keyPressed(KeyEvent e) {
? ? ? ? ? ? ? ? add(e);
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void keyReleased(KeyEvent e) {
? ? ? ? ? ? ? ? minu(e);
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? //对游戏中的对象初始化
? ? public void initGamg(){
? ? ? ? gameBackGround = new GameBackGround();
? ? ? ? bird = new Bird();
? ? ? ? gameFrontGround = new GameFrontGround();
? ? ? ? gameBarrierLayer = new GameBarrierLayer();
? ? }
? ? class run extends Thread{
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? repaint();
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? Thread.sleep(33);
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? /**
? ? ?* 所有的我们需要绘制的内容都在此方法中进行调用绘制
? ? ?*/
? ? @Override
? ? public void update(Graphics g) {
? ? ? ? if(bird.life){
? ? ? ? ? ? //得到图片的画笔
? ? ? ? ? ? Graphics graphics = buffimg.getGraphics();
? ? ? ? ? ? gameBackGround.draw(graphics);
? ? ? ? ? ? bird.draw(graphics);
? ? ? ? ? ? gameFrontGround.draw(graphics);
? ? ? ? ? ? gameBarrierLayer.draw(graphics,bird);
? ? ? ? ? ? //一次性的将图片绘制到屏幕中
? ? ? ? ? ? g.drawImage(buffimg,0,0,null);
? ? ? ? }else {
? ? ? ? ? ? String over = "游戏结束";
? ? ? ? ? ? g.setColor(Color.red);
? ? ? ? ? ? g.setFont(new Font("微软雅黑",1,60));
? ? ? ? ? ? g.drawString(over,180,250);
? ? ? ? ? ? String reset = "Space Reset Game";
? ? ? ? ? ? g.drawString(reset,25,350);
? ? ? ? }
? ? }
? ? //按键
? ? public void add(KeyEvent e){
? ? ? ? switch (e.getKeyCode()){
? ? ? ? ? ? case KeyEvent.VK_UP:
? ? ? ? ? ? ? ? bird.fly(1);
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case KeyEvent.VK_SPACE:
? ? ? ? ? ? ? ? if (bird.life == false) {
? ? ? ? ? ? ? ? ? ? restart();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? //抬键
? ? public void minu(KeyEvent e){
? ? ? ? switch (e.getKeyCode()){
? ? ? ? ? ? case KeyEvent.VK_UP:
? ? ? ? ? ? ? ? bird.fly(5);
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? /**
? ? ?* 重置游戏
? ? ?*/
? ? public void restart(){
? ? ? ? gameBarrierLayer.restant();
? ? ? ? bird.restartDraw();
? ? }}
游戏前景类
package com.bird.main;
import com.bird.util.Constant;
import com.bird.util.GameUtil;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
?* 游戏的前景类
?*/
public class GameFrontGround {
? ? //云彩的个数
? ? private static final int CLOUND_COUNT = 2;
? ? //存放云彩的容器
? ? private List<Cloud> clouds;
? ? //云彩的飞行速度
? ? private static final int CLOUNG_SPEED = 1;
? ? //使用到图片资源
? ? private BufferedImage[] img;
? ? //用于产生随机数
? ? private Random random;
? ? // 构造器初始化数据
? ? public GameFrontGround() {
? ? ? ? clouds = new ArrayList<>();
? ? ? ? img = new BufferedImage[CLOUND_COUNT