1

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

だから私の質問は、「カスタムプロパティ」機能を使用する正しい方法は何ですか?

4

1 に答える 1

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);
    }
}

このコードから、 「タグ」プロパティのみを処理し、他のすべてのプロパティがアサートをスローすることがわかります。

だから私が思ったのは、自分の新しいカスタムプロパティを処理できるこのメソッドをオーバーライドできるということです。

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ます。onHandlePropTypeStringonHandlePropTypeFloat

于 2013-03-11T07:08:58.117 に答える