zoukankan      html  css  js  c++  java
  • 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程05:技能读表》

    5.技能读表

    技能读表概述:

    技能读表,作为实现技能系统更为快捷的一种方式,被广泛应用到游戏开发中。技能配表,作为桥梁连接着游戏策划者和开发者在技能实现上的关系。在游戏技能开发中,开发者只需要根据策划人员提供的技能配表,在程序上实现对配置文件的读取功能。策划人员在游戏开发后期,如果在技能策划上做了修改,可以通过对技能配表的修改来实现对技能系统的修改。在这一过程中,绕过了开发者,便于策划对游戏后期开发的掌控,减轻了程序员的工作量。可以说技能读表不仅对技能、技能连招做出了贡献,也减轻了整个开发团队的工作量。

    读表原理:

    策划提供技能配表,开发人员需根据技能配表实现程序对配置文件的读取工作,玩家下达相应命令时,游戏角色执行相应技能,流程图如5-1所示。


    图5-1

    实现方法:

    步骤1:

    策划人员制作技能配表,至少包括技能配置表格和连招技能配置表格两张表,表格格式通常采用INI、TXT、CSV等,这里推荐开发者使用CSV,方便操作看着清晰。配置好的表格如Skill.csv和ContinualSkill.csv文件所示。

    步骤2:

    开发人员根据提供的技能配置文件,程序上实现对配置文件的读取功能。具体实现方式如下所示。

    2.1:定义读取技能表后,记录技能表后,存放信息位置。

    1)在类SkillData中,用数据结构用来记录表的信息,参考技能配置表Skill。

    01
    private UInt32 m_iSkillID;           //技能标示符
    02
    private Code m_eSkillKeyboard;     //技能按键
    03
    private string m_sSkillAnimation;    //技能动画
    04
    private Int32 m_iSkillDamageHp;    //技能伤害值
    05
    private string m_sSkillEffect;        //技能特效
    06
    private UInt32 m_iBeginKeyFrame;   //从哪一帧开始接收玩家按键
    07
    private UInt32 m_iEndKeyFrame;     //截止哪一帧停止接收玩家按键
    08
    private UInt32 m_iBeginHurtFrame;   //从哪一帧开始有效碰撞伤害
    09
    private UInt32 m_iEndHurtFrame;    //截止哪一帧停止有效碰撞伤害
    10
    private UInt32 m_iEndID;           //收招标示符
    11
    private string m_sEndAnimation;     //收招动画
    2) 在ContinualSkillData类中,连招数据以组合方式记录信息。招数据结构,作为一个容器,存放技能表中的读入的相应数据。
    1
    private UInt32 m_iContinualSkillID;             //连续技能标示符
    2
    private Dictionary < UInt32, SkillData > m_vSkillData; //连招包含的技能< 招数索引,该招技能>
    3) 在ContinualSkillConfig类中,连招技能记录的一个数据。
    1
    private Dictionary < UInt32, ContinualSkillData> m_vContinualSkills;//连招技能容器<连招技能标示符,连招技能数据>
    2.2技能信息的读取过程
    1)加载技能配置数据
    01
    private void LoadSkillConfig()
    02
    {
    03
     StreamReader streamRead=new StreamReader(GenerateSkillFilePath(), System.Text.Encoding.Default);
    04
     string sLine = streamRead.ReadLine();
    05
     string[] aryLine;
    06
     while (null != (sLine = streamRead.ReadLine()))
    07
     {
    08
      aryLine = sLine.Split(new char[] { '	' });
    09
      if (COLUMN_PER_SKILL > aryLine.Length) continue;
    10
     
    11
      UInt32 iSkillID = UInt32.Parse(aryLine[0]);
    12
      Code eSkillKeyboard = (Code)int.Parse(aryLine[1]);
    13
      string sSkillAnimation = aryLine[2];
    14
      Int32 iSkillDamageHp = Int32.Parse(aryLine[3]);
    15
      string sSkillEffect = aryLine[4];
    16
      UInt32 iBeginKeyFrame = UInt32.Parse(aryLine[5]);
    17
      UInt32 iEndKeyFrame = UInt32.Parse(aryLine[6]);
    18
      UInt32 iBeginHurtFrame = UInt32.Parse(aryLine[7]);
    19
      UInt32 iEndHurtFrame = UInt32.Parse(aryLine[8]);
    20
      UInt32 iEndID = UInt32.Parse(aryLine[9]);
    21
      string sEndAnimation = aryLine[10];
    22
     
    23
      if (iBeginKeyFrame >= iEndKeyFrame || iBeginHurtFrame >= iEndHurtFrame)
    24
      {
    25
       throw (new ArgumentException("ContinualSkillConfig.LoadSkillConfig"));
    26
      }
    27
     
    28
      SkillData skillData = new SkillData(iSkillID, eSkillKeyboard, sSkillAnimation, iSkillDamageHp, sSkillEffect, iBeginKeyFrame, iEndKeyFrame, iBeginHurtFrame, iEndHurtFrame, iEndID, sEndAnimation);
    29
      m_vSkills.Add(iSkillID, skillData);
    30
     }
    31
     streamRead.Close();
    32
    }
    2)加载连续技能配置数据
    01
    private void LoadContinualSkillConfig()
    02
    {
    03
     StreamReader streamRead = new StreamReader(GenerateContinualSkillFilePath(), System.Text.Encoding.Default);
    04
     string sLine = streamRead.ReadLine();
    05
     string[] aryLine;
    06
     while (null != (sLine = streamRead.ReadLine()))
    07
     {
    08
      aryLine = sLine.Split(new char[] { '	' });
    09
      int iColumnNum = aryLine.Length;
    10
      if (1 >= iColumnNum) continue;
    11
     
    12
      UInt32 iContinualSkillID = UInt32.Parse(aryLine[0]);
    13
      ContinualSkillData continualSkill = GetContinualSkillData(iContinualSkillID);
    14
     
    15
      for (int ii = 1; ii < iColumnNum; ++ii)
    16
      {
    17
       UInt32 iSkillID = UInt32.Parse(aryLine[ii]);
    18
       SkillData skillData = GetSkillData(iSkillID);
    19
       if (null == skillData)
    20
       {
    21
          throw (new ArgumentException("ContinualSkillConfig.LoadContinualSkillConfig"));
    22
       }
    23
       continualSkill.AddSkillData(skillData);
    24
      }
    25
     }
    26
     streamRead.Close();
    27
    }
    3)获取相对路径方式:
    01
    //生成技能配置文件的路径
    02
    private string GenerateSkillFilePath()
    03
    {
    04
     string sAssetPath = ScriptRuntime.Application.GetAssetPath();
    05
     string sPath = sAssetPath + SKILL_RELATIVE_PATH;
    06
     return sPath;
    07
    }
    08
     
    09
    //生成连招配置文件的路径
    10
    private string GenerateContinualSkillFilePath()
    11
    {
    12
     string sAssetPath = ScriptRuntime.Application.GetAssetPath();
    13
     string sPath = sAssetPath + CONTINUALSKILL_RELATIVE_PATH;
    14
     return sPath;
    15
    }
    2.3对外接口,当玩家发送相应指令时,用技能标示符作为索引,读取相应私有类内容,获取技能。
    view sourceprint?
    01
    //根据技能标示符获取该招技能   
    02
    public SkillData GetSkillData(UInt32 iSkillID)
    03
    {
    04
     if (m_vSkills.ContainsKey(iSkillID))
    05
     {
    06
      return m_vSkills[iSkillID];
    07
     }
    08
      else
    09
     {
    10
      return null;
    11
     }
    12
    }
    13
    //根据连招标示符获取连招,若为空则创建连招对外
    14
    public ContinualSkillData GetContinualSkillData(UInt32 iContinualSkillID)
    15
    {
    16
     if (m_vContinualSkills.ContainsKey(iContinualSkillID))
    17
     {
    18
      return m_vContinualSkills[iContinualSkillID];
    19
     }
    20
     else
    21
     {
    22
      ContinualSkillData continualSkill = new ContinualSkillData(iContinualSkillID);
    23
      m_vContinualSkills.Add(iContinualSkillID, continualSkill);
    24
      return continualSkill;
    25
     }
    26
    }

    引擎官方网站:http://www.genesis-3d.com.cn/

    官方论坛:http://bbs.9tech.cn/genesis-3d/

    官方千人大群:59113309   135439306

    YY频道-游戏开发大讲堂(完全免费,定期开课):51735288 

    Genesis-3D开源游戏引擎:游戏起源,皆因有我!!!

     
  • 相关阅读:
    left join
    order by 对null的处理
    checkbox不显示,试试去掉-webkit-appearance这个样式
    浅谈ES6的let和const的异同点
    ES6中箭头函数的作用
    HTML页面每次打开的时候都清除页面缓存
    解决HTML加载时,外部js文件引用较多,影响页面打开速度问题
    JQuery和Zepto的差异(部分)
    vue-router 快速入门
    vue-resource插件使用
  • 原文地址:https://www.cnblogs.com/G-3D/p/3500794.html
Copyright © 2011-2022 走看看