手把手教你做遊戲——JAVA GUI 推箱子(二)

手把手教你做遊戲——JAVA GUI 推箱子(一)做好後,我們就需要做遊戲主體了

 1.新建MainGame.java並創建窗口

這次我們的大致結構是這樣的 (下圖),上面一個JMenuBar作爲菜單欄,添加菜單(選關,重玩,地圖編輯器,關於),下方一個遊戲界面。其餘的就無關緊要了

 

package cn.edu.caztc.sokobangame;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 遊戲主體
 * 
 * @author 莫言情難忘
 *
 */
public class MainGame extends JFrame implements MapConfig {

	// 遊戲面板
	JPanel panel;

	public static void main(String[] args) {
		new MainGame();
	}

	public MainGame() {
		// TODO Auto-generated constructor stub
		this.setTitle("推箱子");
		this.setSize(900, 950);
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(3);
		// 設置窗體居中
		this.setLocationRelativeTo(null);
		// 不可拉伸
		this.setResizable(false);

		JMenuBar menuBar = new JMenuBar();
		this.add(menuBar, BorderLayout.NORTH);

		JMenu menu = new JMenu("菜單");
		menuBar.add(menu);

		JMenuItem menuItem = new JMenuItem("選關");
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// System.out.println("選關");
			}
		});
		menu.add(menuItem);

		JMenuItem menuItem_1 = new JMenuItem("重新開始");
		menuItem_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 重新開始
			}
		});
		menu.add(menuItem_1);

		JMenuItem menuItem_2 = new JMenuItem("關於");
		menuItem_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// System.out.println("關於");
				JOptionPane.showMessageDialog(null, "莫言情難忘開發,csdn:莫言情難忘,個人QQ:1179307527", "關於",
						JOptionPane.PLAIN_MESSAGE);
			}
		});

		JMenu menu_1 = new JMenu("\u81EA\u5B9A\u4E49");
		menuBar.add(menu_1);

		JMenuItem menuItem_3 = new JMenuItem("地圖編輯器");
		menuItem_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				test demo = new test();
//				demo.open();
			}
		});
		menu_1.add(menuItem_3);
		menuBar.add(menuItem_2);

		panel = new JPanel();
		this.add(panel);
		this.setVisible(true);

	}

}
效果圖

 2.讀取地圖數據

我們在教程一中是怎麼保存的,這次怎麼取出來。

其中參數level是關卡的意思,即我們讀取的地圖是第幾關

參數diy是你選關是本人即開發者做的地圖還是玩家自己做的地圖

 

/**
	 * 讀取地圖數據
	 * @param level 關卡
	 * @param diy 
	 */
	void GetMAP(int level,boolean diy) {
		String stringdiy = "";
		if (diy) {
			stringdiy="diy";
		}
		try {
			DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path+"\\" + stringdiy + level + ".map")));
			int i = in.readInt();
			int j = in.readInt();
			for (int ii = 0; ii < i; ii++) {
				for (int jj = 0; jj < j; jj++) {
					map1[ii][jj][0] = in.readInt();
					if (map1[ii][jj][0] == 5) {
						playex = ii;
						playey = jj;
						map1[ii][jj][0] = 1;
					}

				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

3.地圖實現

 和一的部分差不多,我們需要新建一個面板內部類,用於構造地圖。

其中的幾個值在接口MapConfig中

 

	/**
	 * 自定義內部遊戲面板類
	 * 
	 * @author 莫言情難忘
	 * 
	 */
	class MyPanel extends JPanel {
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			for (int i = 0; i < MapHeight / eleHeight; i++) {
				for (int j = 0; j < MapWidth / eleWidth; j++) {
					g.drawImage(GetGameImage(map1[i][j][0]), getDrawX(j), getDrawY(i), eleWidth, eleHeight, null);
				}
			}
			g.drawImage(icon106.getImage(), getDrawX(playey), getDrawY(playex), eleWidth, eleHeight, null);
		}

		// 將數組下標轉化成對應的圖片左上角座標
		public int getDrawX(int j) {
			int x = j * 50;
			return x;
		}

		// 將數組下標轉化成對應的圖片左上角座標
		public int getDrawY(int i) {
			int y = i * 50;
			return y;
		}
	}

4.整合代碼

 整合上述代碼,遊戲主體默認讀取1.map。將main方法移動到test.java中測試。需要D盤存在文件夾(推箱子),存在地圖文件1.map。1.map文件可在XXX下載中獲取。

package cn.edu.caztc.sokobangame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.FileInputStream;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 遊戲主體
 * 
 * @author 莫言情難忘
 *
 */
public class MainGame extends JFrame implements MapConfig {

	int[][][] map1 = new int[18][18][1];// 地圖數組
	int playex = 0;// 玩家座標
	int playey = 0;// 玩家座標
	boolean diy = false;//
	int level = 1;// 關卡
	// 遊戲面板
	JPanel panel;

	public MainGame() {
		// TODO Auto-generated constructor stub
		this.setTitle("推箱子");
		this.setSize(900, 950);
		this.setLayout(new FlowLayout());
		this.setDefaultCloseOperation(3);
		// 設置窗體居中
		this.setLocationRelativeTo(null);
		// 不可拉伸
		this.setResizable(false);

		JMenuBar menuBar = new JMenuBar();
		this.add(menuBar, BorderLayout.NORTH);

		JMenu menu = new JMenu("菜單");
		menuBar.add(menu);

		JMenuItem menuItem = new JMenuItem("選關");
		menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// System.out.println("選關");
			}
		});
		menu.add(menuItem);

		JMenuItem menuItem_1 = new JMenuItem("重新開始");
		menuItem_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 重新開始
			}
		});
		menu.add(menuItem_1);

		JMenuItem menuItem_2 = new JMenuItem("關於");
		menuItem_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// System.out.println("關於");
				JOptionPane.showMessageDialog(null, "莫言情難忘開發,csdn:莫言情難忘,個人QQ:1179307527", "關於",
						JOptionPane.PLAIN_MESSAGE);
			}
		});

		JMenu menu_1 = new JMenu("\u81EA\u5B9A\u4E49");
		menuBar.add(menu_1);

		JMenuItem menuItem_3 = new JMenuItem("地圖編輯器");
		menuItem_3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {

			}
		});
		menu_1.add(menuItem_3);
		menuBar.add(menuItem_2);

		GetMAP(level, diy);
		// 創建遊戲面板
		panel = setpanel();

		this.add(panel);
		this.setVisible(true);

	}

	/**
	 * 讀取地圖數據
	 * 
	 * @param level 關卡
	 * @param diy
	 */
	void GetMAP(int level, boolean diy) {
		String stringdiy = "";
		if (diy) {
			stringdiy = "diy";
		}
		try {
			DataInputStream in = new DataInputStream(
					new BufferedInputStream(new FileInputStream(PATH + "\\" + stringdiy + level + ".map")));
			int i = in.readInt();
			int j = in.readInt();
			for (int ii = 0; ii < i; ii++) {
				for (int jj = 0; jj < j; jj++) {
					map1[ii][jj][0] = in.readInt();
					if (map1[ii][jj][0] == 5) {
						playex = ii;
						playey = jj;
						map1[ii][jj][0] = 1;
					}

				}
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	/**
	 * 自定義內部遊戲面板類
	 * 
	 * @author 莫言情難忘
	 * 
	 */
	class MyPanel extends JPanel {
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			for (int i = 0; i < MAP_HEIGHT / SOUREC_HEIGHT; i++) {
				for (int j = 0; j < MAP_WIDTH / SOUREC_WIDTH; j++) {
					g.drawImage(GetGameImage(map1[i][j][0]), getDrawX(j), getDrawY(i), SOUREC_WIDTH, SOUREC_HEIGHT,
							null);
				}
			}
			g.drawImage(icon106.getImage(), getDrawX(playey), getDrawY(playex), SOUREC_WIDTH, SOUREC_HEIGHT, null);
		}

		// 將數組下標轉化成對應的圖片左上角座標
		public int getDrawX(int j) {
			int x = j * 50;
			return x;
		}

		// 將數組下標轉化成對應的圖片左上角座標
		public int getDrawY(int i) {
			int y = i * 50;
			return y;
		}
	}

	/**
	 * 設置遊戲面板
	 */
	public JPanel setpanel() {
		JPanel panel = new MyPanel();
		panel.setPreferredSize(new Dimension(MAP_WIDTH, MAP_HEIGHT));
		panel.setLayout(null);
		panel.setBackground(Color.black);
		return panel;
	}

	/**
	 * 獲取到數字對應的圖片
	 * 
	 * @param i 數字
	 * @return
	 */
	Image GetGameImage(int i) {
		if (i > 5) {
			i = 0;
		}
		return allicons[i].getImage();
	}
}
整合後效果

好了,身爲一個理工男寫博客還是挺費勁的,還好只是代碼多。

莫言情難忘  1179307527

更多請看:

手把手教你做遊戲——JAVA GUI 推箱子(一)

手把手教你做遊戲——JAVA GUI 推箱子(二)

手把手教你做遊戲——JAVA GUI 推箱子(三)

手把手教你做遊戲——JAVA GUI 推箱子(四)

手把手教你做遊戲——JAVA GUI 推箱子(五)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章