如何在CCTextFieldTTF中插入文本?

时间:2013-12-25 08:43:12

标签: cocos2d-x

我使用了setString但是字符串没有更新,所以我必须写一个CCLabel来显示字符串,我觉得很奇怪,因为显示用户输入应该是文本字段的一部分。我错过了什么吗? 我读了test_input示例,它使用CCLabel来显示用户输入,我认为这是一个非常糟糕的设计。

3 个答案:

答案 0 :(得分:1)

您不需要标签来显示用户输入。

我已经使用添加的CCTextFieldttf工作示例编辑了默认的HelloWorld文件。

这是HelloWorld.h文件的外观

class HelloWorld : public cocos2d::CCLayer, public cocos2d::CCTextFieldDelegate
{
public:

    virtual bool init();

    static cocos2d::CCScene* scene();

    void createTF();
    cocos2d::CCTextFieldTTF* tf;

    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void registerWithTouchDispatcher();

    //CCtextFieldttf delegate begin
    virtual bool onTextFieldAttachWithIME(CCTextFieldTTF * pSender);
    virtual bool onTextFieldDetachWithIME(CCTextFieldTTF * pSender);
    virtual bool onTextFieldInsertText(CCTextFieldTTF * pSender, const char * text, int nLen);
    virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * pSender, const char * delText, int nLen);
    virtual bool onDraw(CCTextFieldTTF * pSender);
    //CCtextFieldttf delegate end

    CREATE_FUNC(HelloWorld);
};

这就是你的HelloWorld.cpp应该如何最小化CCTextFieldttf的使用

CCScene* HelloWorld::scene()
{
    // 'scene' is an autorelease object
    CCScene *scene = CCScene::create();

    // 'layer' is an autorelease object
    HelloWorld *layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    if ( !CCLayer::init() )
    {
        return false;
    }

    this->setTouchEnabled(true);

    CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
    CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();

    createTF();

    CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);

    // position the label on the center of the screen
    pLabel->setPosition(ccp(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - pLabel->getContentSize().height));

    this->addChild(pLabel, 1);

    return true;
}

void HelloWorld::createTF()
{
    tf = CCTextFieldTTF::textFieldWithPlaceHolder("123", CCSizeMake(100, 100), kCCTextAlignmentCenter, "helvetica", 20);
    tf->setColorSpaceHolder(ccWHITE);
    tf->setPosition(ccp(200,200));
    tf->setHorizontalAlignment(kCCTextAlignmentCenter);
    tf->setVerticalAlignment(kCCVerticalTextAlignmentCenter);
    tf->setDelegate(this);
    addChild(tf);
}

void HelloWorld::registerWithTouchDispatcher()
{
    CCDirector* pDirector = CCDirector::sharedDirector();
    pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);
}

bool HelloWorld::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLog("inside touchbegan");

    return true;
}

void HelloWorld::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{
    CCLog("inside touchend");

    tf->attachWithIME();

}


bool HelloWorld::onTextFieldAttachWithIME(CCTextFieldTTF * pSender)
{

    return false;

}

bool HelloWorld::onTextFieldDetachWithIME(CCTextFieldTTF * pSender)
{
    return false;
}

bool HelloWorld::onTextFieldInsertText(CCTextFieldTTF * pSender, const char * text, int nLen)
{
    return false;
}

bool HelloWorld::onTextFieldDeleteBackward(CCTextFieldTTF * pSender, const char * delText, int nLen)
{
    return false;
}

bool HelloWorld::onDraw(CCTextFieldTTF * pSender)
{
    return false;
}

实现CCTextFieldDelegate方法以获得对输入CCTextFieldTTF的内容的更多控制。 CCTextFieldttf唯一缺少的是你必须自己调用CCTextFieldTTF的attachWithIME()方法,就像上面的代码一样,它在“ccTouchEnded”中被调用。

答案 1 :(得分:0)

CCTextFieldTTF * pTextField = CCTextFieldTTF::textFieldWithPlaceHolder("click here for input",
    "Thonburi",
    20);

addChild(pTextField);

答案 2 :(得分:0)

标题

中的

class CustomMultiplayerScene : public PZGBaseMenuScene,public CCIMEDelegate
{

    public:    
        void keyboardWillShow(cocos2d::CCIMEKeyboardNotificationInfo &info);
        void keyboardWillHide(cocos2d::CCIMEKeyboardNotificationInfo &info);
        void ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
    };

in .cpp

    CCTextFieldTTF *textfield = CCTextFieldTTF::textFieldWithPlaceHolder("Enter Name:", CCSize(480,30), kCCTextAlignmentCenter, "Arial", 12);
//    textfield->setAnchorPoint(CCPointZero);
    textfield->setPosition(ccp(screenSize.width/2,200));
    textfield->setTag(100);
    this->addChild(textfield,4);

    CCLabelTTF *label = CCLabelTTF::create("ID : ", "", 12);
    label->setPosition(ccp(screenSize.width/2,100));
    label->setTag(200);
    this->addChild(label,4);

在.cpp

中实现方法
void CustomMultiplayerScene::keyboardWillShow(CCIMEKeyboardNotificationInfo &info)
{
    CCLOG("keyboardWillShow");

    CCTextFieldTTF *textfield = (CCTextFieldTTF *)this->getChildByTag(100);
    textfield->setString("");
}

void CustomMultiplayerScene::keyboardWillHide(CCIMEKeyboardNotificationInfo &info)
{
    CCLog("keyboardWillHide");

    CCTextFieldTTF *textfield = (CCTextFieldTTF *)this->getChildByTag(100);
    CCLabelTTF *label = (CCLabelTTF *)this->getChildByTag(200);

    label->setString(textfield->getString());
}

void CustomMultiplayerScene::ccTouchesBegan(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent)
{
    CCTouch *pTouch = (CCTouch *)pTouches->anyObject();
    CCPoint point = pTouch->getLocationInView();
    point = CCDirector::sharedDirector()->convertToGL(point);

    CCTextFieldTTF *textfield = (CCTextFieldTTF *)this->getChildByTag(100);
    CCRect rect = textfield->boundingBox();

    if(rect.containsPoint(point)) {
        textfield->attachWithIME();
    }
}