文档章节

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

Genesis-3D
 Genesis-3D
发布于 2014/01/14 13:59
字数 1493
阅读 130
收藏 1

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

 


© 著作权归作者所有

Genesis-3D
粉丝 12
博文 34
码字总数 33360
作品 0
佛山
私信 提问
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程04:技能的输入与检测》

4.技能的输入与检测 概述: 技能系统的用户体验,制约着玩家对整个游戏的体验。游戏角色的技能华丽度,连招的顺利过渡,以及逼真的打击感,都作为一款游戏的卖点吸引着玩家的注意。开发者在开...

Genesis-3D
2014/01/14
308
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程07:UI》

概述: UI即User Interface(用户界面)的简称。UI设计是指对软件的燃机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅可以让游戏变得更有品位,更吸引玩家,还能充分体现开发者对游戏...

Genesis-3D
2014/01/14
1K
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程03:碰撞检测》

3.碰撞检测 碰撞检测的概述: 碰撞在物理学中表现为两粒子或物体间极端的相互作用。而在游戏世界中,游戏对象在游戏世界自身并不受物理左右,为了模拟真实世界的效果,需要开发者为其添加属性...

Genesis-3D
2014/01/14
235
0
《Genesis-3D开源游戏引擎完整实例教程-跑酷游戏篇:简介及目录》(附上完整工程文件)

跑酷游戏制作 游戏类型: 此游戏Demo,为跑酷类游戏。 框架简介: 游戏通常由程序代码和资源组成。如果说模型、贴图、声音之类的可以给游戏环境提供一个物理描述和设置,那么脚本和代码块会给...

Genesis-3D
2014/01/15
331
0
《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》完结

8.虚拟键盘实现 概述: 硬键盘就是物理键盘,平时敲的那种。软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上。虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可操控按...

Genesis-3D
2014/01/14
365
0

没有更多内容

加载失败,请刷新页面

加载更多

插入排序算法

《Java算法总纲目录》 1、定义     元素被分为有序区和无序区两部分。最初有序区只有一个元素。每次从无序区中选择一个元素,插入到有序区的位置,直到无序区变空。 2、代码 public c...

木九天
26分钟前
3
0
ApacheCN 翻译/校对/笔记整理活动进度公告 2019.10.18

注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领。 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群。翻译/校对五个文档的贡献者,可以申请实习证明。 请私聊片刻(52981...

ApacheCN_飞龙
28分钟前
4
0
Hands-on! 如何给 TiDB 添加新系统表

作者:黄东旭 “TiDB,你已经是一个成熟的数据库了,该学会用自己的 SQL 查自己的状态了。” 对于一个成熟的数据库来说,通过 SQL 来查询系统本身的状态再正常不过,对于 MySQL 来说 INFOMA...

TiDB
34分钟前
4
0
SpringBoot admin+Eureka+钉钉通知

SpringBoot admin+Eureka+钉钉通知 一、效果 登录账号+密码 监控服务 查看实时日志 钉钉通知 二、什么是Spring Boot Admin ? Spring Boot Admin是一个开源社区项目,用于管理和监控SpringB...

小白的成长
37分钟前
18
0
docker-rabbitmq

docker pull rabbitmqmkdir -p /rabbitmqdocker run -d \--name rabbitmq \--hostname rabbitmq \-v /rabbitmq:/var/lib/rabbitmq \-e RABBITMQ_DEFAULT_USER=root \-e RA......

李琼涛
39分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部