《Genesis-3D開源遊戲引擎--橫版格鬥遊戲製做教程05:技能讀表》

5.技能讀表

技能讀表概述:

技能讀表,做爲實現技能系統更爲快捷的一種方式,被普遍應用到遊戲開發中。技能配表,做爲橋樑鏈接着遊戲策劃者和開發者在技能實現上的關係。在遊戲技能開發中,開發者只須要根據策劃人員提供的技能配表,在程序上實現對配置文件的讀取功能。策劃人員在遊戲開發後期,若是在技能策劃上作了修改,能夠經過對技能配表的修改來實現對技能系統的修改。在這一過程當中,繞過了開發者,便於策劃對遊戲後期開發的掌控,減輕了程序員的工做量。能夠說技能讀表不只對技能、技能連招作出了貢獻,也減輕了整個開發團隊的工做量。 程序員

讀表原理:

策劃提供技能配表,開發人員需根據技能配表實現程序對配置文件的讀取工做,玩家下達相應命令時,遊戲角色執行相應技能,流程圖如5-1所示。 c#


圖5-1 數據結構

實現方法:

步驟1: 動畫

策劃人員製做技能配表,至少包括技能配置表格和連招技能配置表格兩張表,表格格式一般採用INI、TXT、CSV等,這裏推薦開發者使用CSV,方便操做看着清晰。配置好的表格如Skill.csv和ContinualSkill.csv文件所示。 網站

步驟2: spa

開發人員根據提供的技能配置文件,程序上實現對配置文件的讀取功能。具體實現方式以下所示。 3d

2.1:定義讀取技能表後,記錄技能表後,存放信息位置。 code

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對外接口,當玩家發送相應指令時,用技能標示符做爲索引,讀取相應私有類內容,獲取技能。

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開源遊戲引擎:遊戲起源,皆因有我!!!

相關文章
相關標籤/搜索