Cocos2d x 意外属性:';最大长度';!在我将自定义属性添加到CocosBuilder中的自定义类之后

Cocos2d x 意外属性:';最大长度';!在我将自定义属性添加到CocosBuilder中的自定义类之后,cocos2d-x,cocosbuilder,Cocos2d X,Cocosbuilder,在CocosBuilder中,我有一个名为TextInput的自定义类用于用户输入,然后我想添加一个max_length值来限制用户输入的长度 如下所示: 但是当我运行时,我得到了以下错误: Cocos2d: Unexpected property: 'max_length'! 我尝试添加int max\u length输入TextInput.h。但一切都没有改变 这是我的相关代码 TextInput.h #ifndef __CrossKaiser__TextInput__ #define

在CocosBuilder中,我有一个名为
TextInput
的自定义类用于用户输入,然后我想添加一个
max_length
值来限制用户输入的长度

如下所示:

但是当我运行时,我得到了以下错误:

Cocos2d: Unexpected property: 'max_length'!
我尝试添加
int max\u length
输入
TextInput.h
。但一切都没有改变

这是我的相关代码

TextInput.h

#ifndef __CrossKaiser__TextInput__
#define __CrossKaiser__TextInput__

#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;
using namespace cocos2d::extension;

class TextInput : public CCTextFieldTTF
{
public:
    CREATE_FUNC(TextInput);

    TextInput();
    virtual ~TextInput();

    virtual bool init();
    virtual void onEnter();
    virtual void insertText(const char * text, int len);
    virtual void deleteBackward();
    int max_length;

};
#endif 
#ifndef __CrossKaiser__TextInputLoader__
#define __CrossKaiser__TextInputLoader__

#include "TextInput.h"

/* Forward declaration. */
class CCBReader;
class TextInputLoader : public cocos2d::extension::CCLabelTTFLoader{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(TextInputLoader, loader);

protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(TextInput);
};

#endif
TextInputLoader.h

#ifndef __CrossKaiser__TextInput__
#define __CrossKaiser__TextInput__

#include "cocos2d.h"
#include "cocos-ext.h"
using namespace cocos2d;
using namespace cocos2d::extension;

class TextInput : public CCTextFieldTTF
{
public:
    CREATE_FUNC(TextInput);

    TextInput();
    virtual ~TextInput();

    virtual bool init();
    virtual void onEnter();
    virtual void insertText(const char * text, int len);
    virtual void deleteBackward();
    int max_length;

};
#endif 
#ifndef __CrossKaiser__TextInputLoader__
#define __CrossKaiser__TextInputLoader__

#include "TextInput.h"

/* Forward declaration. */
class CCBReader;
class TextInputLoader : public cocos2d::extension::CCLabelTTFLoader{
public:
    CCB_STATIC_NEW_AUTORELEASE_OBJECT_METHOD(TextInputLoader, loader);

protected:
    CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(TextInput);
};

#endif

所以我的问题是,使用“自定义属性”功能的正确方法是什么?

我首先通过查看
Cocos2d:Unexpected属性“max_length”的位置来解决这个问题错误消息来自

它位于
CCNodeLoader.cpp

#define PROPERTY_TAG "tag"

void CCNodeLoader::onHandlePropTypeInteger(CCNode * pNode, CCNode * pParent, CCString * pPropertyName, int pInteger, CCBReader * pCCBReader) {
    if(pPropertyName->compare(PROPERTY_TAG) == 0) {
        pNode->setTag(pInteger);
    } else {
        ASSERT_FAIL_UNEXPECTED_PROPERTY(pPropertyName);
    }
}
从这段代码中,我们可以看到它只处理“tag”属性,而所有其他属性都将抛出断言

所以我认为我可以重写这个方法,在这个方法中我可以处理我自己的新自定义属性

因此,我在我的
TextInputLoader.cpp
中添加了一个覆盖方法:

#define PROPERTY_MAX_LENGTH "max_length"

void TextInputLoader::onHandlePropTypeInteger(CCNode * pNode, CCNode * pParent, CCString * pPropertyName, int pInteger, CCBReader * pCCBReader)
{
    if(pPropertyName->compare(PROPERTY_TAG) == 0) {
        pNode->setTag(pInteger);
    }
    else if (pPropertyName->compare(PROPERTY_MAX_LENGTH) == 0){
        ((TextInput*)pNode)->setMaxLength(pInteger);
    }
    else {
        ASSERT_FAIL_UNEXPECTED_PROPERTY(pPropertyName);
    }
}
然后在我的
TextInput.h
中添加一个属性:

CC_SYNTHESIZE(unsigned int, m_max_length, MaxLength);
它确实起了作用。我的问题解决了

顺便说一下,这里我只覆盖处理整数的
onHandlePropTypeInteger

如果有人想要其他类型的自定义属性,他可以覆盖
CCNodeLoader.cpp
中匹配的方法,例如
onHandlePropTypeString
onHandlePropTypeFloat