从零开始手写mmo游戏从框架到爆炸(十二)— 角色设定

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

        写了这么多的框架,说好的mmo游戏呢?所以我们暂时按下框架不表,这几篇我们设计英雄角色、怪物、技能和地图。本篇我们来对游戏角色进行设定。

       用户在注册成功之后,可以登录,登录好像还没有说,这个不重要,就需要选择存档或者新开游戏,就好像暗黑2一样。存档!好的这个也不重要。我们先说选英雄,英雄就有职业,职业就有技能,英雄升级之后属性要提升。野怪也是一样的,有技能有等级,而且还要区分品质,不如白银怪,黄金怪等等。

       英雄或者说职业,野怪等等需要有模板,数据来源一种是存在数据库里面的,一种是存在文件中的。我更倾向于存在文件中,为什么呢,因为我开心。现在我们正式开始职业的设定。

首先我们先创建游戏引擎模块:

定义角色模板

         角色模板是英雄和野怪通用的

CharacterTemplate.java

package com.loveprogrammer.factory.template;import java.io.Serializable;/*** @version 1.0.0* @description: 角色模版* @author: eric* @date: 2024-02-7 13:54**/
public class CharacterTemplate implements Serializable {private int id;private String name;private String desc;private int strength;                  // 力量 影响物理输出 物理技能输出private int armature;                 // 护甲值 影响物理防御和法术防御private int constitution;               // 体质 影响生命值 一点体质增加10点生命值private int magic;                       // 魔力 影响法术输出 法术技能输出private int technique;                   // 技巧 影响闪避率、暴击率private int speed;                         // 攻击速度private int levelUpStrength;                   // 每升一级力量增加值private int levelUpArmature;                 // 每升一级护甲增加值private int levelUpConstitution;         // 每升一级生命力增加值private int levelUpMagic;                   // 每升一级魔法增加值private int levelUpTechnique;         // 每升一级技巧增加值private int levelUpSpeed;              // 每升一级速度增加值private int highestLevel;            // 转职前的最高级别private String skills;         // 技能id字符串,逗号隔开// 技能品级private String skillQuality;      // 技能品级private String acquiredLevel;     // 技能习得的等级private String extSkills;private int attackType;     // 是物理攻击还是魔法攻击private String states;     // 附带状态,比如眩晕免疫,毒免疫等// 毒抗private int poisonResistance;// 火抗private int flameResistance;// 电抗private int thunderResistance;// 冰抗private int iceResistance;// 经验private double exp = 1.0;// 武器类型private int weaponType;// 可转职的职业private String nextLevelJobList;// 战斗位置,数字越小越靠近前排private int position;@Overridepublic String toString() {return "HeroTemplate{" +"角色 ='" + name + '\'' +", 说明='" + desc + '\'' +", 力量=" + strength +", 护甲=" + armature +", 体力=" + constitution +", 魔力=" + magic +", 技巧=" + technique +", 速度=" + speed +'}';}public int getId() {return id;}public void setId(int 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 int getStrength() {return strength;}public void setStrength(int strength) {this.strength = strength;}public int getArmature() {return armature;}public void setArmature(int armature) {this.armature = armature;}public int getConstitution() {return constitution;}public void setConstitution(int constitution) {this.constitution = constitution;}public int getMagic() {return magic;}public void setMagic(int magic) {this.magic = magic;}public int getTechnique() {return technique;}public void setTechnique(int technique) {this.technique = technique;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getLevelUpStrength() {return levelUpStrength;}public void setLevelUpStrength(int levelUpStrength) {this.levelUpStrength = levelUpStrength;}public int getLevelUpArmature() {return levelUpArmature;}public void setLevelUpArmature(int levelUpArmature) {this.levelUpArmature = levelUpArmature;}public int getLevelUpConstitution() {return levelUpConstitution;}public void setLevelUpConstitution(int levelUpConstitution) {this.levelUpConstitution = levelUpConstitution;}public int getLevelUpMagic() {return levelUpMagic;}public void setLevelUpMagic(int levelUpMagic) {this.levelUpMagic = levelUpMagic;}public int getLevelUpTechnique() {return levelUpTechnique;}public void setLevelUpTechnique(int levelUpTechnique) {this.levelUpTechnique = levelUpTechnique;}public int getLevelUpSpeed() {return levelUpSpeed;}public void setLevelUpSpeed(int levelUpSpeed) {this.levelUpSpeed = levelUpSpeed;}public String getSkills() {if(skills == null){skills = "";}return skills;}public void setSkills(String skills) {this.skills = skills;}public String getExtSkills() {return extSkills;}public void setExtSkills(String extSkills) {this.extSkills = extSkills;}public int getAttackType() {return attackType;}public void setAttackType(int attackType) {this.attackType = attackType;}public String getStates() {if(states == null){states = "";}return states;}public void setStates(String states) {this.states = states;}public int getPoisonResistance() {return poisonResistance;}public void setPoisonResistance(int poisonResistance) {this.poisonResistance = poisonResistance;}public int getFlameResistance() {return flameResistance;}public void setFlameResistance(int flameResistance) {this.flameResistance = flameResistance;}public int getThunderResistance() {return thunderResistance;}public void setThunderResistance(int thunderResistance) {this.thunderResistance = thunderResistance;}public double getExp() {return exp;}public void setExp(double exp) {this.exp = exp;}public int getIceResistance() {return iceResistance;}public void setIceResistance(int iceResistance) {this.iceResistance = iceResistance;}public int getWeaponType() {return weaponType;}public void setWeaponType(int weaponType) {this.weaponType = weaponType;}public String getAcquiredLevel() {return acquiredLevel;}public void setAcquiredLevel(String acquiredLevel) {this.acquiredLevel = acquiredLevel;}public String getSkillQuality() {return skillQuality;}public void setSkillQuality(String skillQuality) {this.skillQuality = skillQuality;}public int getHighestLevel() {return highestLevel;}public void setHighestLevel(int highestLevel) {this.highestLevel = highestLevel;}public String getNextLevelJobList() {return nextLevelJobList;}public void setNextLevelJobList(String nextLevelJobList) {this.nextLevelJobList = nextLevelJobList;}public int getPosition() {return position;}public void setPosition(int position) {this.position = position;}
}

  职业模板集成通用模板。JobTemplate中的newSkills是后期做转职的时候用的,先忽略。

JobTemplate.java

package com.loveprogrammer.factory.template;/*** @ClassName JobTemplate* @Description 职业模板* @Author admin* @Date 2024-02-7 13:54* @Version 1.0*/
public class JobTemplate extends CharacterTemplate{private String newSkills;public String getNewSkills() {return newSkills;}public void setNewSkills(String newSkills) {this.newSkills = newSkills;}
}

创建模板文件

job.json

[{"id":1,"name":"战士","strength":60,"magic":0,"constitution":80,"technique":15,"speed":130,"armature":5,"levelUpStrength":45,"levelUpMagic":0,"levelUpConstitution":35,"levelUpTechnique":25,"levelUpSpeed":25,"levelUpArmature":15,"attackType":0,"weaponType":1,"totalA":230,"totalB":152.5,"skills":"1,11,19,32","newSkills":"1,11,19,32","skillQuality":"E,E,E,E","acquiredLevel":"0,5,10,15","extSkills":0,"nextLevelJobList":100101,"position":1,"desc":"剑类武器","highestLevel":15,"init":0}
]

 创建职业工厂

JobFactory

package com.loveprogrammer.factory;import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.loveprogrammer.factory.template.JobTemplate;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @ClassName JobFactory* @Description 英雄职业工厂* @Author admin* @Date 2024/2/7 15:49* @Version 1.0*/
public class JobFactory {private static List<JobTemplate> templates;private static Map<Integer,JobTemplate> jobMap;static {try {// 读取配置文件,然后加载到weaponTemplates中ClassLoader classLoader = JobFactory.class.getClassLoader();InputStream inputStream = classLoader.getResourceAsStream("template/job.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);templates = JSONArray.parseArray(responseStrBuilder.toString(),JobTemplate.class);jobMap = templates.stream().collect(Collectors.toMap(JobTemplate::getId, e ->e));} catch (IOException e) {e.printStackTrace();}}public static List<JobTemplate> getTemplates(){return templates;}public static void main(String[] args) {System.out.println("加载的职业有:" + JSON.toJSONString(templates));}}

运行一下工厂的main方法:

加载的职业有:[{"acquiredLevel":"0,5,10,15","armature":5,"attackType":0,"constitution":80,"desc":"剑类武器","exp":1.0,"extSkills":"0","flameResistance":0,"highestLevel":15,"iceResistance":0,"id":1,"levelUpArmature":15,"levelUpConstitution":35,"levelUpMagic":0,"levelUpSpeed":25,"levelUpStrength":45,"levelUpTechnique":25,"magic":0,"name":"战士","newSkills":"1,11,19,32","nextLevelJobList":"100101","poisonResistance":0,"position":1,"skillQuality":"E,E,E,E","skills":"1,11,19,32","speed":130,"states":"","strength":60,"technique":15,"thunderResistance":0,"weaponType":1}]

这样我们就有了职业的模板了。 

全部源码详见:

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

分支:step-08

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/687391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】段错误

1. 问题 8核工程&#xff0c;核4在运行了20分钟以上&#xff0c;发生了段错误。 [C66xx_4] A00x53 A10x53 A20x4 A30x167e A40x1600 A50x850e2e A60x845097 A70xbad9f5e0 A80x0 A90x33 A100x53535353 A110x0 A120x0 A130x0 A140x0 A150x0 A160x36312e35 A170x20 A180x844df0 …

没有PFMEA分析的检测过程会有什么风险?

随着科技的快速发展&#xff0c;产品复杂度不断提升&#xff0c;检测过程的重要性日益凸显。然而&#xff0c;在这个过程中&#xff0c;如果没有进行PFMEA分析&#xff0c;将会带来怎样的风险呢&#xff1f;本文将对此进行深入探讨。 众所周知&#xff0c;检测是确保产品质量的…

openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优

文章目录 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优222.1 前提条件222.2 内存相关参数设置222.3 网络相关参数设置222.4 I/O相关参数设置 openGauss学习笔记-222 openGauss性能调优-系统调优-操作系统参数调优 在性能调优过程中&#xff0c;可以根据…

数据库第六次实验

目录 1 实体完整性 1.1 单属性 1.2 多属性 2 参照完整性 2.1 单属性 2.2 多属性 3 用户自定义完整性 3.1 属性上的约束 3.2 元组上的约束 1 实体完整性 1.1 单属性 ①定义 use 实体完整性_单属性; create table Student_s_d( Sno char(9) primary key, Sna…

事务管理 及 AOP

一、事务管理 1.1 事务回顾 1.2 Spring事务管理 1.3 事务进阶 1.3.1 rollbackfor 1.3.2 propagation 控制台日志过滤插件&#xff1a; 查看事务管理日志是JdbcTrsactionManager类&#xff1a; 在控制台找到JdbcTrsactionManager——右击——add highlight——红色——所有事…

超声波清洗机洗眼镜好吗?超声波清洗机哪个品牌更值得推荐一些

随着科技的进步&#xff0c;很多朋友因为长时间沉迷于看电子产品&#xff0c;所以早早的就佩戴上眼镜了&#xff0c;从而离不开眼镜。眼镜长时间佩戴会导致上面积累着非常多的灰尘&#xff0c;堆积在镜片上就会导致视线变得模糊不清了&#xff0c;影响视线。然而很多人也很少去…

龙年新目标!龙蜥安全联盟第三次月会圆满结束

2024 年 2 月 1 日&#xff0c;龙蜥社区安全联盟&#xff08;OASA&#xff0c;以下简称“联盟”&#xff09;月度会议召开&#xff0c;线上线下共计 33 位代表参会&#xff0c;由秘书处成员齐增田主持本次会议。本次会议主要内容包括 2023 联盟回顾、2024 年的目标和规划、联盟…

【深度优先搜索】【图论】【树】2646. 最小化旅行的价格总和

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 涉及知识点 深度优先搜索 图论 树 LeetCode2646. 最小化旅行的价格总和 现有一棵无向、无根的树&#xff0c;树中有 n 个节点&#xff0c;按从 0 到 n - 1 编号。给你一个整数 n 和一个长…

2024.2.17 模拟实现 RabbitMQ —— 内存数据管理

目录 需求分析 内存管理 实现 MemoryDataCenter 类 封装交换机操作 封装队列操作 封装绑定操作 封装消息操作 封装未确认消息操作 封装恢复数据操作 关于线程安全 针对 MemoryDataCenter 单元测试 需求分析 当前我们已经实现了 数据库管理 交换机、绑定、队列&#…

使用Python生成二维码的完整指南

无边落木萧萧下&#xff0c;不如跟着可莉一起游~ 可莉将这篇博客收录在了&#xff1a;《Python》 可莉推荐的优质博主首页&#xff1a;Kevin ’ s blog 本文将介绍如何使用Python中的qrcode库来生成二维码。通过简单的代码示例和详细解释&#xff0c;读者将学习如何在Python中轻…

突发!测试OpenAI新产品——sora

哈喽大家好&#xff0c;我是chowley&#xff0c;最近sora真是垄断了科技区的话题榜&#xff0c;几乎每个技术博主都上来讲两句 我在半年前也是一名深度学习的研究者&#xff0c;今天我以测试开发工程师的视角来解读一下sora&#xff01; 首先打开OpenAI官网的sora页面&#x…

春节专题|产业7问:区块链厂商的现在和未来——混合技术厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…

解决vitepress首次加载慢(从40秒到1秒的倔强)

前言&#xff1a;在艰难的博客系统升级之路 这篇博客中我有提到vitepress首次加载非常耗时的问题&#xff0c;之前也在网上搜索时发现也有很多人说这个“问题”&#xff0c;但是在折腾了这么一段时间后&#xff0c;发现这也许本身不是vitepress的问题&#xff0c;而是我的启动方…

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识&#xff0c;由系统自动分配&#xff0c;不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…

百度地图接口 | 实现校验收货地址是否超出配送范围

目录 1. 环境准备 2. 代码开发 2.1 application.yml 2.2 OrderServiceImpl &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Py…

数据结构-双指针法

介绍 双指针法是一种可以在O&#xff08;n&#xff09;时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表&#xff0c;从而实现特定操作。 常见的双指针法有 1.快慢指针&#xff1a;快指针每次移动两步&…

AI:131- 法律文件图像中的隐含信息挖掘与敲诈勒索检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天&#xff0c;这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址&#xff1a;www.drhchina.com 防泄密系统的主要功能通常包括&#xff1a; 文…

二进制和进制转换

前言 我们经常能听到2进制、8进制、10进制、16进制这样的讲法&#xff0c;那是什么意思呢&#xff1f;其实2进制、8进 制、10进制、16进制是数值的不同表示形式而已。 比如&#xff1a;数值15的各种进制的表示形式&#xff1a; 15的2进制&#xff1a;111115的8进制&#xff1…

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…