純java寫2D格鬥遊戲(一)——介面背景設定及人物的簡單設定
阿新 • • 發佈:2018-12-22
/**
莫言情難忘
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