cocos2d-x-3.1 文本输入框简单使用

        cocos2d-x-3.1 文本输入框简单使用 (coco2d-x 学习笔记九)

分类: cocos2d-x 466人阅读 评论(0) 收藏 举报

cocos2d-x提供2种可进行文本输入的方法,分别是TextFieldTTF及EditBox。本文将贴出这两种方法的简单使用代码,这里在使用EditBox时候使用了extensions的扩展库,读者需要自行添加引用到项目中,要不会出现找不到文件及编译不通过等错误,具体怎么添加及引用,我下篇文章则会给出答案。

http://blog.csdn.net/liu8297036/article/details/32381213

EditBox


EditBoxManager.h

  1. #ifndef EDIT_BOX_MANAGER
  2. #define EDIT_BOX_MANAGER
  3. #include "cocos2d.h"
  4. #include "extensions/cocos-ext.h"
  5. USING_NS_CC;
  6. USING_NS_CC_EXT;
  7. class EditBoxManager :public Layer, public EditBoxDelegate{
  8. public:
  9. EditBoxManager();
  10. //当编辑框获得焦点时将被调用
  11. virtual void editBoxEditingDidBegin(EditBox* editBox);
  12. //当编辑框失去焦点后将被调用
  13. virtual void editBoxEditingDidEnd(EditBox* editBox);
  14. //当编辑框内容发生改变将被调用
  15. virtual void editBoxTextChanged(EditBox* editBox, const std::string& text);
  16. //当编辑框的结束操作被调用
  17. virtual void editBoxReturn(EditBox* editBox);
  18. };
  19. void runEditBoxManager();
  20. #endif //EDIT_BOX_MANAGER
#ifndef EDIT_BOX_MANAGER
#define EDIT_BOX_MANAGER
#include "cocos2d.h"
#include "extensions/cocos-ext.h"

USING_NS_CC;
USING_NS_CC_EXT;

class EditBoxManager :public Layer, public EditBoxDelegate{
public:
	EditBoxManager();

	//当编辑框获得焦点时将被调用
	virtual void editBoxEditingDidBegin(EditBox* editBox);
	//当编辑框失去焦点后将被调用
	virtual void editBoxEditingDidEnd(EditBox* editBox);
	//当编辑框内容发生改变将被调用
	virtual void editBoxTextChanged(EditBox* editBox, const std::string& text);
	//当编辑框的结束操作被调用
	virtual void editBoxReturn(EditBox* editBox);
};

void runEditBoxManager();

#endif  //EDIT_BOX_MANAGER


EditBoxManager.cpp

  1. #include "EditBoxManager.h"
  2. #include "VisibleRect.h"
  3. #define FONT_NAME "fonts/Marker Felt.ttf"
  4. #define FONT_SIZE 26
  5. void runEditBoxManager(){
  6. auto scene = Scene::create();
  7. EditBoxManager* layer = new EditBoxManager;
  8. layer->autorelease(); //交给内存池进行管理
  9. scene->addChild(layer);
  10. Director::getInstance()->runWithScene(scene);
  11. }
  12. EditBoxManager::EditBoxManager(){
  13. auto s = Size(250, 50); //设置编辑框大小
  14. //Scale9Sprite类似android上的9图工具,可对图片进行拉伸而不失真
  15. auto m9pic= Scale9Sprite::create("Images/green_edit.png");
  16. auto mEditBox = EditBox::create(s, m9pic);
  17. mEditBox->setFontName(FONT_NAME); //编辑框文本字体
  18. mEditBox->setFontSize(FONT_SIZE); //编辑框文本大小
  19. mEditBox->setFontColor(Color3B::BLUE); //编辑框文本颜色
  20. mEditBox->setPlaceHolder("password:"); //编辑框提示语句
  21. mEditBox->setPlaceholderFontColor(Color3B::GRAY); //编辑框提示语句颜色
  22. mEditBox->setMaxLength(10); //编辑框文本长度
  23. mEditBox->setInputFlag(EditBox::InputFlag::PASSWORD);//编辑框文本框输入类型
  24. mEditBox->setInputMode(EditBox::InputMode::NUMERIC); //编辑框文本的输入模式
  25. mEditBox->setDelegate(this); //注册编辑框协议
  26. mEditBox->setPosition(VisibleRect::center());
  27. addChild(mEditBox);
  28. }
  29. void EditBoxManager::editBoxEditingDidBegin(EditBox* editBox){
  30. log("click");
  31. }
  32. void EditBoxManager::editBoxEditingDidEnd(EditBox* editBox){
  33. log("leave click");
  34. }
  35. void EditBoxManager::editBoxTextChanged(EditBox* editBox, const std::string& text){
  36. log("text change=%s", text.c_str());
  37. }
  38. void EditBoxManager::editBoxReturn(EditBox* editBox){
  39. log("returned");
  40. }
#include "EditBoxManager.h"
#include "VisibleRect.h"

#define FONT_NAME "fonts/Marker Felt.ttf"
#define FONT_SIZE 26

void runEditBoxManager(){
	auto scene = Scene::create();
	EditBoxManager* layer = new EditBoxManager;
	layer->autorelease();  //交给内存池进行管理
	scene->addChild(layer);

	Director::getInstance()->runWithScene(scene);
}

EditBoxManager::EditBoxManager(){

	auto s = Size(250, 50);  //设置编辑框大小
	//Scale9Sprite类似android上的9图工具,可对图片进行拉伸而不失真
	auto m9pic= Scale9Sprite::create("Images/green_edit.png");

	auto mEditBox = EditBox::create(s, m9pic);
	mEditBox->setFontName(FONT_NAME);		//编辑框文本字体
	mEditBox->setFontSize(FONT_SIZE);		//编辑框文本大小
	mEditBox->setFontColor(Color3B::BLUE);  //编辑框文本颜色
	mEditBox->setPlaceHolder("password:");  //编辑框提示语句
	mEditBox->setPlaceholderFontColor(Color3B::GRAY); //编辑框提示语句颜色
	mEditBox->setMaxLength(10);             //编辑框文本长度
	mEditBox->setInputFlag(EditBox::InputFlag::PASSWORD);//编辑框文本框输入类型
	mEditBox->setInputMode(EditBox::InputMode::NUMERIC); //编辑框文本的输入模式
	mEditBox->setDelegate(this);            //注册编辑框协议
	mEditBox->setPosition(VisibleRect::center());
	addChild(mEditBox);
}

void EditBoxManager::editBoxEditingDidBegin(EditBox* editBox){
	log("click");
}
void EditBoxManager::editBoxEditingDidEnd(EditBox* editBox){
	log("leave click");
}
void EditBoxManager::editBoxTextChanged(EditBox* editBox, const std::string& text){
	log("text change=%s", text.c_str());
}
void EditBoxManager::editBoxReturn(EditBox* editBox){
	log("returned");
}


TextFieldTTF


TextFieldTTF则比EditBox使用方式要复杂的多,可以进行自定义输入等,本文只实现简单的文本输入,如果读者要自己定制复杂动画等操作可以借鉴官方例子。


TextFiledTTFManager.h

  1. #ifndef TEXT_FILED_TTF_MANAGER
  2. #define TEXT_FILED_TTF_MANAGER
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class keyBoradNotificationLayer :public Layer,public IMEDelegate
  6. {
  7. public:
  8. keyBoradNotificationLayer();
  9. //进行点击
  10. virtual void onClickTrackNode(bool b)=0;
  11. //键盘显示的时候执行的通知方法
  12. virtual void keyboardWillShow(IMEKeyboardNotificationInfo& info);
  13. virtual bool onTouchBegan(Touch *touch, Event *_event);
  14. virtual void onTouchEnded(Touch *touch, Event *_event);
  15. protected:
  16. Node* _trackNode; //被选中的对象节点
  17. Vec2 _beganPos; //开始点击区域
  18. };
  19. class TextFiledTTFTest :public keyBoradNotificationLayer{
  20. virtual void onClickTrackNode(bool b);
  21. virtual void onEnter(); //被载入场景时候调用
  22. };
  23. void runTextFiledTTFManager();
  24. #endif //EDIT_BOX_MANAGER
#ifndef TEXT_FILED_TTF_MANAGER
#define TEXT_FILED_TTF_MANAGER
#include "cocos2d.h"

USING_NS_CC;

class keyBoradNotificationLayer :public Layer,public IMEDelegate
{
public:
	keyBoradNotificationLayer();

	//进行点击
	virtual void onClickTrackNode(bool b)=0;

	//键盘显示的时候执行的通知方法
	virtual void keyboardWillShow(IMEKeyboardNotificationInfo& info);

	virtual bool onTouchBegan(Touch *touch, Event *_event);
	virtual void onTouchEnded(Touch *touch, Event *_event);

protected:
	Node* _trackNode;  //被选中的对象节点
	Vec2 _beganPos;    //开始点击区域
};


class TextFiledTTFTest :public keyBoradNotificationLayer{

	virtual void onClickTrackNode(bool b);

	virtual void onEnter();  //被载入场景时候调用
};

void runTextFiledTTFManager();

#endif //EDIT_BOX_MANAGER

TextFiledTTFManager.cpp

  1. #include "TextFiledTTFManager.h"
  2. #include "VisibleRect.h"
  3. #define FONT_NAME "fonts/Marker Felt.ttf"
  4. #define FONT_SIZE 36
  5. static Rect getRect(Node* node){
  6. Rect rect;
  7. rect.origin = node->getPosition();
  8. rect.size = node->getContentSize();
  9. rect.origin.x -= rect.size.width / 2;
  10. rect.origin.y -= rect.size.height / 2;
  11. return rect;
  12. }
  13. void runTextFiledTTFManager(){
  14. auto scene = Scene::create();
  15. TextFiledTTFTest* layer = new TextFiledTTFTest();
  16. layer->autorelease(); //交给内存池进行管理
  17. scene->addChild(layer);
  18. Director::getInstance()->runWithScene(scene);
  19. }
  20. keyBoradNotificationLayer::keyBoradNotificationLayer():_trackNode(0){
  21. auto listener = EventListenerTouchOneByOne::create();
  22. listener->onTouchBegan = CC_CALLBACK_2(keyBoradNotificationLayer::onTouchBegan,this);
  23. listener->onTouchEnded = CC_CALLBACK_2(keyBoradNotificationLayer::onTouchEnded, this);
  24. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
  25. }
  26. bool keyBoradNotificationLayer::onTouchBegan(Touch* touch, Event* event){
  27. _beganPos = convertToNodeSpace(touch->getLocation());
  28. return true;
  29. }
  30. void keyBoradNotificationLayer::onTouchEnded(Touch *touch, Event *event){
  31. if (!_trackNode){
  32. return;
  33. }
  34. auto _endPos = touch->getLocation();
  35. //做了个判断,滑动差距大于5的话则代表不会被触发输入法
  36. float distance = 5.0f;
  37. if (abs(_endPos.x - _beganPos.x) > distance ||
  38. abs(_endPos.y - _beganPos.y) > distance){
  39. //抹掉首次触摸的值
  40. _beganPos.x = _beganPos.y = -1;
  41. return;
  42. }
  43. /*如果点击的区域是在此文本框上就打开输入法*/
  44. Rect rect;
  45. auto touchPoint = convertTouchToNodeSpaceAR(touch);
  46. log("KeyboardNotificationLayer:clickedAt(%f,%f)", touchPoint.x, touchPoint.y);
  47. rect = getRect(_trackNode);
  48. log("KeyboardNotificationLayer:TrackNode at(origin:%f,%f, size:%f,%f)",
  49. rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
  50. this->onClickTrackNode(rect.containsPoint(touchPoint));
  51. }
  52. void keyBoradNotificationLayer::keyboardWillShow(IMEKeyboardNotificationInfo& info){
  53. Rect rect = getRect(_trackNode);
  54. log(" jin ");
  55. //_trackNode和键盘的交集监测
  56. if (!rect.intersectsRect(info.end)){
  57. return;
  58. }
  59. //计算软键盘需要的高度
  60. float adjustHeight = info.end.getMaxY() - rect.getMinY();
  61. /*调整所有的子节点*/
  62. auto& children = getChildren();
  63. Node * node = 0;
  64. ssize_t count = children.size();
  65. Vec2 pos;
  66. for (int i = 0; i < count; ++i)
  67. {
  68. node = children.at(i);
  69. pos = node->getPosition();
  70. pos.y += adjustHeight;
  71. node->setPosition(pos);
  72. }
  73. }
  74. void TextFiledTTFTest::onClickTrackNode(bool b){
  75. auto mTextFiled = (TextFieldTTF*)_trackNode;
  76. if (b){
  77. mTextFiled->attachWithIME();
  78. }
  79. else{
  80. mTextFiled->detachWithIME();
  81. }
  82. }
  83. void TextFiledTTFTest::onEnter(){
  84. keyBoradNotificationLayer::onEnter(); //必须先调用父类的onEnter方法
  85. auto s = Director::getInstance()->getWinSize();
  86. auto mTextFiled = TextFieldTTF::textFieldWithPlaceHolder("click here for input", FONT_NAME, FONT_SIZE);
  87. mTextFiled->setPosition(VisibleRect::center());
  88. addChild(mTextFiled);
  89. _trackNode = mTextFiled;
  90. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值