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开源游戏引擎:游戏起源,皆因有我!!!