一些数据是需要不断改动的,程序不可能因为这些改动而不厌其烦的去改动代码,早期的这种做法就成了程序员们最悲哀的痛苦。自从有了数据管理后,程序的世界逐渐清晰,这些烦恼也不再出现,不过若是要很好的管理数据可是一门需要不断摸索的学问。天龙八部/武侠世界中管理配置数据小到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. IOS 调用WebService(同步和异步)

    因为公司的服务全都是webservice,每次总要花费大量时间在调试服务上面,干脆就写了一个解析wsdl的项目,希望将来能用上吧.还未经过烘焙,有问题,还请高手点播点播. 下面,我拿天气服务的wsdl ...

  2. C# 如何实现带消息数的App图标

    上次写了一篇博文,但是每次更新图标时,桌面会闪烁(刷新),有博友说人家的图标都不会刷新,还能动画.我想了一下,如果要达到这个效果,可以用Form来实现,就是在Form中嵌入一个图片,然后用一个labe ...

  3. 【精心推荐】12款很好用的 jQuery 图片滚动插件

    这里收集了12款很好用的 jQuery 图片滚动插件分享给大家.jQuery 作为最流行的 JavaScript 框架,使用简单灵活,同时还有许多优秀的插件可供使用.其中最令人印象深刻的应用之一就是各 ...

  4. 12款支持移动设备的响应式 WordPress 主题

    响应式和现代设计风格的多用途 WordPress 主题与能够非常灵活的适应所有设备.而高级主题能够更大可能性的轻松定制.所有的主题是完全响应式的,您可以从主题选项中启用响应模式. 今天,这个列表收集了 ...

  5. JS高程1.javascript简介

    1.javaScript诞生于1995年,最开始是为了处理以前由服务器端语言负责的一些诸如验证的操作. 2.一些名词: ECMA:European Computer Manufacturers Ass ...

  6. [原创]html5游戏_贪吃蛇

    代码随便写写,尚有许多不足,PC与手机端皆可运行 手机端滑屏操作,PC端方向键操作 疑问: 生成食物,与判断是否可以移动方面 有两种实现方式, 1.使用js内存,数组循环判断 2.使用dom的quer ...

  7. animate 实现滑动切换效果

    今天和大家分享一下用 animate 实现滑动切换效果的小例子 ------- 来自<一只有梦想的前端小白> 大家都知道jQuery 提供的有一下几种方法能够实现滑动效果: slideDo ...

  8. OS X EI Capitan 系统 安装cocoapod

    没有废话直接上步骤    (哪一步卡住了 多试几次 可能是网络不好的缘故) 1. 首先安装 home-brew   以下方法转自:http://www.cnblogs.com/lzrabbit/p/4 ...

  9. 转 java中static{}语句块详解

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  10. 操作系统开发系列—13.d.多进程 ●

    进程此时不仅是在运行而已,它可以随时被中断,可以在中断处理程序完成之后被恢复.进程此时已经有了两种状态:运行和睡眠.我们已经具备了处理多个进程的能力,只需要让其中一个进程处在运行态,其余进程处在睡眠态 ...