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

news2024/10/7 14:22:39

 导航:从零开始手写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;

    @Override
    public 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.coloradmin.cn/o/1456238.html

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

相关文章

解决Webstorm2023使用账号连接GitLab的问题personal access token instead of a password

问题 升级Webstorm之后&#xff0c;发现gitlab仓库拉取代码报错 报错信息 remote: HTTP Basic: Access denied. The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See https…

Docker Desktop 链接windos 安装的redis和mysql

1.1.先在容器安装项目 2.链接redis和mysql配置 redis和mysql是在windos安装的&#xff0c;使用的是小p管理器安装的 项目链接 DB_DRIVERmysql DB_HOSThost.docker.internal DB_PORT3306 DB_DATABASEyunxc_test DB_USERNAMEyunxc_test DB_PASSWORDtest123456... DB_CHARSETutf…

java.sql.SQLException: No operations allowed after statement closed.

背景 某天下午&#xff0c;客服反馈线上服务出现问题&#xff0c;不能分配了。于是我登录到系统上&#xff0c;进行同样的操作发现也不行。当然同时我已经登录到服务器打开了日志&#xff0c;发现报错了&#xff0c;下面就是日志的错误信息&#xff1a; java.sql.SQLExceptio…

【开源】JAVA+Vue.js实现农村物流配送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

Java入门基础语法

文章目录 3.1 字面量3.2 数据类型3.3 变量3.4 变量的案例3.4.1 手机信息描述3.4.2 疫情防控信息采集表 3.5 变量的注意事项3.6 关键字3.7 标识符 来学习 Java 基础语法部分的知识&#xff0c;这些内容是我们后面编写程序的基本功&#xff0c;所以呢&#xff0c;得好好学习&…

C/C++数据结构——剖析排序算法

1. 排序的概念及其运用 1.1 排序的概念 https://en.wikipedia.org/wiki/Insertion_sorthttps://en.wikipedia.org/wiki/Insertion_sort 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…

MySQL篇之主从同步原理

一、原理 MySQL主从复制的核心就是二进制日志。 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操纵语言&#xff09;语句&#xff0c;但不包括数据查询&#xff08;SELECT、SHOW&#xff09;语句。…

【开源】SpringBoot框架开发教学过程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2.3.1 教师功能如下2.3.2 学生功能如下 三、系统展示 四、核心代码4.1 查询签到4.2 签到4.3 查询任务4.4 查询课程4.5 生成课程成绩 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVu…

DS:八大排序之归并排序、计数排序

创作不易&#xff0c;感谢三连支持&#xff01;&#xff01; 一、归并排序 1.1 思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子…

序列发生器

一开始想直接FSM&#xff0c;划分出6状态依次输出对应的。但其实只要6比特的移位寄存器&#xff0c;每次输出高位。复位后的默认值时6’b001_011。这样就可以实现循环&#xff0c;这种移位寄存器也叫barrel_shifter。循环移位。也可以使用循环计数器&#xff0c;然后case计数器…

机试指南:3-4章

文章目录 第3章 排序与查找(一) 排序1.sort函数&#xff1a;sort(first,last,comp)2.自定义比较规则3.C函数重载&#xff1a;同一个函数名&#xff0c;有不同的参数列表4.机试考试最重要的事情&#xff1a;能把你曾经做过的题目&#xff0c;满分地做出来5.例题例题1&#xff1a…

找座位 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。 现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位…

全国工商企业名录

全国2023年12月份企业名录2.5亿条

成功交易者需要历经多少磨难才能成就辉煌?

前言 王国维在《人间词话》中说&#xff1a;古今之成大事业、大学问者&#xff0c;必经过三种之境界&#xff1a;“昨夜西风凋碧树&#xff0c;独上高楼&#xff0c;望尽天涯路。” 此第一境也。“ 衣带渐宽终不悔&#xff0c;为伊消得人憔悴。” 此第二境也。“众里寻他千百度…

2023年【四川省安全员B证】最新解析及四川省安全员B证新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年四川省安全员B证最新解析为正在备考四川省安全员B证操作证的学员准备的理论考试专题&#xff0c;每个月更新的四川省安全员B证新版试题祝您顺利通过四川省安全员B证考试。 1、【多选题】《建筑施工安全检查标准…

振弦采集仪在地铁隧道振动监测中的应用研究

振弦采集仪在地铁隧道振动监测中的应用研究 河北稳控科技振弦采集仪是一种用于测量振动信号的设备&#xff0c;广泛应用于结构和地铁隧道等工程监测中。在地铁隧道振动监测中&#xff0c;振弦采集仪可以提供以下方面的应用研究&#xff1a; 1. 地铁隧道振动监测&#xff1a;振…

测试演示文档1770532693631507859

测试录入文档 这是一个标题 正文正文 段落1段落2 随机数YY 第二张图 XXXY ct-1708314487159)] XXXY

第十三章[管理]:13.2:venv虚拟环境

一,虚拟环境 1,虚拟环境是什么? venv是Python的一个标准库,用于创建和管理虚拟环境。 虚拟环境是Python的一个隔离空间,在这个空间中, 你可以安装和管理Python包,而不会影响到系统中的其他Python环境。 2,虚拟环境的特点: 隔离性:每个虚拟环境都有自己的Python解释器…

在script标签写export为什么会抛错|type module import ES5 ES6 预处理 指令序言 JavaScript JS

今天我们进入到语法部分的学习。在讲解具体的语法结构之前&#xff0c;这一堂课我首先要给你介绍一下 JavaScript 语法的一些基本规则。 脚本和模块 首先&#xff0c;JavaScript 有两种源文件&#xff0c;一种叫做脚本&#xff0c;一种叫做模块。这个区分是在 ES6 引入了模块…

Windows制作Windows的U盘启动盘

概要&#xff1a; 本篇演示在Windows10系统中制作Windows10的U盘启动盘 一、下载Windows10的iso文件 自行去微软官方网站下载Windows10的iso文件 二、下载Ultraiso 在浏览器输入https://www.ultraiso.com进入ultraiso官网 点击FREE TRIAL下载免费试用版 下载好的文件&a…