数据编辑器使用教程

数据编辑器是CocoStudio工具集中一个较轻量的工具,它的主要功能是将表格内容导出为Json格式,Jsons(JavaScript Object Notation)是一种轻量级的数据格式,易于阅读和编写,同时也易于机器解析和生成。被广泛应用于手机游戏开发中,如果你的项目中使用了javascript,那么这个数据格式就太适合你了!图(1- 01)中最右边就是数据编辑器


(图1- 01)
游戏开发过程中需要大量的数据,这些数据多数以Excel表格的形式提供,Excel是一个很强大的工具,无所不能,你甚至可以在Excel中编写代码,但是CocoStudio致力于让游戏开发变得更简单、更可视化,你不必在Excel中写繁琐的VB代码,只需要编辑好Excel表格数据,然后使用DataEditor倒出成Json即可。
例如游戏中的NPC系统,NPC的个数有若干个,每个NPC都有不同的属性,那么策划现在就需要配置一张包含所有NPC、和所有属性的表格,表格字段的设计方法有很多种,在这里我们先学习工具怎么使用。假设策划配置的NPC表格(data.xlsx)如下:

(1)打开数据编辑器,选择 文件->导入模板表->Excel 将这个文件导入到工具中,如下图:

(2)导入之后如下图

1) 数据表:显示所导入的数据文件名称
2) 结构树:显示当前数据文件所有分页和数据
3) 设置属性:显示一条数据的所有字段,Value部分可以双击改变数值
(3)在这里可以方便的查看、更改每一条的数据,确认无误后就可以进行倒出操作。选择 文件->导出Json文件 或者点击 按钮,弹出导出面板,如下图

1) 文件名:导出Json文件的名字
2) 路径:导出Json文件的路径
3) 批量导出设置:当前工作单是指数据表结构树中当前选择的文件,
全部工作单是指数据表结构树中所有文件
4)导出Json格式:用属性方式和对象方式分别导出上文中的data.xlsx,结果如下图:

(对象方式导出)

(属性方式导出)
对象方式是将每一条记录按照数组的方式组织,访问的时候用数组下标访问,个人不建议使用这种方式,Json格式推荐的是下面这种。
属性方式是以每一列的列名为key,行内容为Value,将每一条记录组织成Key/Value键值对,推荐使用这种方式,更符合Json的风格。

(4)在程序中使用:
初始化字典
unsigned long len = 0;
unsigned char* des = cocos2d::CCFileUtils::sharedFileUtils()->getFileData(“data_Property.json”, “r”, &len);
cs::CSJsonDictionary dict = new cs::CSJsonDictionary();
dict->initWithDescription((const char
)des);
读取数据
cs::CSJsonDictionary* sub = dict->getSubObjectFromArrayByIndex(0);该方法还未释放,请等待11月19日版本。
std::string name = sub->getItemStringValue(“Name”);
int level = sub->getItemIntValue(“Level”, -1);
printf(“count : %d\n”, count);

教程所用数据文件: data.xlsx.zip (7 KB)

#以下内容是2013/11/25添加#

注意:因为读取对象模式的代码没有更新到引擎中,所以这里提供一下代码,以供使用者自行修改引擎。

在CSContentJsonDictionary.h

class CSJsonDictionary
{
public:
”后添加声明
DicItemType getItemTypeFromArray(const char *pszArrayKey, int nIndex);

在CSContentJsonDictionary.cpp 添加

DicItemType CSJsonDictionary::getItemTypeFromArray(const char *pszArrayKey, int nIndex)
{
    CSJson::Value * arrayValue = validateArrayItem(pszArrayKey, nIndex);
    if (arrayValue)
        return (DicItemType)((*arrayValue).type());

    return (DicItemType)CSJson::nullValue;
}

使用这个还得注意列名不要使用中文。。。。

你这个是读取属性模式的方法,读取对象模式的好像不行哦,是不是也写一下呢?

在网上找了一个读取对象模式的、、、、

unsigned long len = 0;
unsigned char* des = cocos2d::CCFileUtils::sharedFileUtils()->getFileData(“data_Property.json”, “r”, &len);
CSJson::Reader reader;
CSJson::Value jsValue;
bool parseRet = reader.parse(pCityData,jsValue,false);
unsigned int nCount = jsValue.size();
for (unsigned int i=0;i<nCount;i++)
{
m_pCityInfo* = new City_info;
if (jsValue i ] “id”].empty()) {
CC_SAFE_DELETE(m_pCityInfo
);
continue;
}else {
m_pCityInfo*->m_ID = jsValue***** i ] * "ID"].asInt();
m_pCityInfo
->m_Name = jsValue
*** i ] * "Name"].asString();
}
}

你好,这里有个问题有点抱歉哈,之前导出的对象模式确实是不能成功读取的,目前已经修复这个问题了,不过需要等到11月19号cocos2d-x版本发布才能更新。

— Begin quote from ____

引用第3楼hanrea于2013-10-31 11:14发表的 回 2楼(pz789as) 的帖子 :
你好,这里有个问题有点抱歉哈,之前导出的对象模式确实是不能成功读取的,目前已经修复这个问题了,不过需要等到11月19号cocos2d-x版本发布才能更新。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=165107&pid=845733

— End quote

cs::CSJsonDictionary* sub = dict->getSubObjectFromArrayByIndex(0);该方法还未释放,请等待11月19日版本。

11月19日 这个版本没有更新出来这个……:12:

:12: 看来我也被坑了额··要么给你们单独发吧,需要的自己改下~~晚会给大家加到一楼。

老大 怎么改?? 我使用读取读取对象模式的也不行呀 读取就会宕机。。。

unsigned long ulSize = 0;
char* lpszData = (char*)CCFileUtils::sharedFileUtils()->getFileData(MAPLIST_FILE, “r”, &ulSize);
if ( !lpszData )
return false;

CSJson::Reader reader;
CSJson::Value jsValue;
if ( reader.parse(lpszData, jsValue, false) )
{
    unsigned int nMaxCount = jsValue.size();
    m_pMapListData = new MapListData;
    if ( !m_pMapListData )
    {
        return false;
    }

    for ( unsigned int i = 0; i < nMaxCount; i++ )
    {
        if ( jsValue*"id"].empty() )
        {
            continue;
        }

        m_pMapListData*.nID = jsValue*"id"].asInt();
        if ( jsValue*"name"].isString() )
        {
            strcpy(m_pMapListData*.szName, jsValue*"name"].asCString());
        }
        if ( jsValue*"scene"].isString() )
        {
            strcpy(m_pMapListData*.szScene, jsValue*"scene"].asCString());
        }
    }
}

走到if ( jsValue*“id”].empty() ) 这里就会宕机 :3: 求指正 求指教 求调教!!!!**********

— Begin quote from ____

引用第7楼zzpalm于2013-11-24 21:23发表的 :

unsigned long ulSize = 0;
    char* lpszData = (char*)CCFileUtils::sharedFileUtils()->getFileData(MAPLIST_FILE, "r", &ulSize);
    if ( !lpszData )
....... http://www.cocoachina.com/bbs/job.php?action=topost&tid=165107&pid=853875
![](http://cc.cocimg.com/bbs/p_w_picpath/back.gif)



*--- End quote*




为毛使用代码高亮会出现乱码。。。。 玩我吗 玩我吗 玩我吗  我不使用代码高亮再贴一遍

///////////////////////////////////////////////////////////////////

unsigned long ulSize = 0;
    char* lpszData = (char*)CCFileUtils::sharedFileUtils()->getFileData(MAPLIST_FILE, "r", &ulSize);
    if ( !lpszData )
        return false;

    CSJson::Reader reader;
    CSJson::Value jsValue;
    if ( reader.parse(lpszData, jsValue, false) )
    {
        unsigned int nMaxCount = jsValue.size();
        m_pMapListData = new MapListData;
        if ( !m_pMapListData )
        {
            return false;
        }

        for ( unsigned int i = 0; i < nMaxCount; i++ )
        {
            if ( jsValue*"id"].empty() )
            {
                continue;
            }

            m_pMapListData*.nID = jsValue*"id"].asInt();
            if ( jsValue*"name"].isString() )
            {
                strcpy(m_pMapListData*.szName, jsValue*"name"].asCString());
            }
            if ( jsValue*"scene"].isString() )
            {
                strcpy(m_pMapListData*.szScene, jsValue*"scene"].asCString());
            }
        }
    }*********

童靴,你的jsValue没有带下标啊
if ( jsValue i ] “id”].empty() )

注意 i ] 部分。。。不能使用颜色标示= =

貌似那个【 i】被屏蔽了= =。 但是我这里试了是可以读取出来呢。。。

这个方法这个版本没加上,所以目前只能说提供自己替换的版本了。也可以参考2楼的方法。

可以了 原来我倒错表了 我倒成对象方式了 改成属性方式就ok了

可以了 原来我倒错表了 我倒成对象方式了 改成属性方式就ok了 谢谢大侠帮助

这可以加密吗?

getSubObjectFromArrayByIndex的实现,将就着用。

CSJsonDictionary* CSJsonDictionary::getSubObjectFromArrayByIndex( int nIndex )
{
if(!m_cValue.isArray()&&!m_cValue.isConvertibleTo(CSJson::arrayValue)){
return NULL;
}

    if(!m_cValue.isValidIndex(nIndex)){
        return NULL;
    }
    
    if(m_cValue.isObject()) {

        CSJsonDictionary * pNewDictionary = new CSJsonDictionary();
        pNewDictionary->initWithValue(m_cValue);
        return pNewDictionary;

    }

    return NULL;

3.0版本 关于数据的读取和应用这块有更新没啊?

lua怎么读data editor 导出的json