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() {@Overridepublic void windowClosing(WindowEvent e) {// TODO Auto-generated method stubSystem.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();}@Overridepublic void run() {while(true) {//通过调用repaint.让JVM去执行update方法.进行重新的绘制.repaint();try {Thread.sleep(GAME_INTERVAL);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.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();}
}