学习java朋友们,福利来了,今天小编给大家带来了一款魔塔源码。注意:此源码仅供学习使用!!
视频演示
JAVA游戏源码:魔塔
源码搭建和讲解
启动main入口:
//************************************************************************
// ************完整源码移步: gitee典康姆/hadluo/java_game01.git *********
//************************************************************************
public class Main {
public static void main(String[] args) {
gamePanel = new MTGame();
gamePanel.setPreferredSize(new Dimension(GAME_PIX_72 * 18, GAME_PIX_72 * 13));
gamePanel.add(forecastLPane);
gamePanel.add(jumpLPane);
gamePanel.add(battleLPane);
gamePanel.add(msgLPane);
gamePanel.add(timeLabel);
gameFrame.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if (!MTGame.inConversation)
switch (e.getKeyCode()) {
case VK_DOWN: // 键盘 ↓
if (playerBean_1.getPosY() + 1 < 11 && playerBean_1.getPosY() + 1 >= 0) {
playerBean_1.setToward(1);
interaction(playerBean_1.getPosX(), playerBean_1.getPosY() + 1);
MTGame.gameFrame.repaint();
}
break;
case VK_RIGHT: // 键盘 →
if (playerBean_1.getPosX() + 1 < 11 && playerBean_1.getPosX() + 1 >= 0) {
playerBean_1.setToward(2);
interaction(playerBean_1.getPosX() + 1, playerBean_1.getPosY());
MTGame.gameFrame.repaint();
}
break;
case VK_UP: // 键盘 ↑
if (playerBean_1.getPosY() - 1 < 11 && playerBean_1.getPosY() - 1 >= 0) {
playerBean_1.setToward(3);
interaction(playerBean_1.getPosX(), playerBean_1.getPosY() - 1);
MTGame.gameFrame.repaint();
}
break;
case VK_LEFT: // 键盘 ←
if (playerBean_1.getPosX() - 1 < 11 && playerBean_1.getPosX() - 1 >= 0) {
playerBean_1.setToward(0);
interaction(playerBean_1.getPosX() - 1, playerBean_1.getPosY());
gameFrame.repaint();
}
break;
case VK_J: // 键盘 J
if (ItemsBean.isHasJump) {
displayJump();
}
break;
case VK_L: // 键盘 L
if (ItemsBean.isHasForecast) {
displayForecast();
}
break;
}
else if (e.getKeyCode() == e.VK_L)//bug
{
inConversation = false;
forecastLPane.removeAll();
forecastLPane.setVisible(false);
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
gameFrame.setContentPane(gamePanel);
gameFrame.setResizable(false);
gameFrame.pack();
gameFrame.setLocationRelativeTo(null);
gameFrame.setVisible(true);
gameFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}
怪物对象
public class MonsterBean implements Serializable {
@Deprecated
private int id; // Deprecated
private int hp; // 生命值
private int attack; // 攻击力
private int defend; // 防御力
private int money; // 金钱
private int exp; // 经验
private String name; // 怪物名
public MonsterBean(int id, int hp, int attack, int defend, int money, int exp, String name) {
this.id = id;
this.hp = hp;
this.attack = attack;
this.defend = defend;
this.money = money;
this.exp = exp;
this.name = name;
}
public int getHp() {
return hp;
}
public int getAttack() {
return attack;
}
public int getDefend() {
return defend;
}
public int getMoney() {
return money;
}
public int getExp() {
return exp;
}
public String getName() {
return name;
}
// public void setHp(int hp) {
// this.hp = hp;
// }
//
// public void setAttack(int attack) {
// this.attack = attack;
// }
//
// public void setDefend(int defend) {
// this.defend = defend;
// }
//
// public void setMoney(int money) {
// this.money = money;
// }
//
// public void setExp(int exp) {
// this.exp = exp;
// }
//
// public void setName(String name) {
// this.name = name;
// }
}
运行工具
代码是一个普通的java工程,我们直接导入到eclipse或者idea就可以运行了。
设计思想
- 关于 static 关键字使用。游戏中全局数据使用 static 修饰。数据预设部分为方便也使用 static。
- package 划分:bean 为实体类;util 为具体功能类;data 为数据源。
- 地图数据:MapData(26层的初始地形,对应资源文件)
- 怪物数据:MonsterData(33种怪物,id、名字、生命、攻击、防御、金钱、经验)
- 图片数据:ImageData(统一获取资源文件,转为 static)
- 对话数据:DialogData(全部对话数据)
- 地图动画:通过 Timer 交替引用资源文件实现
操作方式
- 方向键:人物移动;
- 空格键:确认;
- W S 键:商店、老人、商人、楼层跳跃事件的 光标上下移动;
- J 键:获得道具【风之罗盘】后,打开 楼层跳跃 面板;
- L 键:获得道具【圣光徽】后,打开 预测功能 面板。
结尾语
我是分享好物+教程+源码 的老罗,欢迎关注,更多精品源码!