/**
莫言情难忘
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