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

来源:互联网 发布:真人cs玩法和技巧知乎 编辑:程序博客网 时间:2024/06/15 13:11

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

分类: cocos2d-x466人阅读评论(0)收藏举报
cocos2d-x3.1文本输入框TextFieldTTFEditBox

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

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

EditBox


EditBoxManager.h

[cpp] view plaincopyprint?
  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


EditBoxManager.cpp

[cpp] view plaincopyprint?
  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. }


TextFieldTTF


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


TextFiledTTFManager.h

[cpp] view plaincopyprint?
  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

TextFiledTTFManager.cpp

[cpp] view plaincopyprint?
  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 0
原创粉丝点击