国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從零開始手寫mmo游戲從框架到爆炸(十三)— 地圖與野怪模板

這篇具有很好參考價值的文章主要介紹了從零開始手寫mmo游戲從框架到爆炸(十三)— 地圖與野怪模板。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?????????導(dǎo)航:從零開始手寫mmo游戲從框架到爆炸(零)—— 導(dǎo)航-CSDN博客?

? ? ? ? ?首先祝大家龍年大吉,大吉大利,財源滾滾,事事如意!

? ? ? ? ?角色有了,那么基本的功能應(yīng)該包括選擇地圖,打怪,掉落裝備,升級等等,我們一一來完成。首先我們設(shè)計野怪和地圖。

野怪模板

? ? ? ?和上一章一樣,我們首先創(chuàng)建野怪的模板-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;
    }
}

? ? ? ?我們看到野怪有了品質(zhì)的劃分,野怪根據(jù)品質(zhì)可以分為普通-進階-史詩-傳奇-神話。這點在后面創(chuàng)建野怪的時候可以看到效果。

? ? ? 創(chuàng)建怪物模板json,有些參數(shù)是后面慢慢需要用到的,大家主要關(guān)注的就是基本屬性和升級屬性。

[
  {
    "id":101,
    "name":"地精戰(zhàn)士",
    "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
  }
]

? ? ? 創(chuàng)建怪物工廠-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方法可以看到已經(jīng)載入了怪物模板

CharacterTemplate{角色 ='地精戰(zhàn)士', 說明='null', 力量=15, 護甲=10, 體力=15, 魔力=0, 技巧=0, 速度=10}
CharacterTemplate{角色 ='地精頭目', 說明='null', 力量=25, 護甲=20, 體力=25, 魔力=0, 技巧=0, 速度=15}
CharacterTemplate{角色 ='地精精英', 說明='null', 力量=45, 護甲=30, 體力=120, 魔力=10, 技巧=10, 速度=20}

地圖

? ? ? ? 地圖要包括野怪的id,等級以及每次和玩家打架的數(shù)量。同時我們?yōu)榱撕罄m(xù)擴展,還增加普通野怪和精英野怪的區(qū)分。地圖的模板代碼如下,大家可以自行查看-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 {
        // 出現(xiàn)的概率
        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 {
        // 出現(xiàn)的概率
        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;
    }
}

? ? ? ? 我們創(chuàng)建一個地圖的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文章來源地址http://www.zghlxwxcb.cn/news/detail-827596.html

到了這里,關(guān)于從零開始手寫mmo游戲從框架到爆炸(十三)— 地圖與野怪模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【手寫數(shù)據(jù)庫】從零開始手寫數(shù)據(jù)庫內(nèi)核,行列混合存儲模型,學(xué)習(xí)大綱成型了

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實現(xiàn)多機的數(shù)據(jù)庫節(jié)點的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點的情況下對故障容災(zāi)的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年02月04日
    瀏覽(34)
  • 【從零開始學(xué)習(xí)JAVA | 第三十三篇】File類

    【從零開始學(xué)習(xí)JAVA | 第三十三篇】File類

    目錄 前言: File類: 構(gòu)造方法: 常見成員方法: 總結(jié): ? ? ? ? 本文我們將為大家介紹JAVA中一個比較使用的類:File類,他為我們提供了存儲數(shù)據(jù)的功能,使得程序的數(shù)據(jù)不至于在運行結(jié)束之后就丟失,是一個很好的類。 ????????File類是Java標(biāo)準庫中用于操作文件和目錄

    2024年02月15日
    瀏覽(96)
  • 教你從零開始畫echarts地圖

    教你從零開始畫echarts地圖

    離線地圖下載地址https://datav.aliyun.com/tools/atlas/index.html echarts文檔地址https://echarts.apache.org/zh/option.html 基于VUE編寫,其他框架請自行轉(zhuǎn)換,大同小異 先讓地圖內(nèi)容出來,npm安裝步驟省略,請參考官方文檔,創(chuàng)建的div必須設(shè)置寬度和高度,關(guān)于圖表的寬高自適應(yīng),參考我的另一

    2023年04月17日
    瀏覽(319)
  • 【從零開始學(xué)習(xí)JAVA | 第二十三篇】集合體系結(jié)構(gòu)

    【從零開始學(xué)習(xí)JAVA | 第二十三篇】集合體系結(jié)構(gòu)

    目錄 前言: 單列集合:? ? ? set與list的區(qū)別: 雙列集合: map的特點: 總結(jié): ? ? ? ? ? ? ? ? ? JAVA中為我們提供了很多集合,這些集合都有自己很獨特的特點,因此我們要學(xué)習(xí)所有的集合,但是在學(xué)習(xí)所有的集合之前,我們還是先為大家介紹一下JAVA的集合體系結(jié)構(gòu),這

    2024年02月16日
    瀏覽(17)
  • 從零開始搭建搜索推薦系統(tǒng)(五十三)QUERY從分詞檢索進階

    從零開始搭建搜索推薦系統(tǒng)(五十三)QUERY從分詞檢索進階

    聊的不止技術(shù)。跟著小帥寫代碼,還原和技術(shù)大牛一對一真實對話,剖析真實項目筑成的一磚一瓦,了解最新最及時的資訊信息,還可以學(xué)到日常撩妹小技巧哦,讓我們開始探索主人公小帥的職場生涯吧! (PS:本系列文章以幽默風(fēng)趣風(fēng)格為主,較真?zhèn)b和杠精請繞道~) 一、

    2024年02月04日
    瀏覽(27)
  • 【從零開始學(xué)Skynet】實戰(zhàn)篇《球球大作戰(zhàn)》(十三):場景代碼設(shè)計(下)

    【從零開始學(xué)Skynet】實戰(zhàn)篇《球球大作戰(zhàn)》(十三):場景代碼設(shè)計(下)

    ????????《球球大作戰(zhàn)》是一款服務(wù)端運算的游戲,一般會使用主循環(huán)程序結(jié)構(gòu),讓服務(wù)端處理戰(zhàn)斗邏輯。如下圖所示,圖中的 balls 和 foods 代表服務(wù)端的狀態(tài),在循環(huán)中執(zhí)行 “ 食物生成 ”“ 位置更新 ” 和 “ 碰撞檢 測” 等功能,從而改變服務(wù)端的狀態(tài)。 scene 啟動后

    2023年04月18日
    瀏覽(24)
  • 【云原生 | 從零開始學(xué)Kubernetes】二十三、Kubernetes控制器Statefulset

    【云原生 | 從零開始學(xué)Kubernetes】二十三、Kubernetes控制器Statefulset

    該篇文章已經(jīng)被專欄《從零開始學(xué)k8s》收錄 上一篇文章:kubernetes持久化存儲下 點擊跳轉(zhuǎn) StatefulSet 是為了管理有狀態(tài)服務(wù)的問題而設(shè)計的 對于StatefulSet中的Pod,每個Pod掛載自己獨立的存儲,如果一個Pod出現(xiàn)故障,從其他節(jié)點啟動一個同樣名字的Pod,要掛載上原來Pod的存儲繼續(xù)

    2024年02月03日
    瀏覽(35)
  • 從零開始學(xué)python(十三)爬蟲工程師自動化和抓包

    從零開始學(xué)python(十三)爬蟲工程師自動化和抓包

    回顧之前講述了python語法編程 必修入門基礎(chǔ)和網(wǎng)絡(luò)編程,多線程/多進程/協(xié)程等方面的內(nèi)容,后續(xù)講到了數(shù)據(jù)庫編程篇MySQL,Redis,MongoDB篇,和機器學(xué)習(xí),全棧開發(fā),數(shù)據(jù)分析,爬蟲數(shù)據(jù)采集前面沒看的也不用往前翻,系列文已經(jīng)整理好了: 1.跟我一起從零開始學(xué)python(一)

    2024年02月14日
    瀏覽(29)
  • 從零開始學(xué)習(xí) Java:簡單易懂的入門指南之Map集合(二十三)

    1.1Map集合概述和特點 Map集合概述 Map集合的特點 雙列集合,一個鍵對應(yīng)一個值 鍵不可以重復(fù),值可以重復(fù) Map集合的基本使用 1.2Map集合的基本功能 方法介紹 方法名 說明 V put(K key,V value) 添加元素 V remove(Object key) 根據(jù)鍵刪除鍵值對元素 void clear() 移除所有的鍵值對元素 boolean con

    2024年02月09日
    瀏覽(36)
  • 從零開始學(xué)習(xí)調(diào)用百度地圖網(wǎng)頁API:二、初始化地圖,鼠標(biāo)交互創(chuàng)建信息窗口

    從零開始學(xué)習(xí)調(diào)用百度地圖網(wǎng)頁API:二、初始化地圖,鼠標(biāo)交互創(chuàng)建信息窗口

    注 :需要將 你的ak 替換,從百度地圖官網(wǎng)注冊申請。 腳本中使用BMap創(chuàng)建Map實例,centerAndZoom()初始化地圖設(shè)置中心點為北京,地圖等級15。enableScrollWheelZoom()鼠標(biāo)滾輪可縮放窗口。addEventListener監(jiān)聽鼠標(biāo)點擊事件,發(fā)生后,傳遞事件e至function(e),執(zhí)行openInfoWindow,在鼠標(biāo)點擊坐

    2024年02月07日
    瀏覽(98)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包