《Genesis-3D开源游戏引擎--横版格斗游戏制作教程05:技能读表》

5.技能读表

技能读表概述:

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

读表原理:

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

《Genesis-3D开源游戏引擎--横版格斗游戏制作教程05:技能读表》
图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[] { '\t' });

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[] { '\t' });

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

 

你可能感兴趣的:(游戏引擎)