?????????導(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文章來源:http://www.zghlxwxcb.cn/news/detail-827596.html
分支:step-08文章來源地址http://www.zghlxwxcb.cn/news/detail-827596.html
到了這里,關(guān)于從零開始手寫mmo游戲從框架到爆炸(十三)— 地圖與野怪模板的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!