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

    Mysql保留字列表.吠品整理. 尝试使用一个识别符,例如使用嵌入式MySQL 数据类型或函数名作为表名或列名,例如TIMESTAMP 或GROUP,会造成一个常见问题.允许你这样操作( 例如,ABS ...

  2. jQuery原型方法.pushStack源码分析

    这次分析的方法跟前面不同,虽然pushStack也是原型方法之一,但是我们几乎从不用在页面调用,在参考手册里面也没有这个方法的使用说明,但是这个方法还是非常重要的,在使用很多jQuery的其他方式都会 ...

  3. CoreDataManager-Swift版-兼容iOS10以前的版本

    import UIKit import CoreData // coredata管理器 class CoreDataManager: NSObject { // 单例 static let share ...

  4. Android实现登录

    登录界面布局文件         1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android ...

  5. 【C语言】C语言外部变量和内部变量

    目录: [外部变量] · 定义 · 用extern修饰变量 [内部变量] · 定义 · 用static修饰变量 1.外部变量 · 定义 定义的变量能被本文件和其它文件访问的变量,称为外部变量. 注: ...

  6. 手动配置 Android SDK

      下载地址与说明http://www.androiddevtools.cn/#sdk-list   手动添加 SDK   这是Android开发所需的sdk,下载并解压后,将解压出的整个文件夹复制或 ...

  7. iOS如何获取网络图片(三)有沙盒的

    沙盒 沙盒简介 默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 Documents:苹果建议将程序中建立的或在程 ...

  8. Android IPC机制之AIDL

    什么是AIDL AIDL:Android Interface Definition Language,即Android接口定义语言. Android系统中的进程之间不能共享内存,因此,需要提供一些机制 ...

  9. 使用xmarks同步 chrome ie firefox safari书签

    xmarks是什么? Install Xmarks on each computer you use, and it seamlessly integrates with your web brows ...

  10. 从多个XML文档中读取数据用于显示webapi帮助文档

    前言: 你先得知道HelpPageConfig文件,不知道说明你现在不需要这个,所以下文就不用看了,等知道了再看也不急.当然如果你很知道这个,下文也不用看了,因为你会了. 方法一: new XmlDo ...