从零开始手写mmo游戏从框架到爆炸(十三)— 地图与野怪模板

这篇具有很好参考价值的文章主要介绍了从零开始手写mmo游戏从框架到爆炸(十三)— 地图与野怪模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

         导航:从零开始手写mmo游戏从框架到爆炸(零)—— 导航-CSDN博客 

         首先祝大家龙年大吉,大吉大利,财源滚滚,事事如意!

         角色有了,那么基本的功能应该包括选择地图,打怪,掉落装备,升级等等,我们一一来完成。首先我们设计野怪和地图。

野怪模板

       和上一章一样,我们首先创建野怪的模板-MonsterTemplate。

/**
 * @version 1.0.0
 * @description: 野怪模版
 * @author: eric
 * @date: 2024-02-18 13:50
 **/
public class MonsterTemplate extends CharacterTemplate{

    private int quality;    // 作为野怪的级别 普通 进阶 史诗 传奇 神话

    public int getQuality() {
        return quality;
    }

    public void setQuality(int quality) {
        this.quality = quality;
    }
}

       我们看到野怪有了品质的划分,野怪根据品质可以分为普通-进阶-史诗-传奇-神话。这点在后面创建野怪的时候可以看到效果。

      创建怪物模板json,有些参数是后面慢慢需要用到的,大家主要关注的就是基本属性和升级属性。

[
  {
    "id":101,
    "name":"地精战士",
    "strength":15,
    "armature":10,
    "constitution":15,
    "magic":0,
    "technique":0,
    "speed":10,
    "quality":1,
    "levelUpStrength":3,
    "levelUpArmature":1,
    "levelUpConstitution":3,
    "levelUpMagic":0,
    "levelUpTechnique":3,
    "levelUpSpeed":3,
    "skills":"",
    "skillQuality":"E",
    "extSkills":"",
    "attackType":0,
    "sum":12,
    "init":55,
    "poisonResistance":5,
    "flameResistance":5,
    "thunderResistance":5,
    "iceResistance":5,
    "exp":1.1,
    "position":1
  },
  {
    "id":120,
    "name":"地精头目",
    "strength":25,
    "armature":20,
    "constitution":25,
    "magic":0,
    "technique":0,
    "speed":15,
    "quality":2,
    "levelUpStrength":5,
    "levelUpArmature":2,
    "levelUpConstitution":6,
    "levelUpMagic":0,
    "levelUpTechnique":6,
    "levelUpSpeed":5,
    "skills":"",
    "skillQuality":"E",
    "extSkills":"",
    "attackType":0,
    "sum":22.5,
    "init":97.5,
    "poisonResistance":5,
    "flameResistance":5,
    "thunderResistance":5,
    "iceResistance":5,
    "exp":1.1,
    "position":1
  },
  {
    "id":140,
    "name":"地精精英",
    "strength":45,
    "armature":30,
    "constitution":120,
    "magic":10,
    "technique":10,
    "speed":20,
    "quality":3,
    "levelUpStrength":10,
    "levelUpArmature":3,
    "levelUpConstitution":12,
    "levelUpMagic":0,
    "levelUpTechnique":8,
    "levelUpSpeed":8,
    "skills":"",
    "skillQuality":"E",
    "extSkills":"",
    "attackType":0,
    "sum":38.5,
    "init":255,
    "poisonResistance":5,
    "flameResistance":5,
    "thunderResistance":5,
    "iceResistance":5,
    "exp":1.1,
    "position":1
  }
]

      创建怪物工厂-MonsterFactory 

package com.loveprogrammer.factory;

import com.alibaba.fastjson2.JSONArray;
import com.loveprogrammer.factory.template.MonsterTemplate;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @ClassName MonsterFactory
 * @Description 怪物工厂
 * @Author admin
 * @Date 2024/2/18 9:53
 * @Version 1.0
 */
public class MonsterFactory {

    private static List<MonsterTemplate> monsterTemplates;

    private static Map<Integer,MonsterTemplate> monsterTemplateMap;

    // 初始化野怪模版
    static {
        try {
            // 读取配置文件,然后加载到weaponTemplates中
            ClassLoader classLoader = MonsterFactory.class.getClassLoader();
            InputStream inputStream = classLoader.getResourceAsStream("template/monster.json");

            assert inputStream != null;
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            StringBuilder responseStrBuilder = new StringBuilder();

            String inputStr;
            while ((inputStr = streamReader.readLine()) != null)
                responseStrBuilder.append(inputStr);

            monsterTemplates = JSONArray.parseArray(responseStrBuilder.toString(), MonsterTemplate.class);
            monsterTemplateMap = monsterTemplates.stream().collect(Collectors.toMap(MonsterTemplate::getId, e->e));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        for (MonsterTemplate monsterTemplate : monsterTemplates) {
            System.out.println(monsterTemplate.toString());
        }
    }
}

  运行怪物工厂的main方法可以看到已经载入了怪物模板

CharacterTemplate{角色 ='地精战士', 说明='null', 力量=15, 护甲=10, 体力=15, 魔力=0, 技巧=0, 速度=10}
CharacterTemplate{角色 ='地精头目', 说明='null', 力量=25, 护甲=20, 体力=25, 魔力=0, 技巧=0, 速度=15}
CharacterTemplate{角色 ='地精精英', 说明='null', 力量=45, 护甲=30, 体力=120, 魔力=10, 技巧=10, 速度=20}

地图

        地图要包括野怪的id,等级以及每次和玩家打架的数量。同时我们为了后续扩展,还增加普通野怪和精英野怪的区分。地图的模板代码如下,大家可以自行查看-MapTemplate

package com.loveprogrammer.factory.template;

import java.io.Serializable;
import java.util.List;

/**
 * @version 1.0.0
 * @description: 地图模版
 * @author: eric
 * @date: 2024-02-18 11:29
 **/
public class MapTemplate implements Serializable{

    private String id;

    private String name;

    private int level;

    private String desc;

    private List<FloorMap> floors;

    private List<MonsterData> monsters;

    private String teamSize;

    private List<String> npcIds;

    private List<BossData> bossList;

    private Integer resistanceReduce;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public List<MonsterData> getMonsters() {
        return monsters;
    }

    public void setMonsters(List<MonsterData> monsters) {
        this.monsters = monsters;
    }

    @Override
    public String toString() {
        return "MapTemplate{" +
                "id='" + id + '\'' +
                ", 名称='" + name + '\'' +
                ", 级别='" + level + '\'' +
                ", 说明='" + desc + '\'' +
                '}';
    }

    public static class FloorMap implements Serializable {

        private String id;

        private String name;

        private String desc;

        private List<MonsterData> monsters;

        private String teamSize;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public List<MonsterData> getMonsters() {
            return monsters;
        }

        public void setMonsters(List<MonsterData> monsters) {
            this.monsters = monsters;
        }

        public String getTeamSize() {
            return teamSize;
        }

        public void setTeamSize(String teamSize) {
            this.teamSize = teamSize;
        }
    }

    public static class MonsterData implements Serializable {
        // 出现的概率
        private int percents;

        // 级别最高
        private int levelMin;

        // 级别最低
        private int levelMax;

        //
        private int monsterId;

        // 掉落的列表
        private List<Drop> dropList;

        public int getPercents() {
            return percents;
        }

        public void setPercents(int percents) {
            this.percents = percents;
        }

        public int getLevelMin() {
            return levelMin;
        }

        public void setLevelMin(int levelMin) {
            this.levelMin = levelMin;
        }

        public int getLevelMax() {
            return levelMax;
        }

        public void setLevelMax(int levelMax) {
            this.levelMax = levelMax;
        }

        public int getMonsterId() {
            return monsterId;
        }

        public void setMonsterId(int monsterId) {
            this.monsterId = monsterId;
        }

        public List<Drop> getDropList() {
            return dropList;
        }

        public void setDropList(List<Drop> dropList) {
            this.dropList = dropList;
        }
    }


    public static class BossData implements Serializable {
        // 级别
        private int level;

        //
        private int monsterId;

        private List<String> teamMembers;

        // 掉落的列表
        private List<Drop> dropList;

        public int getLevel() {
            return level;
        }

        public void setLevel(int level) {
            this.level = level;
        }

        public int getMonsterId() {
            return monsterId;
        }

        public void setMonsterId(int monsterId) {
            this.monsterId = monsterId;
        }

        public List<String> getTeamMembers() {
            return teamMembers;
        }

        public void setTeamMembers(List<String> teamMembers) {
            this.teamMembers = teamMembers;
        }

        public List<Drop> getDropList() {
            return dropList;
        }

        public void setDropList(List<Drop> dropList) {
            this.dropList = dropList;
        }
    }


    public static class Drop implements Serializable {
        // 出现的概率
        private int percents;

        //
        private int goodsId;

        private String goodsType;

        public int getPercents() {
            return percents;
        }

        public void setPercents(int percents) {
            this.percents = percents;
        }

        public int getGoodsId() {
            return goodsId;
        }

        public void setGoodsId(int goodsId) {
            this.goodsId = goodsId;
        }

        public String getGoodsType() {
            return goodsType;
        }

        public void setGoodsType(String goodsType) {
            this.goodsType = goodsType;
        }
    }

    public String getTeamSize() {
        return teamSize;
    }

    public void setTeamSize(String teamSize) {
        this.teamSize = teamSize;
    }

    public List<String> getNpcIds() {
        return npcIds;
    }

    public void setNpcIds(List<String> npcIds) {
        this.npcIds = npcIds;
    }

    public List<BossData> getBossList() {
        return bossList;
    }

    public void setBossList(List<BossData> bossList) {
        this.bossList = bossList;
    }

    public List<FloorMap> getFloors() {
        return floors;
    }

    public void setFloors(List<FloorMap> floors) {
        this.floors = floors;
    }

    public Integer getResistanceReduce() {
        return resistanceReduce;
    }

    public void setResistanceReduce(Integer resistanceReduce) {
        this.resistanceReduce = resistanceReduce;
    }
}

        我们创建一个地图的json

[
  {
    "id": 1,
    "name": "新手村",
    "level": 1,
    "desc": "新手练级的地方,适合等级1-10级",
    "teamSize": "2-3",
    "monsters": [
      {
        "percents": 45,
        "levelMin": 1,
        "levelMax": 3,
        "monsterId": 101
      },
      {
        "percents": 45,
        "levelMin": 4,
        "levelMax": 6,
        "monsterId": 120
      },
      {
        "percents": 10,
        "levelMin": 7,
        "levelMax": 9,
        "monsterId": 140
      },
      {
        "percents": 10,
        "levelMin": 5,
        "levelMax": 9,
        "monsterId": 141
      }
    ],
    "npcIds": [],
    "bossList": [
    ]
  }
]

        同样我们来看下地图工厂的代码

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.loveprogrammer.factory.template.MapTemplate;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

/**
 * @version 1.0.0
 * @description: 地图工厂
 * @author: eric
 * @date: 2022-08-08 16:44
 **/
public class MapFactory {

    private static List<MapTemplate> mapTemplates;

    // 初始化地图模版
    static {
        try {
            // 读取配置文件,然后加载到weaponTemplates中
            ClassLoader classLoader = MapFactory.class.getClassLoader();
            InputStream inputStream = classLoader.getResourceAsStream("template/map.json");

            assert inputStream != null;
            BufferedReader streamReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            StringBuilder responseStrBuilder = new StringBuilder();

            String inputStr;
            while ((inputStr = streamReader.readLine()) != null)
                responseStrBuilder.append(inputStr);

            mapTemplates = JSONArray.parseArray(responseStrBuilder.toString(), MapTemplate.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        for (MapTemplate mapTemplate : mapTemplates) {
            System.out.println(JSON.toJSONString(mapTemplate));
        }
    }
}

全部源码详见:

gitee : eternity-online: 多人在线mmo游戏 - Gitee.com

分支:step-08文章来源地址https://www.toymoban.com/news/detail-827596.html

到了这里,关于从零开始手写mmo游戏从框架到爆炸(十三)— 地图与野怪模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【手写数据库】从零开始手写数据库内核,行列混合存储模型,学习大纲成型了

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年02月04日
    浏览(60)
  • 【从零开始学习JAVA | 第三十三篇】File类

    目录 前言: File类: 构造方法: 常见成员方法: 总结:         本文我们将为大家介绍JAVA中一个比较使用的类:File类,他为我们提供了存储数据的功能,使得程序的数据不至于在运行结束之后就丢失,是一个很好的类。         File类是Java标准库中用于操作文件和目录

    2024年02月15日
    浏览(58)
  • 教你从零开始画echarts地图

    离线地图下载地址https://datav.aliyun.com/tools/atlas/index.html echarts文档地址https://echarts.apache.org/zh/option.html 基于VUE编写,其他框架请自行转换,大同小异 先让地图内容出来,npm安装步骤省略,请参考官方文档,创建的div必须设置宽度和高度,关于图表的宽高自适应,参考我的另一

    2023年04月17日
    浏览(77)
  • 【从零开始学习JAVA | 第二十三篇】集合体系结构

    目录 前言: 单列集合:      set与list的区别: 双列集合: map的特点: 总结:                   JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这

    2024年02月16日
    浏览(59)
  • 从零开始搭建搜索推荐系统(五十三)QUERY从分词检索进阶

    聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧! (PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~) 一、

    2024年02月04日
    浏览(35)
  • 从零开始学python(十三)爬虫工程师自动化和抓包

    回顾之前讲述了python语法编程 必修入门基础和网络编程,多线程/多进程/协程等方面的内容,后续讲到了数据库编程篇MySQL,Redis,MongoDB篇,和机器学习,全栈开发,数据分析,爬虫数据采集前面没看的也不用往前翻,系列文已经整理好了: 1.跟我一起从零开始学python(一)

    2024年02月14日
    浏览(48)
  • 【云原生 | 从零开始学Kubernetes】二十三、Kubernetes控制器Statefulset

    该篇文章已经被专栏《从零开始学k8s》收录 上一篇文章:kubernetes持久化存储下 点击跳转 StatefulSet 是为了管理有状态服务的问题而设计的 对于StatefulSet中的Pod,每个Pod挂载自己独立的存储,如果一个Pod出现故障,从其他节点启动一个同样名字的Pod,要挂载上原来Pod的存储继续

    2024年02月03日
    浏览(36)
  • 【从零开始学Skynet】实战篇《球球大作战》(十三):场景代码设计(下)

            《球球大作战》是一款服务端运算的游戏,一般会使用主循环程序结构,让服务端处理战斗逻辑。如下图所示,图中的 balls 和 foods 代表服务端的状态,在循环中执行 “ 食物生成 ”“ 位置更新 ” 和 “ 碰撞检 测” 等功能,从而改变服务端的状态。 scene 启动后

    2023年04月18日
    浏览(60)
  • 从零开始学习 Java:简单易懂的入门指南之Map集合(二十三)

    1.1Map集合概述和特点 Map集合概述 Map集合的特点 双列集合,一个键对应一个值 键不可以重复,值可以重复 Map集合的基本使用 1.2Map集合的基本功能 方法介绍 方法名 说明 V put(K key,V value) 添加元素 V remove(Object key) 根据键删除键值对元素 void clear() 移除所有的键值对元素 boolean con

    2024年02月09日
    浏览(50)
  • 从零开始学习调用百度地图网页API:二、初始化地图,鼠标交互创建信息窗口

    注 :需要将 你的ak 替换,从百度地图官网注册申请。 脚本中使用BMap创建Map实例,centerAndZoom()初始化地图设置中心点为北京,地图等级15。enableScrollWheelZoom()鼠标滚轮可缩放窗口。addEventListener监听鼠标点击事件,发生后,传递事件e至function(e),执行openInfoWindow,在鼠标点击坐

    2024年02月07日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包