您的位置:首页 > 移动开发 > Cocos引擎

屌丝小飞的cocos2d-x之路-光标输入框

2014-09-16 23:44 375 查看
经历了很多事情,我决定把我学习的经历写下来,用来温故知新,作为学生可能了解知识不那么到位,如果有什么差错,请校正。由于cocos2dx是模仿cocos2d-iPhone,所以里面的代码是偏向于Object C的C++,刚刚开始着手于cocos2dx的时候觉得怪怪的,后来就好多了,今晚突然想写写,就从前几天朋友叫我写输入框还要光标开始吧;

打开cocos2dx 对于学生而言我使用的是2.2.2版本。没有着手于使用3,x 打开cocos2dx的tool, 创建一个新的项目名为 review_1 , cocos2dx自带有输入框的类CCTextFieldTTF,这个类继承CCLabelTTF哦;由于CCTextFieldTTF由cocos2dx封装好了,留出了几个很好使用的接口,若有兴趣去研究cocos2dx底层的源代码欢迎找我一起研究。下面说说这两个常用接口的函数

bool attachWithIME() // 激活输入法

bool detachWithIME() // 取消输入法

光是这个类是不够的,还需要一个代理类CCTextFieldDelegate来协助CCTextFieldTTF;CCTextFieldDelegate类的常用4个接口函数

virtual bool onTextFieldAttchWithIME(TextFieldTTF* sender) // 激活输入框之前调用改函数

virtual bool onTextFieldDetchWithIME(TextFieldTTF* sender); // 取消输入框之前调用改函数

virtual bool onTextFieldInsertText(TextFieldTTF* sender,const char* text, int nlen); // 插入字符的时候调用该函数;

virtual bool onTextFieldDeleteBackward(TextFieldTTF* sender, const char* text int nlen);// 删除字符的时候调用该函数;

好了,让我们使用这些函数来书写我们输入框的篇章吧(鉴于第一次写,代码还是一个一个敲,不复制原来写的代码了)

#ifndef __REVIEW_ONE__

#define __REVIEW_ONE__

#include "cocos2d"

#include "iostream"

using namespace std;

US_NS_CC;

class review_one :public CCLayer

{

public:

static CCScene* scene();

virtual bool init();

CREATE_FUNC(review_one);

void drawCursor(int Curs_h,int Curs_c);// 初始化一个光标

virtual void ccTouchesEnded(CCSet* pTouch,CCEvent* pEvent);

virtual bool TextFieldAttchWithIME();

virtual bool TextFieldDetachWithIME();

virtual bool TextFieldInsertText(CCTextFieldTTF* sender, const char* text, int nlen);// 添加字符时光标移动的实现;

virtual bool TextFieldDeleteBackward(CCTextFieldTTF* sender,const char* text, int nlen);

private:

string input_String;

CCSprite* Curs_Sp;

};

#endif

CPP 文件:

#include "review_one.h"

CCScene* review_one:: scene()

{

CCScene* scene=CCScene::create();

review_one* layer=review_one::create();

scene->addChild(layer);

return scene();

}

bool review_one:: init()

{

if(CCLayer::init())

{

return false;

}

CCSize visibleSize=CCDirector::sharedDirector()->getvisibleSize();

input_String="xiaofei";

CCTextFieldTTF* input=CCTextFieldTTF::textFieldWithPlaceHolder(input_String.c_str(),"arial",60);

input->setPosition(ccp(visibleSize.width/2,visibleSize.height/2));

input->setTag(1);

this->addChild(input);

Curs_Sp->setPosition(ccp(visibelSize.width/2+(textfield->getContentSize().width/2),visibleSize.height));

this->setDelegate(this);

this->drawCursor(50,4);

return true;

}

void review_one:: ccTouchedEnded(CCSet* pTouch,CCEvent* pEvent)

{

CCTextFieldTTF* input_ime=dynamic_cast<CCTextFieldTTF*>(this->getChildByTag(1));

if(!input_ime->attchWithIME())

{

input_ime->attchWithIME();

{

else

input_ime->detchWithIME();

}

void review_one:; drawCursor(int Curs_h,int Curs_c)

{

int **a=new int *[Curs_h];

for(int i=0;i<Curs_h;i++)

{

a[i]=new int [Curs_c]

}

for(int i=0;i<Curs_h,;++)

for(int j=0;j<Curs_c;j++)

{

a[i][j]=0xffffffff;

}

CCTexture2D* curs_tex=new Texture2D();

curs_tex->initWithData(a,kCCTexture2DPixelFormat_RGB888,1,1CCSizeMake(Curs_c,Curs_h));

Curs_Sp=CCSprite::createWithTexture(curs_tex);

this->addChild(Curs_Sp);

CCRepeatForever* forever=CCRepeatForever::create(CCBlink::create(5,5));

Curs_Sp->runAction(forever);

for(int i=0;i<Curs_h;i++)

{

delete[] a[i];

}

delete [] a;

curs_tex->release();

}

bool review_one:: onTextFieldInsertText(CCTextFieldTTF* sender, const char* text, int nlen)

{

CCSize size=CCDirector::shardDirector()->getvisibleSize();

CCTextField* textfield=dynamic_cast<CCTextFieldTTF*>(this->getChildByTag(1));

input_String.append(text);

textfield->setString(input_String.c_str());

Curs_Sp->setPosition(ccp(size.width/2+(textfield->getContentSize().width/2),size.height));

return false;

}

bool review_one:: onTextFieldDeleteBackward(CCTextFieldTTF* sender, const char* text, int nlen)

{

CCSize size=CCDirector::shardDirector()->getvisibleSize();

CCTextField* textfield=dynamic_cast<CCTextFieldTTF*>(this->getChildByTag(1));

input_String.resize(input_String.size()-nlen);

textfield->setString(input_String.c_str());

Curs_Sp->setPosition(ccp(size.width/2+(textfield->getContentSize().width/2),size.height));

if(input_String.empty())

{

Curs_Sp->setPosition(ccp(size.width/2,size.height));

}

}

看看时间,一点多快两点了,就写在这儿把,如果有什么其他好的办法欢迎骚扰 QQ 249435196,欢迎学习交流。如果有借鉴的情况希望也指出来,一定改。 下次在说组件的事情嗯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: