1. 程式人生 > >純java寫2D格鬥遊戲(一)——介面背景設定及人物的簡單設定

純java寫2D格鬥遊戲(一)——介面背景設定及人物的簡單設定

/**

莫言情難忘

QQ:1179307527

*/

這幾天Java的實訓算是非常完美,自我感覺進步很大,但僅限於一般的程式設計,這兩天也看了不少思想,決定寫一個2D格鬥遊戲,原因有四:

1.鍛鍊自己的技術

2.分享技術

3.感覺做一個自己的遊戲才好玩,畢竟現階段2D格鬥的遊戲我都不愛玩

4.4399把拳皇封了,感覺心裡有點...(畢竟也是玩拳皇長大的)

思路:先寫一個遊戲介面(裡面包括用到的圖片及常量),再來一個遊戲視窗類和人物類即可

1.介面類(遊戲設定)因為僅僅是第一步,所以這個介面內容有點少

public interface Gameconfig {
	// 視窗大小
	int length = 1200;
	int width = 800;

	// 載入背景圖
	Image bround= new ImageIcon("images/bround/Desert.jpg").getImage();
	
	Image k_zou_right= new ImageIcon("images/zouyou.gif").getImage();
	Image k_pao_right= new ImageIcon("images/paoyou.gif").getImage();
}

2.遊戲面板(主要)

/**
 * 遊戲視窗
 * 
 * @author 莫言情難忘 QQ:1179307527
 *
 */
public class Gamewindow extends JFrame implements Gameconfig {
	/**
	 * 主方法,構造
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		new Gamewindow();
	}

	// 遊戲面板
	JPanel panel;

	public Gamewindow() {
		setTitle("2D格鬥遊戲");// 設定標題
		setSize(length, width);// 設定大小
		setLayout(new FlowLayout());// 設定佈局
		setDefaultCloseOperation(3);// 設定錯誤關閉操作
		setLocationRelativeTo(null);// 設定窗體居中
		setResizable(false);// 不可最大化

		// 建立遊戲面板
		panel = setpanel();

		add(panel);
		setVisible(true);// 顯示視窗

		// 安裝鍵盤監聽器
		PanelListenner plis = new PanelListenner();
		addKeyListener(plis);

		// 啟動人物移動執行緒
		Player player = new Player();
		player.start();

		// 啟動重新整理面板執行緒
		UpdateThread ut = new UpdateThread(panel);
		ut.start();
	}

	/**
	 * 設定遊戲面板
	 */
	public JPanel setpanel() {
		JPanel panel = new MyPanel();
		// 設定遊戲面板大小
		panel.setPreferredSize(new Dimension(length, width));
		panel.setLayout(null);
		return panel;
	}

	/**
	 * 內部遊戲按鍵監聽類
	 */
	class PanelListenner extends KeyAdapter {
		// 當按鍵按下
		public void keyPressed(KeyEvent e) {
			int code = e.getKeyCode();
			switch (code) {
			case KeyEvent.VK_LEFT:
				Player.left = true;
				break;
			case KeyEvent.VK_RIGHT:
				Player.right = true;
				break;
			case 65:
				// A鍵
				Player.left = true;
				break;
			case 68:
				// D鍵
				Player.right = true;
				break;
			// 74=J 75=K 76=L
			default:
				break;
			}
		}

		// 當按鍵釋放
		public void keyReleased(KeyEvent e) {
			int code = e.getKeyCode();
			switch (code) {
			case KeyEvent.VK_LEFT:
				Player.left = false;
				break;
			case KeyEvent.VK_RIGHT:
				Player.right = false;
				break;
			case 65:
				// A鍵
				Player.left = false;
				break;
			case 68:
				// D鍵
				Player.right = false;
				break;
			default:
				break;
			}
		}
	}

	/**
	 * 自定義內部遊戲面板類
	 * 
	 * @author 莫言情難忘 QQ:1179307527
	 */
	class MyPanel extends JPanel {
		@Override
		public void paint(Graphics g) {
			super.paint(g);
			// 畫背景圖,背景圖在images資料夾下的bround資料夾內,因為打鬥介面以後不是1個
			g.drawImage(bround, 0, 0, length, width, null);
			Player.draw(g);		
		}
	}
}

3.建立角色類(即自己,玩家)

/**
 * 玩家類 
 * @author 莫言情難忘
 */
public class Player extends Thread implements Gameconfig {


	// 判斷角色移動
	static boolean left = false;
	static boolean right = false;
	//角色座標
	static int py_x = 50;
	static int py_y = 346;
	static boolean firstda = true;
	// 角色的朝向 1,2分別代表左右(用來處理角色不移動時的朝向問題)
	static int towards = 2;//預設朝向右
/**
 * 執行緒
 */
	@Override
	public void run() {
		while (true) {
			moveLR();
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 角色左右移動的方法
	 */
	public void moveLR() {
		if (left) {
			towards = 1;
			if (py_x > 0 ) {
				py_x -= 10;
			}
		} else if (right) {
			towards = 2;
			if (py_x < 900) {
				py_x += 10;
			}
		}
	}

	public static void draw(Graphics g) {
		// 如果角色不在移動中
		if (!left && !right) {
			if (towards == 1) {// 最後移動朝向左
				g.drawImage(k_zou_right,py_x,py_y,244,424,null);
			} else if (towards == 2) {// 最後移動朝向右
				g.drawImage(k_zou_right,py_x,py_y,244,424,null);
			}
		} else {// 如果角色在移動中
			if (left) {
				g.drawImage(k_pao_right,py_x,py_y,300,424,null);
			} else if (right) {
				g.drawImage(k_pao_right,py_x,py_y,300,424,null);
			}
		}
	}
}

4.還有一個重新整理面板的執行緒

/**
 * 重新整理面板
 * @author 莫言情難忘
 *
 */
public class UpdateThread extends Thread{  
    JPanel panel;  
    public UpdateThread(JPanel panel) {  
        this.panel = panel;  
    }  
      
    @Override  
    public void run() {  
        while(true){  
            panel.repaint();  
            try {  
                Thread.sleep(10);  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            }  
        }  
    }     
}  

原始碼下載地址

連結:https://pan.baidu.com/s/1_pSB1kI2z09HwshsdPNZNg 密碼:gltf