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

2024-02-20 04:20

本文主要是介绍从零开始手写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

这篇关于从零开始手写mmo游戏从框架到爆炸(十二)— 角色设定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727023

相关文章

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应