一些数据是需要不断改动的,程序不可能因为这些改动而不厌其烦的去改动代码,早期的这种做法就成了程序员们最悲哀的痛苦。自从有了数据管理后,程序的世界逐渐清晰,这些烦恼也不再出现,不过若是要很好的管理数据可是一门需要不断摸索的学问。天龙八部/武侠世界中管理配置数据小到ini,大到mysql数据库,各种各样的数据都需要采用专有的模块与方法去实现。而在配置中,策划会比较喜欢由excel来配置一些游戏中的参数,所以才有了我们今天所说的文件数据模块,即一张txt。其实这种用法现在有不少游戏也正在使用,举个例子那便是金山西山居制作的大部分游戏。

CODE

模块db下模块structs文件character.h -- 有关角色的配置表结构,由于表比较多,在这里只举这个例子

/**
* PAP Engine ( -- )
* $Id character.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-22 19:26:00
* @uses vengine database character struct module
* cn: 角色相关数据定义
*/
#ifndef VENGINE_DB_STRUCT_CHARACTER_H_
#define VENGINE_DB_STRUCT_CHARACTER_H_ namespace character { //主角种族
const uint16_t kRaceId = ; //数据表中的id
typedef struct {
uint8_t id;
int32_t modelid; //模型ID
int32_t hair; //头发
int32_t face; //脸
int32_t shoulder; //肩
int32_t body; //身体
int32_t hand; //手
int32_t foot; //脚
uint32_t idleinterval; //休闲时间间隔
} race_t; //主角头发模型
const uint16_t kHairId = ;
typedef struct {
uint16_t id;
uint8_t race;
const char* meshfile;
const char* showname;
} hair_t; //主角脸型
const uint16_t kFaceId = ;
typedef struct {
uint16_t id;
uint8_t race;
const char* meshfile;
const char* showname;
} face_t; //主角动作组
const uint16_t kActionSetId = ;
const uint8_t kWeaponTypeMax = ;
typedef struct {
uint16_t id;
const char* weaponset[kWeaponTypeMax]; //对应武器类型
bool hideweapon; //是否隐藏武器
uint32_t appoint_weaponid; //指定的武器ID
const char* description; //描述
} actionset_t; //主角特效
const uint16_t kEffectId = ;
typedef struct {
uint16_t id;
uint16_t effect1;
uint16_t effect2;
const char* locator;
int32_t soundid;
const char* weaponlocator;
} effect_t; //主角升级经验
const uint16_t kExpId = ;
typedef struct {
uint8_t id;
uint32_t effectneed;
} exp_t; //外形ID对应模型名称
const uint16_t kModelId = ;
enum {
kMountNumberMax = ,
kSoundNumberMax = , //数值根据地面的类型得出
};
typedef struct {
uint16_t id;
float fusetime; //动作融合时间
const char* modelname; //模型文件
int16_t soundid[kSoundNumberMax]; //不同地面跑步的声音
const char* actionset_none; //不使用坐骑的动作文件
const char* actionset_mount[kMountNumberMax]; //使用坐骑的动作文件
} model_t; //头像
const uint16_t kHeadPortrait = ;
typedef struct {
uint16_t id;
uint8_t race;
const char* imagesetname;
} headportrait_t; //坐骑表
const uint16_t kMountId = ;
const uint8_t kMountEffectMax = ;
typedef struct {
const char* effectlocator; //特效绑定点
const char* effectname; //特效名称
} mounteffect_t; typedef struct {
uint16_t id;
float leaveground_height; //距离地面的距离,特殊坐骑用
uint16_t modelid;
int16_t character_actionindex; //人物骑乘时的动作组
mounteffect_t effectinfo[kMountEffectMax]; //特效信息
} mount_t; //称号表
const uint16_t kTitleInfoId = ;
typedef struct {
uint16_t id;
uint8_t type;
const char* color; //显示颜色
bool defaultshow; //默认是否显示
const char* man; //男性称号
const char* woman; //女性称号
const char* description; //描述
int32_t timelimit; //时限
int16_t effectid; //效果ID
const char* reclaimcause; //回收原因
int16_t groupid; //组合称号ID
} titleinfo_t; //阵营
const uint16_t kCampDataId = ; //人物等级携带金钱上限
const uint16_t kLevelMoneyMaxId = ;
typedef struct {
uint8_t id;
uint32_t moneymax;
uint8_t level; //等级
} level_moneymax_t; //改变发型消耗表
const uint16_t kHairStyleCostId = ;
typedef struct {
uint16_t id;
int32_t itemid; //物品ID
int32_t itemcount; //消耗物品数量
uint8_t sex; //性别
} hairstyle_cost_t; }; //namespace character #endif //VENGINE_DB_STRUCT_CHARACTER_H_

db模块 文件file.h

/**
* PAP Engine ( -- )
* $Id file.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-22 18:08:41
* @uses vengine file database module
* cn: 文件数据模块
*/
#ifndef VENGINE_DB_FILE_H_
#define VENGINE_DB_FILE_H_ #include "vengine/config.h" /** 注意此处引用了公用文件,文件数据库 **/
namespace pap_common_file { class Database; }; //namespace pap_common_file namespace vengine_db { class VENGINE_API File { public:
typedef struct {
uint32_t identify; //标示
int32_t field_number; //列数
int32_t record_number; //记录数
int32_t string_block_size; //字符串区大小
} file_head_t; typedef enum { //field type
kTypeInt = ,
kTypeFloat = ,
kTypeString = ,
} field_type_enum; union field_data {
float float_value;
int32_t int_value;
const char* string_value; //can't change excel value in memory
field_data() {/** do nothing **/}
field_data(float value) {float_value = value;}
field_data(int32_t value) {int_value = value;}
field_data(const char* value) {string_value = value;}
}; public:
virtual const field_data* search_index_equal(int32_t index) const = ;
virtual const field_data* search_line_equal(int32_t line) const = ;
virtual const field_data* search_position(int32_t line,
int32_t column) const = ;
virtual const field_data* search_first_column_equal(
int32_t column,
const field_data &value) const = ; public:
virtual const pap_common_file::Database* get_databasefile() const = ;
virtual int32_t get_id() const = ;
virtual int32_t get_field_number() const = ;
virtual int32_t get_record_number() const = ; }; }; //namespace vengine_db #endif //VENGINE_DB_FILE_H_

模块db 文件system.h

/**
* PAP Engine ( -- )
* $Id system.h
* @link -- for the canonical source repository
* @copyright Copyright (c) 2013-2014 viticm( viticm@126.com )
* @license
* @user viticm<viticm@126.com/viticm.ti@gmail.com>
* @date 2014-3-22 18:27:52
* @uses vengine file database module
*/
#ifndef VENGINE_DB_SYSTEM_H_
#define VENGINE_DB_SYSTEM_H_ #include "vengine/config.h"
#include "vengine/kernel/node.h"
#include "vengine/db/file.h" namespace vengine_db { class VENGINE_API System : public vengine_kernel::Node { VENGINE_KERNEL_DECLARE_DYNAMIC(vengine_db_System); public:
virtual void open() = ; //打开所有数据
virtual void close() = ; //关闭所有数据
virtual const File* get(int32_t id) const = ; }; }; //namespace vengine_db #endif //VENGINE_DB_SYSTEM_H_

SIMPLE

天龙八部的表配置

总结

我在这里简述一下读取txt的基本原理,那就是以行为单位作为一个结构读取。每个格子为一个数据的基本单位,它的顺序为自左至右从上而下读取。这个会在以后在详细讲到,大家可以关注以后的讲解,新的框架中也集成了解析txt格式的文件数据处理。

MMORGP大型游戏设计与开发(客户端架构 part13 of vegine)的更多相关文章

  1. MMORGP大型游戏设计与开发(客户端架构 part1 of vgui)

    作为客户端的重要装饰,UI扮演着极为重要的角色,是客户端中核心的组成.vgui(微GUI)中,提供了核心的接口封装,实现了客户端中常见的界面操作,并结合lua脚本,使得控制界面更加的方便. 构架 总结 ...

  2. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  3. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  4. MMORPG大型游戏设计与开发(UI SYSTEM SHOW)

    接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...

  5. MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)

    核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...

  6. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  7. MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)

    在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...

  8. MMORPG大型游戏设计与开发(客户端架构 part2 of vgui)

    这一节我将讲解vgui的基础系统部分,也是该库提供给外部使用的一些重要接口.作为UI部分比较重要的部分,该节有着至关重要的部分,如果没有看到上一节内容,请留意下面的连接.我们现在可以猜想一下在客户端U ...

  9. MMORPG大型游戏设计与开发(客户端架构 part16 of vegine)

    由于近来比较忙碌和有些困倦的原因,所以关于这部分的文章没有及时更新,一句话:让朋友们久等了!今天所讲的是客户端vengine(微引擎)中最后一个部分,就像上节所说,这一部分的内容比较多.可能有些朋友看 ...

随机推荐

  1. VS2010添加类失败问题,弹出错误框,提示 CodeModel操作失败,无法访问标记数据库

    我在使用VS2010添加类的时候,会弹出一个错误框,提示 CodeModel操作失败,可以无法访问标记数据库 英文版是 CodeModel operation failed,Possibly cann ...

  2. 20款响应式的 HTML5 网页模板【免费下载】

    下面的列表集合了20款响应式的 HTML5 网页模板,这些专业的模板能够让你的网站吸引很多的访客.除了好看的外观,HTML5 模板吸引大家的另一个原因是由于其响应性和流动性.赶紧来看看. 您可能感兴趣 ...

  3. 【CSS3】CSS3:border-image的详解和实例

    border-image简介 border-image是CSS3中的新特性.目前几乎所有的主流浏览器都已经支持该特性,详情请移步border-image的兼容性. border-image属性及使用说 ...

  4. DOM中的事件处理概览与原理的全面剖析

    事件是一种异步编程的实现方式,本质上是程序各个组成部分之间的通信,DOM支持大量的事件: 本文通过这几点向大家详细解析事件处理的基本原理:事件类型.事件目标.事件处理程序.事件对象.事件传播 最后再向 ...

  5. SAP ABAP将大数据量排序后输入到内表

    要向内表读入3百50万条数据,如果一次读入就会产生运行错误,错误提示为,没有内存对于扩展 内表. 我考虑使用SELECT...INTO TABLE...PACKAGE SIZE 和ENDSELECT来 ...

  6. ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测

    一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...

  7. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

  8. yii redies 不同的工程缓存key的问题

    参考这篇文章 基本配置操作: yii main.php中: return array( ... 'components'=>array( 'redis_cache' => array ( ...

  9. 统计整个Xcode工程代码行数

    打开终端,ls 查看目录,用cd命令 定位到工程所在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来: find . "(" -name "*.m" ...

  10. 截取UIImage指定大小区域

    截取UIImage指定大小区域 最近遇到这样的需求:从服务器获取到一张照片,只需要显示他的左半部分,或者中间部分等等.也就是截取UIImage指定大小区域. UIImage扩展 我的解决方案是对UII ...