cocos2d-x 输入框 简单实现

来源:互联网 发布:手写识别 算法 编辑:程序博客网 时间:2024/06/05 08:05

//////////////////////////////////////2013-09-14更新\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我记得我新手的时候,输入框的实现感觉非常困难,也一直用别人写好的输入框,但是最近由于项目的一些要求,

要做些改进。发现之前他们写的代码太乱,很多代码都可以省略,并且有很多bug,如:点击文本框,光标没有出现,并且不能输入,要点到特别的地方,因此,想简单实现一个输入框。

我主要实现的功能:

1): 带光标,参考网上的人写的

2): 密码框

3): 输入框中是否含有中文

4): 还有一些简单的设置最大宽度,得到输入框的值等等;


还是看代码:

.h文件中

#pragma once#include "cocos2d.h"USING_NS_CC;using namespace std;class NQTextField : public CCTextFieldTTF, public CCTextFieldDelegate, public CCTouchDelegate{public:  NQTextField();  ~NQTextField();  public:// staticstatic NQTextField* textFieldWithPlaceHolder(const char *placeholder, const char *fontName, float fontSize);// CCLayervoid onEnter();void onExit();bool init();// 初始化光标精灵void initCursorSprite(int mHeight);// CCTextFieldDelegatevirtual bool onTextFieldInsertText(CCTextFieldTTF * pSender, const char * text, int nLen);virtual bool onTextFieldDeleteBackward(CCTextFieldTTF * pSender, const char * delText, int nLen);// CCLayer Touchbool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);// 打开输入法void openIME();// 关闭输入法void closeIME();private://光标CCSprite* m_pCursorSprite;//字体大小float fontHeight;//输入框的宽度float inputFrameWidth;//输入框的内容string *m_pInputText;//用户写入的placeholderstd::string m_placeholder;//是否为密码框bool m_bPassword;//密码字符串*std::string str_password;//存储输入框中字母的字节,用于判断是否为中文vector<int> vec_len;//输入字符的最大长度int m_maxInputWidth;//字符的计数int m_inputFlag;//是否含有非法字符public://设置为密码框void setPassword( bool isPasswrod = true );//设置点击区域的宽度 默认宽度200void setInputFrameWidth( float newWidth );//设置输入框的内容void setInputText( std::string newInputText );//得到输入框的内容const char* getInputText();//设置可以输入的最多字符数void setMaxInputWidth(int newMaxInputWidth);//判断是否为中文bool isChinese();//得到输入框的长度int getInputWidth();};

.cpp中

#include "NQTextField.h"using namespace cocos2d;using namespace std;NQTextField::NQTextField(void){CCTextFieldTTF();}NQTextField::~NQTextField(void){}NQTextField* NQTextField::textFieldWithPlaceHolder( const char *placeholder, const char *fontName, float fontSize ){NQTextField *pRet = new NQTextField();if(pRet && pRet->initWithString("", fontName, fontSize)){pRet->autorelease();if (placeholder){pRet->setPlaceHolder(placeholder);}pRet->init();pRet->initCursorSprite(fontSize);pRet->setHorizontalAlignment(kCCTextAlignmentLeft);return pRet;}CC_SAFE_DELETE(pRet);return NULL;}void NQTextField::onEnter(){CCTextFieldTTF::onEnter();//设置点击代理CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,false);this->setDelegate(this);}void NQTextField::onExit(){CCTextFieldTTF::onExit();//销毁点击代理CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);}bool NQTextField::init(){//必须设置锚点(0,0);this->setAnchorPoint(CCPointZero);//输入框宽度inputFrameWidth = 200;//初始化m_pInputText = NULL;//得到placeholderm_placeholder = getPlaceHolder();//不是密码框m_bPassword = false;//密码框字符为空str_password = "";//最多可以输入字符,默认10m_maxInputWidth = 30;//计数默认为0m_inputFlag = 0;return true;}//初始化光标void NQTextField::initCursorSprite( int mHeight ){const int column = 1;const int nHeight = (const int)mHeight;int pixels[50][column];for (int i=0; i<nHeight; ++i) {for (int j=0; j<column; ++j) {//pixels[i][j] = 0xffffffff;pixels[i][j] = 0x00000000;}}//创建光标精灵CCTexture2D *texture = new CCTexture2D();texture->initWithData(pixels, kCCTexture2DPixelFormat_RGB888, 1, 1, CCSizeMake(column, nHeight));m_pCursorSprite = CCSprite::createWithTexture(texture);m_pCursorSprite->setPosition(ccp(0, mHeight / 2));this->addChild(m_pCursorSprite);m_pCursorSprite->setVisible(false);CCActionInterval* 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();//设置字体高度fontHeight = mHeight*1.0f;}//插入文本bool NQTextField::onTextFieldInsertText( CCTextFieldTTF * pSender, const char * text, int nLen ){//计数超过最大输入字符数,不能插入if (m_inputFlag > m_maxInputWidth){return true;}//屏蔽回车输入if(text[0] == '\n')return true;//存储字节vec_len.push_back(nLen);//计数加一m_inputFlag++;//输入框总内容添加m_pInputText->append(text);//文本框显示字符setString(m_pInputText->c_str());//当前字符的长度float textWidth = getContentSize().width;//判断是否为密码框if (m_bPassword){str_password.append("*");setString(str_password.c_str());}//设置光标位置if (m_pInputText->empty()){m_pCursorSprite->setPositionX(0);}else{m_pCursorSprite->setPositionX(getContentSize().width);}return true;}bool NQTextField::onTextFieldDeleteBackward( CCTextFieldTTF * pSender, const char * delText, int nLen ){//将总字符串长度减去nLen字节长m_pInputText->resize(m_pInputText->size() - vec_len[vec_len.size()-1]);//存储字节减一vec_len.resize(vec_len.size()-1);//计数减一m_inputFlag--;//文本框显示字符setString(m_pInputText->c_str());//CCLOG("m_pInputText: %s",delText);//当前字符的长度float textWidth = getContentSize().width;//判断是否为密码框if (m_bPassword){str_password.resize(str_password.size()-1);setString(str_password.c_str());}//设置光标位置if (m_pInputText->empty()){setPlaceHolder("");m_pCursorSprite->setPositionX(0);}else{m_pCursorSprite->setPositionX(getContentSize().width);}return true;}bool NQTextField::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent ){CCPoint touchPoint = convertTouchToNodeSpace(pTouch);// 判断是打开输入法还是关闭输入法if (CCRectMake(0, 0, inputFrameWidth, fontHeight).containsPoint(touchPoint)){openIME();}else{closeIME();}return true;}//打开光标和输入法void NQTextField::openIME(){if (m_pInputText->empty()){setPlaceHolder("");}m_pCursorSprite->setVisible(true);this->attachWithIME();}//关闭光标和输入法void NQTextField::closeIME(){if (m_pInputText->empty()){setPlaceHolder(m_placeholder.c_str());}m_pCursorSprite->setVisible(false);this->detachWithIME();}//判断是否为中文bool NQTextField::isChinese(  ){for (int i=0;i<vec_len.size();i++){//CCLog("vec_len[%d]: %d",i,vec_len[i]);if (vec_len[i]>1){return true;}}return false;}//设置密码void NQTextField::setPassword( bool isPasswrod ){m_bPassword = isPasswrod;}void NQTextField::setInputFrameWidth( float newWidth ){inputFrameWidth = newWidth;}void NQTextField::setInputText( std::string newInputText ){m_pInputText->append(newInputText.c_str());}const char* NQTextField::getInputText(){return m_pInputText->c_str();}void NQTextField::setMaxInputWidth( int newMaxInputWidth ){m_maxInputWidth = newMaxInputWidth;}int NQTextField::getInputWidth(){int sum = 0;for (int i=0;i<vec_len.size();i++){if (vec_len[i]>1){sum = sum + 2;}else{sum = sum + 1;}}return sum;}

大体功能都实现好了。。。



原创粉丝点击