纯java写2D格斗游戏(一)——界面背景设置及人物的简单设置

版权声明:本文为博主原创文章,可以转载,但必须注明来源。 https://blog.csdn.net/qq_40176716/article/details/80765247

/**

莫言情难忘

QQ:1179307527

*/

这几天Java的实训算是非常完美,自我感觉进步很大,但仅限于一般的编程,这两天也看了不少思想,决定写一个2D格斗游戏,原因有四:

1.锻炼自己的技术

2.分享技术

3.感觉做一个自己的游戏才好玩,毕竟现阶段2D格斗的游戏我都不爱玩

4.4399把拳皇封了,感觉心里有点...(毕竟也是玩拳皇长大的)


思路:先写一个游戏接口(里面包括用到的图片及常量),再来一个游戏窗口类和人物类即可

扫描二维码关注公众号,回复: 3349930 查看本文章


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

猜你喜欢

转载自blog.csdn.net/qq_40176716/article/details/80765247
今日推荐