在CocosBuilder中,我有一个名为TextInput
的自定义类用于用户输入,然后我想添加max_length
值来限制用户输入的长度。
如下所示:
但是当我跑步时,我收到以下错误:
Cocos2d: Unexpected property: 'max_length'!
我尝试将int max_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
TextInputLoader.h
#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
所以我的问题是使用'自定义属性'功能的正确方法是什么?
答案 0 :(得分:0)
首先查看Cocos2d: Unexpected property: '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
等等。