码迷,mamicode.com
首页 > 编程语言 > 详细

cocos2dx导出的json转c++代码

时间:2015-08-28 17:42:58      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

虽然2dx提供了CocoStudio界面编辑工具,但是他并非一个开源产品,没有提供原码修改,更做不到像vs一样的控件集成。在一个界面设计完成后,往往要把相关的界面上的东西转成相对应的原码基本都是一至的,这些动作繁琐而又没有意思看如下代码等:

_Panel = static_cast<Layout*>(extension::GUIReader::shareReader()->widgetFromJsonFile("DemoShop.ExportJson"));
this->addWidget(_Panel);
_Panel_shop_ScrollView = static_cast<ScrollView*>(Helper::seekWidgetByName(_Panel, "shop_ScrollView"));
_Panel_shop_ScrollView->addTouchEventListener(this, toucheventselector(CDemoShop::Panel_shop_ScrollView_touchEvent));


看这些代码又有一些相关类似外,无非就是把json文件解析,然后一一对到对应控件,获得对应地址等。与其在上面花费大量无用时间写这些代码。考虑做一个代码转换工作

代码如下:

// exportjson2cpp.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <string>
#include <fstream>
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <assert.h>
#include <map>
#include <stdio.h>
#include <json/json.h>
#include <dwxmlfile.h>
#include <dwhashmap.h>
#include <algorithm>
using namespace std;
using namespace DWDP;




//const TCHAR*  DWGetModulePath()
//{
//    static TCHAR szPath[DW_MAX_PATH];
//    static bool bFirstTime = true;
//    if (bFirstTime)
//    {
//#if (defined(WIN32) || defined(WIN64))
//        bFirstTime = false;
//        GetModuleFileName(NULL, (TCHAR*)szPath, sizeof(szPath));
//        TCHAR *p = _tcsrchr(szPath, _DWT(‘\\‘));
//        *p = _DWT(‘\0‘);
//        _tcscat(szPath, _DWT("\\"));
//#else
//        CHAR szTmp[DW_MAX_PATH];
//        getcwd(szTmp,sizeof(szTmp));
//        CHAR szTempPath[DW_MAX_PATH];
//        sprintf(szTempPath,"%s/",szTmp);
//        _DWTStrncpy(szPath,_DWTA2T(szTempPath),DW_MAX_PATH);
//#endif //
//    }
//    return szPath;
//}


#define CC_LOOP_DO do{
#define CC_LOOP_WHILE(condition) }while(condition);


#define CC_LOOP_WHILE_START(condition) while(condition){
#define CC_LOOP_WHILE_END };


#define CC_LOOP_FOR_START(condition) for(condition){
#define CC_LOOP_FOR_END };


#define CC_LOOP_BREAK(condition) if(condition)break;
#define CC_LOOP_BREAK_EXPRESSION(condition, Expression) \
if(condition)\
{\
Expression;\
break;\
}
#define CC_LOOP_CONTINUE(condition) if(condition)continue;
#define CC_LOOP_RETURN(condition, Expression) \
if(condition)\
{\
return Expression;\
}


struct SNodeProp;


typedef vector<SNodeProp*> CNodePropVec;
typedef CNodePropVec::iterator CNodePropVecItr;




struct SNodeProp
{
    SNodeProp()
    {
        classname = "";
        name = "";
        objecttag = 0;
        _vecUIProp.clear();
        _vecGObjects.clear();
        _vecComs.clear();
        parent = NULL;
    }
    string classname;
    string name;
    int objecttag;
    CNodePropVec _vecUIProp;
    CNodePropVec _vecGObjects;
    CNodePropVec _vecComs;
    SNodeProp *parent;
};


FILE* pfH = NULL;
FILE* pfCPP = NULL;
bool bNet = false;
bool bcsd = false;
bool g_bUI = false;
string g_path = "";
string g_strClassName = "";




bool LoadUIJson(string strFile, SNodeProp *pstProp);
bool ParseUIJsonChildren(Json::Value  childrens, SNodeProp *pstProp);
bool WriteUI(string strFile, SNodeProp *pstProp);


std::string getGUIClassName(const std::string &_classname)
{
    const char* classname = _classname.c_str();
    std::string convertedClassName = classname;
    if (classname && strcmp(classname, "Button") == 0)
    {
        convertedClassName = "Button";
    }
    else if (classname && strcmp(classname, "CheckBox") == 0)
    {
        convertedClassName = "CheckBox";
    }
    else if (classname && strcmp(classname, "Label") == 0)
    {
        convertedClassName = "Label";
    }
    else if (classname && strcmp(classname, "LabelAtlas") == 0)
    {
        convertedClassName = "LabelAtlas";
    }
    else if (classname && strcmp(classname, "LoadingBar") == 0)
    {
        convertedClassName = "LoadingBar";
    }
    else if (classname && strcmp(classname, "ScrollView") == 0)
    {
        convertedClassName = "ScrollView";
    }
    else if (classname && strcmp(classname, "TextArea") == 0)
    {
        convertedClassName = "Label";
    }
    else if (classname && strcmp(classname, "TextButton") == 0)
    {
        convertedClassName = "Button";
    }
    else if (classname && strcmp(classname, "TextField") == 0)
    {
        convertedClassName = "TextField";
    }
    else if (classname && strcmp(classname, "ImageView") == 0)
    {
        convertedClassName = "ImageView";
    }
    else if (classname && strcmp(classname, "Panel") == 0)
    {
        convertedClassName = "Layout";
    }
    else if (classname && strcmp(classname, "Slider") == 0)
    {
        convertedClassName = "Slider";
    }
    else if (classname && strcmp(classname, "LabelBMFont") == 0)
    {
        convertedClassName = "LabelBMFont";
    }
    else if (classname && strcmp(classname, "DragPanel") == 0)
    {
        convertedClassName = "ScrollView";
    }
    else if(classname && strcmp(classname, "DragPanel") == 0 )
    {
        convertedClassName = "Node";
    }
    else if(classname && strcmp(classname, "SimpleAudio") == 0)
    {
        convertedClassName = "Node";
    }
    else if(classname && strcmp(classname, "SingleNode") == 0)
    {
        convertedClassName = "Node";
    }
    return convertedClassName;
}


bool LoadUIJson(string strFile, SNodeProp *pstProp)
{
    ifstream file(strFile.c_str());
    if(!file.is_open())
    {
        printf("Parse error");
        return false;
    }
    Json::Value  Panel;
    Json::Reader reader;
    if(!reader.parse(file, Panel, false))
    {
        printf("Parse error");
        return false;
    }
    if(!Panel["widgetTree"].isObject())
    {
        printf("Parse error");
        return false;
    }
    Json::Value widgetTree = Panel["widgetTree"];
    Json::Value options = widgetTree["options"];
    //解析返回的状态码
    if(!options["classname"].isString())
    {
        printf("Parse error");
        return false;
    }
    if(!options["name"].isString())
    {
        printf("Parse error");
        return false;
    }
    if(!widgetTree["children"].isArray())
    {
        printf("Parse error");
        return false;
    }
    pstProp->classname = options["classname"].asString();
    pstProp->name = options["name"].asString();
    ParseUIJsonChildren(widgetTree["children"], pstProp);
    pstProp->classname = getGUIClassName(pstProp->classname);
    return true;
}




bool ParseUIJsonChildren(Json::Value  childrens, SNodeProp *pstProp)
{
    if(!childrens.isArray())
    {
        printf("Parse error");
        return false;
    }
    for(int idx = 0; idx < childrens.size(); idx++)
    {
        Json::Value  children = childrens[idx];
        if(!children.isObject())
        {
            printf("Parse error");
            return false;
        }
        //解析返回的状态码
        if(!children["classname"].isString())
        {
            printf("Parse error");
            return false;
        }
        Json::Value options = children["options"];
        SNodeProp *_pstProp = new SNodeProp;;
        _pstProp->parent = pstProp;
        _pstProp->classname = options["classname"].asString();
        _pstProp->name = options["name"].asString();
        ParseUIJsonChildren(children["children"], _pstProp);
        _pstProp->classname = getGUIClassName(_pstProp->classname);
        pstProp->_vecUIProp.push_back(_pstProp);
    }
    return true;
}


bool WritePropFun2H(string parent, SNodeProp  *pstProp)
{
    CC_LOOP_DO
    CC_LOOP_BREAK(parent == "")
    if(pstProp->classname == "Button")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "CheckBox")
    {
        fprintf(pfH, " void %s_%s_selected(Ref* pSender, CheckBox::EventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "ImageView")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "LabelAtlas")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "LabelBMFont")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "LoadingBar")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "Slider")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "Label")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "TextField")
    {
        //默认
        fprintf(pfH, " void %s_%s_textFieldEvent(Ref* pSender, TextField::EventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "Layout")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "ScrollView")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "ListView")
    {
        fprintf(pfH, " void %s_%s_selectedItemEvent(Ref* pSender, ListView::EventType type);\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfH, " void %s_%s_selectedItemEventScrollView(Ref* pSender, ui::ScrollView::EventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "PageView")
    {
        fprintf(pfH, " void %s_%s_pageViewEvent(Ref *pSender, PageView::EventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "CustomImageView")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "CustomParticleWidget")
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    else
    {
        //默认
        fprintf(pfH, " void %s_%s_touchEvent(Ref* pSender, TouchEventType type);\n", parent.c_str(), pstProp->name.c_str());
    }
    CC_LOOP_WHILE(0)
    for(CNodePropVecItr itr = pstProp->_vecUIProp.begin(); itr != pstProp->_vecUIProp.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2H(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2H(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecGObjects.begin(); itr != pstProp->_vecGObjects.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2H(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2H(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecComs.begin(); itr != pstProp->_vecComs.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2H(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2H(parent + "_" + pstProp->name, *itr);
        }
    }
    return true;
}


bool WriteProp2H(string parent, SNodeProp  *pstProp)
{
    if (parent == "")
    {
        fprintf(pfH, " %-25s* _%s;\n", pstProp->classname.c_str(), pstProp->name.c_str());
    }
    else
    {
        fprintf(pfH, " %-25s* _%s_%s;\n", pstProp->classname.c_str(), parent.c_str(), pstProp->name.c_str());
    }
    for(CNodePropVecItr itr = pstProp->_vecUIProp.begin(); itr != pstProp->_vecUIProp.end(); itr++)
    {
        if (parent == "")
        {
            WriteProp2H(pstProp->name, *itr);
        }
        else
        {
            WriteProp2H(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecComs.begin(); itr != pstProp->_vecComs.end(); itr++)
    {
        if (parent == "")
        {
            WriteProp2H(pstProp->name, *itr);
        }
        else
        {
            WriteProp2H(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecGObjects.begin(); itr != pstProp->_vecGObjects.end(); itr++)
    {
        if (parent == "")
        {
            WriteProp2H(pstProp->name, *itr);
        }
        else
        {
            WriteProp2H(parent + "_" + pstProp->name, *itr);
        }
    }
    return true;
}


bool WritePropInit2Cpp(string parent, SNodeProp *pstProp)
{
    static string ps = "";
    if (parent == "")
    {
        fprintf(pfCPP, "%s_%s(nullptr)\n", ps.c_str(), pstProp->name.c_str());
    }
    else
    {
        fprintf(pfCPP, "%s_%s_%s(nullptr)\n", ps.c_str(), parent.c_str(), pstProp->name.c_str());
    }
    ps = ",";
    for(CNodePropVecItr itr = pstProp->_vecUIProp.begin(); itr != pstProp->_vecUIProp.end(); itr++)
    {
        if (parent == "")
        {
            WritePropInit2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropInit2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecComs.begin(); itr != pstProp->_vecComs.end(); itr++)
    {
        if (parent == "")
        {
            WritePropInit2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropInit2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecGObjects.begin(); itr != pstProp->_vecGObjects.end(); itr++)
    {
        if (parent == "")
        {
            WritePropInit2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropInit2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    return true;
}




bool Write2InitCpp(string parent, SNodeProp *pstProp, bool bUI)
{
    CC_LOOP_DO
    CC_LOOP_BREAK(parent == "")
    //////////////////////////////////////////////////////////////////////////
    if(pstProp->classname == "Button")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "CheckBox")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        fprintf(pfCPP, " _%s_%s->addEventListener(this, toucheventselector(%s::%s_%s_selected));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "ImageView")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "LabelAtlas")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "LabelBMFont")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "LoadingBar")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        fprintf(pfCPP, " _%s_%s->setPercent(0);\n", parent.c_str(), pstProp->name.c_str());
    }
    else if(pstProp->classname == "Slider")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "Label")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "TextField")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addEventListener(this, toucheventselector(%s::%s_%s_textFieldEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "Layout")
    {
        if (NULL != pstProp->parent && pstProp->parent->classname == "CCComRender")
        {
            fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(_%s->getNode());\n",
                    parent.c_str(),
                    pstProp->name.c_str(),
                    pstProp->classname.c_str(),
                    parent.c_str(),
                    pstProp->name.c_str());
        }
        if (NULL != pstProp->parent && pstProp->parent->classname == "UILayer")
        {
            fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(_%s->getWidgetByName(\"%s\"));\n",
                    parent.c_str(),
                    pstProp->name.c_str(),
                    pstProp->classname.c_str(),
                    parent.c_str(),
                    pstProp->name.c_str());
        }
        else
        {
            fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                    parent.c_str(),
                    pstProp->name.c_str(),
                    pstProp->classname.c_str(),
                    parent.c_str(),
                    pstProp->name.c_str());
        }
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "ScrollView")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "ListView")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        fprintf(pfCPP, " _%s_%s->addEventListener((ui::ListView::ccListViewCallback)this, toucheventselector(%s::%s_%s_selectedItemEvent));\n", parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        fprintf(pfCPP, " _%s_%s->addEventListener((ui::ListView::ccScrollViewCallback)this, toucheventselector(%s::%s_%s_selectedItemEventScrollView,this));\n", parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "PageView")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        fprintf(pfCPP, " _%s_%s->addEventListener(this, toucheventselector(%s::%s_%s_pageViewEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "CustomImageView")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "CustomParticleWidget")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "Sprite")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "Node")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    //////////////////////////////////////////////////////////////////////////
    else if(pstProp->classname == "CCComAudio")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(_%s->getComponent(\"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "UILayer")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(dynamic_cast<CCComRender*>(_%s->getComponent(\"%s\"))->getNode());\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if (pstProp->classname == "CCSprite" ||
             pstProp->classname == "CCTMXTiledMap" ||
             pstProp->classname == "CCParticleSystemQuad" ||
             pstProp->classname == "CCArmature" ||
             pstProp->classname == "GUIComponent")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(dynamic_cast<CCComRender*>(_%s->getComponent(\"%s\"))->getNode());\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    else if(pstProp->classname == "CCNode")
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekNodeByTag(_%s, %d));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->objecttag);
    }
    else
    {
        fprintf(pfCPP, " _%s_%s = dynamic_cast<%s*>(Helper::seekWidgetByName(_%s, \"%s\"));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                pstProp->classname.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
        //默认
        fprintf(pfCPP, " _%s_%s->addTouchEventListener(this, toucheventselector(%s::%s_%s_touchEvent));\n",
                parent.c_str(),
                pstProp->name.c_str(),
                g_strClassName.c_str(),
                parent.c_str(),
                pstProp->name.c_str());
    }
    fprintf(pfCPP, "\n");
    CC_LOOP_WHILE(0)
    for(CNodePropVecItr itr = pstProp->_vecUIProp.begin(); itr != pstProp->_vecUIProp.end(); itr++)
    {
        if (parent == "")
        {
            Write2InitCpp(pstProp->name, *itr, true);
        }
        else
        {
            Write2InitCpp(parent + "_" + pstProp->name, *itr, true);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecComs.begin(); itr != pstProp->_vecComs.end(); itr++)
    {
        if (parent == "")
        {
            Write2InitCpp(pstProp->name, *itr, false);
        }
        else
        {
            Write2InitCpp(parent + "_" + pstProp->name, *itr, false);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecGObjects.begin(); itr != pstProp->_vecGObjects.end(); itr++)
    {
        if (parent == "")
        {
            Write2InitCpp(pstProp->name, *itr, false);
        }
        else
        {
            Write2InitCpp(parent + "_" + pstProp->name, *itr, false);
        }
    }
    return true;
}


bool WritePropFun2Cpp(string parent, SNodeProp *pstProp)
{
    CC_LOOP_DO
    CC_LOOP_BREAK(parent == "")
    //////////////////////////////////////////////////////////////////////////
    if(pstProp->classname == "Button")
    {
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "CheckBox")
    {
        fprintf(pfCPP, "void %s::%s_%s_selected(Ref* pSender, CheckBox::EventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case CheckBox::EventType::UNSELECTED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case CheckBox::EventType::SELECTED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "ImageView")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "LabelAtlas")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "LabelBMFont")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "LoadingBar")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "Slider")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "Label")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "TextField")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_textFieldEvent(Ref* pSender, TextField::EventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TextField::EventType::ATTACH_WITH_IME:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TextField::EventType::DETACH_WITH_IME:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TextField::EventType::INSERT_TEXT:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TextField::EventType::DELETE_BACKWARD:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "Layout")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "ScrollView")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "ListView")
    {
        fprintf(pfCPP, "void %s::%s_%s_selectedItemEvent(Ref* pSender, ListView::EventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_START:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case cocos2d::ui::ListView::EventType::ON_SELECTED_ITEM_END:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
        fprintf(pfCPP, "void %s::%s_%s_selectedItemEventScrollView(Ref* pSender, ui::ScrollView::EventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s\n", pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case ui::ScrollView::EventType::SCROLL_TO_BOTTOM:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case ui::ScrollView::EventType::SCROLL_TO_TOP:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "PageView")
    {
        fprintf(pfCPP, "void %s::%s_%s_pageViewEvent(Ref* pSender, PageView::EventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case PageView::EventType::TURNING:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "CustomImageView")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else if(pstProp->classname == "CustomParticleWidget")
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    else
    {
        //默认
        fprintf(pfCPP, "void %s::%s_%s_touchEvent(Ref* pSender, TouchEventType type)\n", g_strClassName.c_str(), parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " // _%s_%s\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " CCLOG(\"_%s_%s\");\n", parent.c_str(), pstProp->name.c_str());
        fprintf(pfCPP, " switch (type)\n");
        fprintf(pfCPP, " {\n");
        fprintf(pfCPP, " case TOUCH_EVENT_BEGAN:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_MOVED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_ENDED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " case TOUCH_EVENT_CANCELED:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " default:\n");
        fprintf(pfCPP, " break;\n");
        fprintf(pfCPP, " }\n");
        fprintf(pfCPP, "}\n\n");
    }
    fprintf(pfCPP, "\n");
    CC_LOOP_WHILE(0)
    for(CNodePropVecItr itr = pstProp->_vecUIProp.begin(); itr != pstProp->_vecUIProp.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecGObjects.begin(); itr != pstProp->_vecGObjects.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    for(CNodePropVecItr itr = pstProp->_vecComs.begin(); itr != pstProp->_vecComs.end(); itr++)
    {
        if (parent == "")
        {
            WritePropFun2Cpp(pstProp->name, *itr);
        }
        else
        {
            WritePropFun2Cpp(parent + "_" + pstProp->name, *itr);
        }
    }
    return true;
}














bool ParseSceneJsonChildren(Json::Value  childrens,SNodeProp *pstProp);
bool LoadSceneJson(string strFile, SNodeProp *pstProp)
{
    ifstream file(strFile.c_str());
    assert(file.is_open());
    Json::Value  Root;
    Json::Reader reader;
    if(!reader.parse(file, Root, false))
    {
        printf("Parse error");
        return false;
    }
    ParseSceneJsonChildren(Root, pstProp);
    return true;
}


bool ParseSceneJsonChildren(Json::Value  childrens, SNodeProp *pstProp)
{
    pstProp->classname = childrens["classname"].asString();
    pstProp->name = childrens["name"].asString();
    pstProp->objecttag = childrens["objecttag"].asInt();
    if(strcmp(pstProp->classname.c_str(), "CCNode") != 0)
    {
        return true;
    }
    if (pstProp->name == "")
    {
        pstProp->name = pstProp->classname;
    }
    if(childrens["components"].isArray())
    {
        for(int idx = 0; idx < childrens["components"].size(); idx++)
        {
            Json::Value  children = childrens["components"][idx];
            if(!children.isObject())
            {
                printf("Parse error");
                return false;
            }
            SNodeProp *_pstProp = new SNodeProp;;
            _pstProp->parent = pstProp;
            _pstProp->classname = children["classname"].asString();
            _pstProp->name = children["name"].asString();
            if (_pstProp->classname == "CCSprite" ||
                    _pstProp->classname == "CCTMXTiledMap" ||
                    _pstProp->classname == "CCParticleSystemQuad" ||
                    _pstProp->classname == "CCArmature")
            {
                //////////////////////////////////////////////////////////////////////////
            }
            else if (_pstProp->classname == "GUIComponent")
            {
                SNodeProp *pstProp = new SNodeProp;
                pstProp->parent = _pstProp;
                Json::Value fileData = children["fileData"];
                //解析返回的状态码
                if(fileData["path"].isString())
                {
                    string dirpath = g_path;
                    string _path = fileData["path"].asString();
                    int num = 10;
                    while(num--)
                    {
                        string path = dirpath + _path;
                        if (LoadUIJson(path, pstProp))
                        {
                            break;
                        }
                        printf("%s not found \n", path.c_str());
                        size_t pos = dirpath.find_last_of(‘\\‘);
                        dirpath = dirpath.substr(0, pos);
                        pos = dirpath.find_last_of(‘\\‘);
                        dirpath = dirpath.substr(0, pos + 1);
                    }
                    _pstProp->_vecUIProp.push_back(pstProp);
                }
                _pstProp->classname = "UILayer";
            }
            else if (_pstProp->classname == "CCComAudio" ||
                     _pstProp->classname == "CCBackgroundAudio")
            {
                _pstProp->classname = "CCComAudio";
            }
            else if (_pstProp->classname == "CCComController")
            {
                _pstProp->classname = "CCComController";
            }
            else if (_pstProp->classname == "CCComAttribute")
            {
                _pstProp->classname = "CCComAttribute";
            }
            //else if (_pstProp->classname == "CCScene")
            //{
            //    _pstProp->classname = "CCScene";
            //}
            else
            {
                continue;
            }
            pstProp->_vecComs.push_back(_pstProp);
        }
    }
    if(childrens["gameobjects"].isArray())
    {
        for(int idx = 0; idx < childrens["gameobjects"].size(); idx++)
        {
            Json::Value  children = childrens["gameobjects"][idx];
            if(!children.isObject())
            {
                printf("Parse error");
                return false;
            }
            SNodeProp *_pstProp = new SNodeProp;;
            _pstProp->parent = pstProp;
            ParseSceneJsonChildren(children, _pstProp);
            pstProp->_vecGObjects.push_back(_pstProp);
        }
    }
    return true;
}


//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
bool Write2H(string strFile, SNodeProp *pstProp)
{
    int dwPos = strFile.rfind(‘\\‘);
    string strFilePath = strFile.substr(0, dwPos + 1);
    string strFileName = strFile.substr(dwPos + 1, strFile.size());
    dwPos = strFileName.rfind(‘.‘);
    string strBassName = strFileName.substr(0, dwPos);
    string strH = strFilePath + strBassName + ".h";
    pfH = fopen(strH.c_str(), "w");
    if(NULL == pfH)
    {
        return false;
    }
    string strHEAD_LINE = "__" + strBassName + "_" + "H" + "__";
    transform(strHEAD_LINE.begin(), strHEAD_LINE.end(), strHEAD_LINE.begin(), ::toupper);
    g_strClassName = "C" + strBassName;
    //////////////////////////////////////////////////////////////////////////
    fprintf(pfH, "#ifndef %s\n#define %s\n\n", strHEAD_LINE.c_str(), strHEAD_LINE.c_str());
    fprintf(pfH, "#include \"cocos2d.h\"\n");
    //2.2.6
    fprintf(pfH, "#include \"cocos-ext.h\"\n");
    //end 2.2.6
    //2.2.6
    //fprintf(pfH, "#include \"ui/CocosGUI.h\"\n");
    //fprintf(pfH, "#include \"cocostudio/CocoStudio.h\"\n");
    //end 2.2.6
    if(bNet)
    {
        fprintf(pfH, "#include \"MGInclude.h\"\n");
        fprintf(pfH, "#include \"MGNetConnection.h\"\n");
        fprintf(pfH, "#include \"MGNetCmdHandler.h\"\n\n\n");
    }
    fprintf(pfH, "USING_NS_CC;\n");
    //fprintf(pfH, "USING_NS_CC_EXT;\n");
    fprintf(pfH, "using namespace ui;\n");
    //fprintf(pfH, "using namespace MyGame;\n");
    fprintf(pfH, "using namespace extension;\n\n\n");
    fprintf(pfH, "typedef  UILayer Layer;\n");
    fprintf(pfH, "typedef  CCObject Ref;\n");
    fprintf(pfH, "typedef  CCScene Scene;\n");
    fprintf(pfH, "typedef  UIHelper Helper;\n\n\n");
    if(bNet)
    {
        fprintf(pfH, "class %s : public Layer, public MGNetCmdHandler\n", g_strClassName.c_str());
    }
    else
    {
        fprintf(pfH, "class %s : public Layer\n", g_strClassName.c_str());
    }
    fprintf(pfH, "{\n");
    fprintf(pfH, "public:\n");
    fprintf(pfH, " %s();\n", g_strClassName.c_str());
    fprintf(pfH, " ~%s();\n", g_strClassName.c_str());
    fprintf(pfH, " bool init();\n");
    WritePropFun2H("", pstProp);
    if(bNet)
    {
        fprintf(pfH, "protected:\n");
        fprintf(pfH, " virtual  bool canProcess(ActionCode_t code);\n");
        fprintf(pfH, " virtual  void proccessDatas(MGNetDataReader * reader);\n");
        fprintf(pfH, " virtual  void netSendDatasFailed(MGNetDataWriter * writer);\n");
    }
    fprintf(pfH, "public:\n");
    fprintf(pfH, " static Scene* createScene() \n");
    fprintf(pfH, " { \n");
    fprintf(pfH, " Scene* pScene = Scene::create(); \n");
    fprintf(pfH, " %s* uiLayer = new (std::nothrow) %s(); \n", g_strClassName.c_str(), g_strClassName.c_str());
    fprintf(pfH, " if (uiLayer && uiLayer->init()) \n");
    fprintf(pfH, " { \n");
    fprintf(pfH, " uiLayer->autorelease(); \n");
    fprintf(pfH, " pScene->addChild(uiLayer); \n");
    fprintf(pfH, " } \n");
    fprintf(pfH, " else \n");
    fprintf(pfH, " { \n");
    fprintf(pfH, " CC_SAFE_DELETE(uiLayer); \n");
    fprintf(pfH, " } \n");
    fprintf(pfH, " return pScene; \n");
    fprintf(pfH, " }\n");
    fprintf(pfH, "protected:\n");
    WriteProp2H("", pstProp);
    fprintf(pfH, "};\n\n\n");
    fprintf(pfH, "#endif /* defined(%s) */", strHEAD_LINE.c_str());
    return true;
}


bool Write2Cpp(string strFile, SNodeProp *pstProp)
{
    int dwPos = strFile.rfind(‘\\‘);
    string strFilePath = strFile.substr(0, dwPos + 1);
    string strFileName = strFile.substr(dwPos + 1, strFile.size());
    dwPos = strFileName.rfind(‘.‘);
    string strBassName = strFileName.substr(0, dwPos);
    string strCPP = strFilePath + strBassName + ".cpp";
    pfCPP = fopen(strCPP.c_str(), "w");
    if(NULL == pfCPP)
    {
        return false;
    }
    //////////////////////////////////////////////////////////////////////////
    fprintf(pfCPP, "#include \"%s.h\"\n", strBassName.c_str());
    //fprintf(pfCPP, "#include \"extensions/cocos-ext.h\"\n\n\n");
    fprintf(pfCPP, "%s::%s()\n", g_strClassName.c_str(), g_strClassName.c_str());
    fprintf(pfCPP, ":");
    WritePropInit2Cpp("", pstProp);
    fprintf(pfCPP, "{\n");
    if(bNet)
    {
        fprintf(pfCPP, " MGNetConnection::sharedConnection()->registerCmdHandler(this);\n");
    }
    fprintf(pfCPP, "}\n\n");
    fprintf(pfCPP, "%s::~%s()\n", g_strClassName.c_str(), g_strClassName.c_str());
    fprintf(pfCPP, "{\n");
    if(bNet)
    {
        fprintf(pfCPP, " MGNetConnection::sharedConnection()->unregisterCmdHandler(this);\n");
    }
    fprintf(pfCPP, "}\n\n");
    fprintf(pfCPP, "bool %s::init()\n", g_strClassName.c_str());
    fprintf(pfCPP, "{\n");
    fprintf(pfCPP, " if (Layer::init())\n");
    fprintf(pfCPP, " {\n");
    if(bcsd)
    {
        if (g_bUI)
        {
            fprintf(pfCPP, " _%s = dynamic_cast<%s*>(CSLoader::createNode(\"%s\"));\n", pstProp->name.c_str(), pstProp->classname.c_str(), strFileName.c_str());
            fprintf(pfCPP, " this->addWidget(_%s);\n\n\n", pstProp->name.c_str());
        }
        else
        {
        }
    }
    else
    {
        if (g_bUI)
        {
            fprintf(pfCPP, " _%s = dynamic_cast<Layout*>(extension::GUIReader::shareReader()->widgetFromJsonFile(\"%s\"));\n", pstProp->name.c_str(), strFileName.c_str());
            fprintf(pfCPP, " this->addWidget(_%s);\n\n\n", pstProp->name.c_str());
        }
        else
        {
            fprintf(pfCPP, " _%s = dynamic_cast<CCNode*>(extension::SceneReader::sharedSceneReader()->createNodeWithSceneFile(\"%s\"));\n", pstProp->name.c_str(), strFileName.c_str());
            fprintf(pfCPP, " this->addChild(_%s);\n\n\n", pstProp->name.c_str());
        }
    }
    Write2InitCpp("", pstProp, true);
    fprintf(pfCPP, " return true;\n");
    fprintf(pfCPP, " }\n");
    fprintf(pfCPP, " return false;\n");
    fprintf(pfCPP, "}\n\n");
    if(bNet)
    {
        fprintf(pfCPP, "bool %s::canProcess(ActionCode_t code)\n", g_strClassName.c_str());
        fprintf(pfCPP, "{\n");
        fprintf(pfCPP, " return true;\n");
        fprintf(pfCPP, "}\n\n");
        fprintf(pfCPP, "void %s::proccessDatas(MGNetDataReader * reader)\n", g_strClassName.c_str());
        fprintf(pfCPP, "{\n\n");
        fprintf(pfCPP, "}\n\n");
        fprintf(pfCPP, "void %s::netSendDatasFailed(MGNetDataWriter * writer)\n", g_strClassName.c_str());
        fprintf(pfCPP, "{\n\n");
        fprintf(pfCPP, "}\n\n");
    }
    WritePropFun2Cpp("", pstProp);
    return true;
}


int _tmain(int argc, _TCHAR* argv[])
{
    if(argc < 2)
    {
        cout << "Usage:" << argv[0] << " [ExportJson file path] " << " [net -n]" << endl;
        return -1;
    }
    if(argc >= 3)
    {
        string strNet = argv[2];
        if(strNet == "-n")
        {
            bNet = true;
        }
    }
    string _path = (char*)argv[1];
    size_t pos = _path.find_last_of(‘\\‘);
    g_path = _path.substr(0, pos + 1);
    if (g_path == "")
    {
        g_path = DWGetModulePath();
    }
    pos = _path.find_last_of(‘.‘);
    std::string suffix = _path.substr(pos + 1, _path.length());
    if(suffix == "json")
    {
        g_bUI = false;
        SNodeProp *pstProp = new SNodeProp;
        LoadSceneJson(_path, pstProp);
        Write2H(_path, pstProp);
        Write2Cpp(_path, pstProp);
    }
    else if (suffix == "ExportJson")
    {
        g_bUI = true;
        SNodeProp *pstProp = new SNodeProp;
        LoadUIJson(_path, pstProp);
        Write2H(_path, pstProp);
        Write2Cpp(_path, pstProp);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

cocos2dx导出的json转c++代码

标签:

原文地址:http://blog.csdn.net/asita88/article/details/48053823

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!