1、为什么写这篇博文
这是我在优快云上面写得第一篇博客呢,至于我为什么写这一篇博客呢?或许很大一部分是因为感觉很新鲜吧,当然其他的原因也有啊,比如,这样的话自己写得东西当误删或者什么的弄丢了的话,再就可以很轻松的从优快云上面找到。好了,简介就这样吧。
2、为什么要把cocos-2dx带触摸控制输入框写上来
我现在在初学cocos2d-x的内容,其中很多的东西都还不是很清楚,所以在网上也找了很多关于输入框的写法的内容,这里有一处很好的。http://blog.youkuaiyun.com/onerain88/article/details/7572315,感谢oneRain的分享。我从这里下的Demo里面学到了很多,不过或许是cocos2d-x的版本更新的缘故(我用的是cocos2d-x 2.2.3),那份源码会报错,但是里面的一些思想、写法什么的还是给了我很多的启示。然后,我又搜了很多其他的内容,因为我是初学,所以学的很慢,终于弄出了一个带触摸控制的输入框,当然了,我也把光标加进去了。
3、CursorInputLayer类
我直接把我写的一些主要的源码放在这里,因为有一些关于CCTextFieldTTF基本的知识点我贴出的那个oneRain的链接或者网上都有,我这里便不赘述了。我这里名字叫CursorInputLayer,但并没有起到Layer 的功能,名字请不要介意,我后期会改过来的。
首先是CursorInputLayer.h里面的东西。
//CCTextFieldTTF是输入框的,CCTextFieldDelegate是输入框监听器的,CCTouchDelegate是触摸控制的(或许说法不是很准确,希望好懂)
class CursorInputLayer : public CCTextFieldDelegate , public CCTextFieldTTF, public CCTouchDelegate
{
private:
CCPoint m_beginPos;
//获取输入的文字,我还没有写这个功能,看以后有时间补上没有
// std::string *m_pInputText;
public:
CursorInputLayer();
~CursorInputLayer();
void onEnter();
void onExit();
void initCursorSprite();
CCRect getRect();
bool isInTextField(cocos2d::CCTouch* pTouch);
static CursorInputLayer* textFieldWithPlaceHolder(const char *placeholder, const char *fontName, float fontSize);
//当用户点开虚拟键盘的回调函数
virtual bool onTextFieldAttachWithIME(CCTextFieldTTF * sender);
//当用户关闭虚拟键盘的时候回调函数
virtual bool onTextFieldDetachWithIME(CCTextFieldTTF * sender);
//当用户进行输入,虚拟键盘的时候回调函数
virtual bool onTextFieldInsertText(CCTextFieldTTF * sender, const char * text, int nLen);
//当用户进行删除文字,虚拟键盘的时候回调函数
virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * sender, const char * delText, int nLen);
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
//打开虚拟键盘
void openIME();
//关闭虚拟键盘
void closeIME();
};
再就是CursorInputLayer.cpp.我只把一些我看那篇博客容易错,或者说我觉得容易错的内容贴出来。
bool CursorInputLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
m_beginPos = pTouch->getLocationInView();
m_beginPos = CCDirector::sharedDirector()->convertToGL(m_beginPos);
return true;
}
bool CursorInputLayer::isInTextField(cocos2d::CCTouch* pTouch)
{
//这里我先不是很会写,后来终于找到了这样的写法
return getRect().containsPoint(convertTouchToNodeSpaceAR(pTouch));
}
void CursorInput::initCursorSprite()
{
int column = 4;
int nHeight = 20;
int pixels[20][4];
for (int i=0; i<nHeight; ++i)
{
for (int j=0; j<column; ++j)
{
pixels[i][j] = 0xffffffff;
}
}
CCTexture2D* texture = new CCTexture2D();
texture->initWithData(pixels, kCCTexture2DPixelFormat_RGB888, 1, 1, CCSizeMake(column, nHeight));
m_pCursorSprite = CCSprite::createWithTexture(texture);
CCSize winSize = getContentSize();
m_pCursorSprite->setPosition(ccp(0, winSize.height / 2));
this->addChild(m_pCursorSprite);
m_pCursorSprite->setVisible(false);
// m_pCursorAction = CCRepeatForever::initWithAction((CCActionInterval *) CCSequence::create(initWithDuration(0.25f), CCFadeIn::initWithDuration(0.25f), NULL));
m_pCursorAction = CCRepeatForever::create((CCActionInterval *) CCSequence::create(CCFadeOut::create(0.25f), CCFadeIn::create(0.25f), NULL));
m_pCursorSprite->runAction(m_pCursorAction);
m_pInputText = new std::string();
}
关于onEnter(),onExit()的调用顺序,请自行搜索,我也解释不好。
void CursorInputLayer::onEnter()
{
CCTextFieldTTF::onEnter();
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0 , false);
//注册监听器写在这里
this->setDelegate(this);
}
4、LoginScene类
在LoginScene.cpp里面实例化一个CursorInputLayer并添加。其中m_pCursorInputLayer的锚点我本来是设置成ccp(0.5f, 0.5f)的,但是光标的位置不对,就设置成ccp(0.0f, 0.0f)了,不过这也有一个小问题,那就是点击左边一点的时候也可以输入。
CursorInputLayer *m_pCursorInputLayer = CursorInputLayer::textFieldWithPlaceHolder("click and input",
"Thonburi", 20);
m_pCursorInputLayer->setAnchorPoint(ccp(0.0f, 0.0f));
m_pCursorInputLayer->setPosition(ccp(origin.x + visibleSize.width * 1 /3 + 120, origin.y + visibleSize.height * 2 / 3));
this->addChild(m_pCursorInputLayer, 1);
5、总结
因为我这几天受这个问题所困扰,主要是不知道怎么把触摸与输入整合到一起,然后终于找到了解决的方法,便在这里分享给大家,功能比较简单,只是希望能给那些也恰巧受困如此的人一些帮助,并且这个排版也是我随意排的,希望大家见谅,截图的背景请无视吧,还有就是我只在win32下测试过,暂时还没有真机测试。
其中密码弄成密文形式我本来也写了一个函数的,但是后来自带了一个函数,只用一句话,我便舍弃了自己写得那个函数了。其中自带的那一句话是 m_pPasInput->setSecureTextEntry(true)。
最后附上源码,但是由于当时把这个带光标与一些其他优化写好的时候我并没有保存,后来也就直接在那上面添加了loading的简单效果,而且也添加了账号输入与登录的简单实现,所以我贴出来的源码也就是添加了那些功能的源码了,忘见谅。下次会记着把写得东西再备份一下的。
哦,最后还有个东西,如果它提示错了的话,那肯定是我用来存储输入的xml文件的问题了,你在Debug.win32里面把xml文件删掉再次运行就可以了。这个问题我暂时也还没有解决。
最简单触控输入框源码下载