Java游戏编程——愤怒的小鸟(一)

前言:最近在b站up主尚学堂杨老师(b站链接)学习了我做的第一个游戏项目,所以在csdn进行总结,便于今后查看。

本部分主要是将游戏的背景绘制出来

先上一张效果图:

资源

图片资源

颜色资源
0x4bc4cf

准备工作完成,开始书写代码啦

  • 类图


    对game.bird.util文件夹下说明在开发过程中我们尽量不书写单独的常量,而是将其放在一个public的类中专门存储,便于日后的开发和修改;同时工具方法,也应该放在一个单独的类public类中便于调用。

    Constant.java

    代码中所有的常量

    package game.bird.util;
    
    import java.awt.Color;
    
    public class Constant {
    	//窗口的长、宽
    	public static final int FRAME_WIDTH = 800;
    	public static final int FRAME_HEIGHT = 550;
    	
    	//窗口的名字
    	public static final String FRAME_NAME = "愤怒的小鸟";
    	
    	
    	//图片资源的位置
    	//1.背景资源
    	public static final String BK_IMG_PATH = "img/bird_bk.png";
    	//2.小鸟资源
    	public static final String[] BIRDS_IMG_PATH = {"img/bird_1.png",
    			"img/bird_up.png","img/bird_down.png"};
    	
    	//线程休眠时间
    	public static final int GAME_INTERVAL = 33;
    	
    	//背景颜色
    	public static final Color BACK_COLOR =new Color(0x4bc4cf);
    	
    	//窗口顶部宽度
    	public static final int HEIGHT = 15;
    	
    	//小鸟飞行的速度
    	public static final int SPEED = 5;
    	
    	//小鸟飞行的最大加速度
    	public static final int UP_SPEED_MAX = 10;
    	public static final int DOWN_SPEED_MAX = 15;
    
    }
    
    

    GameUtil.java

    游戏的工具类
     loadBufferedImages()得到图片路径,并初始化图片资源

    package game.bird.util;
    
    import java.awt.image.BufferedImage;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    /*
     *游戏工具类,游戏中用到的方法均在此 
     * */
    public class GameUtil {
    		
    		private GameUtil() {}
    	
    		/**
    		 * 装载图片
    		 * @param imgName  图片路径名
    		 * @return
    		 */
    		public static BufferedImage loadBufferedImage(String imgPath){
    			try {
    				return ImageIO.read(new FileInputStream(imgPath));
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    			return null;
    		}
    		
    }
    
    

    GameFrame.java

    游戏的窗口类,是本项目的“擎天柱”
    注:做游戏界面不同于做普通软件界面,需要尽量做到每个像素点都可控,故尽量少使用已封装好的类(而且也有点儿丑)

    代码思路:

    1、窗口初始化:
     - 大小
     - 显示可见
     - 退出按键点击响应事件
    2、游戏初始化:
     - 显示底部背景图片:

    • 根据Frame宽度和图片宽度,得到所需的图片数量
    • 通过paint(Graphic g)绘制背景,再用update刷新界面
      (注意:update是在启动刷新窗口的线程后由系统JVM自行调用的,不需要我们显示调用)
      3、 给屏幕上方添加与底色相同的背景色
    package game.bird.main;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.awt.image.BufferedImage;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    import static game.bird.util.Constant.*;
    
    
    public class GameFrame extends Frame implements Runnable{
    	
    	GameBackGround backGround;
    	Bird bird;
    	
    	public void initFrame() {
    		
    		setVisible(true);
    		setSize(FRAME_WIDTH,FRAME_HEIGHT);
    		setTitle(FRAME_NAME);
    		//窗口大小设为不可调节
    		setResizable(false);
    		
    		//给窗口添加关闭功能
        	addWindowListener(new WindowAdapter() {
        	      @Override
        	    public void windowClosing(WindowEvent e) {
        	    	// TODO Auto-generated method stub
        	        System.exit(0);
        	    }
    		});
    		
    	}
    	
    	//对游戏中的对象进行初始化
    	public void initGame() {
    		backGround = new GameBackGround();
    	
    		//启动用于刷新窗口的线程
        	new Thread(this).start();
    	}
    	
    	 /**
         * 所有的我们需要绘制的内容,都要在此方法中进行调用绘制.
         * update 方式是JVM调用的,怒要主动调用该方法
         * 
         */
        public void update(Graphics g) {
        	backGround.draw(g);	
        }
    	
    	
    	
    	public GameFrame() {
    		initFrame();
    		initGame();
    	}
    
    	@Override
    	public void run() {
    		 while(true) {
    	    	 //通过调用repaint.让JVM去执行update方法.进行重新的绘制.
    	    	 repaint();
    	    	 try {
    				Thread.sleep(GAME_INTERVAL);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    	    	 
    	     }
    		
    	}
    	
    }
    
    

    GameBackGround.java

    这段代码就没啥好说的了,有不懂的在下方留言即可

    package game.bird.main;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    
    import static game.bird.util.Constant.*;
    
    import game.bird.util.Constant;
    import game.bird.util.GameUtil;
    
    
    public class GameBackGround {
    	//背景需要的资源
    	private Image bkImg;
    	
    	//在构造方法中对资源进行初始化
    	public GameBackGround() {
    		bkImg = GameUtil.loadBufferedImage(BK_IMG_PATH);
    	}
    	
    	//自定义一个绘制的方法,用系统提供的画笔将图片绘制到指定的位置
    	public void draw(Graphics g) {
    		//得到图片的宽度
    		int imgW = bkImg.getWidth(null);
    		int imgH = bkImg.getHeight(null);
    		//绘制的循环次数
    		int count = FRAME_WIDTH/imgW + 1;
    		for (int i = 0; i < count; i++) {
    			g.drawImage(bkImg, imgW*i, FRAME_HEIGHT-imgH, null);
    		}
    		g.setColor(BACK_COLOR);
    		g.fillRect(0,HEIGHT, FRAME_WIDTH,FRAME_HEIGHT-HEIGHT-imgH );
    	}
    }
    
    

    GameApp.java

    程序入口

    package game.bird.app;
    
    import game.bird.main.GameFrame;
    
    public class GameApp {
    	public static void main(String[] args) {
    		GameFrame gFrame = new GameFrame();
    	}
    }
    
    

    更多推荐

    Java游戏编程——愤怒的小鸟(一)