学习java朋友们,福利来了,今天小编给大家带来了一款魔塔源码。注意:此源码仅供学习使用!!

717f92df-cd50-40e3-89a2-134734ea6451 (1).png

视频演示

https://githubs.xyz/show/212.mp4

源码搭建和讲解

代码采用原生java类库编写, 利用java swing作为界面框架,完整源码获取地址:

gitee.com/hadluo/java_game01.git

源码直接导入到eclipse或者idea就可以直接运行了。

启动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 键:获得道具【圣光徽】后,打开 预测功能 面板。

结尾语

源码仅供学习参考


精品源码屋
6 声望12 粉丝

提供海量精品源码,业务范围:游戏,网站,工具等。 也支持招商代理