首页 > 代码库 > cocos2dx注册场景 使用CCEditBox实现输入框

cocos2dx注册场景 使用CCEditBox实现输入框

我们在开始玩一个游戏时,通常要做的第一件事就是注册账号,下面就让我们来制作一个简单的注册场景,我所使用的cocos2dx版本为2.2.2

在这个场景中最主要的元素就是输入框和按钮,我从网上找了一些素材(也有自己P的),样子不太好看,但是最终的效果都是一样的。

在这个场景中,元素的摆放和按钮的功能都比较简单,唯一有些困难的就是输入框。在cocos2dx2.2.2中输入框可以使用CCTextFieldTTF和CCEditBox来实现,我们这里使用的是CCEditBox。

下面我们先来看看这个注册场景操作层的头文件

 1 #ifndef __MyGame__RegisterHandleLayer__ 2 #define __MyGame__RegisterHandleLayer__ 3  4 #include <iostream> 5 #include "cocos2d.h" 6 #include "cocos-ext.h" 7 using namespace cocos2d; 8 USING_NS_CC_EXT; 9 10 class RegisterHandleLayer:public CCLayer,public CCEditBoxDelegate{11 private:12     CCEditBox * editBoxUsername;//用户名13     CCEditBox * editBoxPassword;//密码14     CCEditBox * editBoxRePassword;//重复密码15     void addEditBox(CCEditBox * editBox,CCPoint editPoint, char * defaultValue,bool isPassword);//添加输入框    16     bool checkInput();//输入验证17     void toGameScene();//跳转到游戏场景18     void toLoginScene();//跳转到登录场景19     20 public:21     virtual bool init();22     CREATE_FUNC(RegisterHandleLayer);23     virtual void editBoxEditingDidBegin(extension::CCEditBox* editBox);24     virtual void editBoxEditingDidEnd(extension::CCEditBox* editBox);25     virtual void editBoxTextChanged(extension::CCEditBox* editBox, const std::string& text);26     virtual void editBoxReturn(extension::CCEditBox* editBox);27 };28 #endif /* defined(__MyGame__RegisterHandleLayer__) */

使用CCEditBox需要引入扩展库extension,我们引入头文件 "cocos-ext.h",再引入命名空间,可以使用“using namespace extension”或宏定义“USING_NS_CC_EXT”,同时,还需要继承CCEditBoxDelegate。在该类中,我们定义了3个输入框,用户名、密码和重复密码,及设置输入框的方法。最后的4个虚函数是CCEditBoxDelegate中定义的,我们对输入框的不同操作会触发相应的方法,我们这里不会用到,但是可以通过日志查看各方法的触发时机,各方法的触发时机如下:

 1 //键盘弹出后输入框获得焦点时触发 2 void RegisterHandleLayer::editBoxEditingDidBegin(extension::CCEditBox *editBox) 3 { 4     CCLog("begin"); 5 } 6  7 //键盘隐藏后输入框失去焦点时触发 8 void RegisterHandleLayer::editBoxEditingDidEnd(extension::CCEditBox *editBox) 9 {10     CCLog("end");11 }12 13 //输入框内文本变化时触发14 void RegisterHandleLayer::editBoxTextChanged(extension::CCEditBox *editBox, const std::string &text)15 {16     CCLog("change");17 }18 19 //按下返回键或点击键盘外的位置时触发(点击当前输入框时不触发)20 void RegisterHandleLayer::editBoxReturn(extension::CCEditBox *editBox)21 {22     CCLog("return");23 }

下面我们来看看最关键的addEditBox方法,我们可以使用该方法设置输入框的不同属性

 1 /* 2  * 功能 : 向场景中添加输入框并设置相应属性 3  * 4  *      editBox : 输入框   5  *    editPoint : 位置 6  * defaultValue : 缺省文本 7  *   isPassword : true-密码,false-非密码 8 */ 9 void RegisterHandleLayer::addEditBox(CCEditBox * editBox,CCPoint editPoint, char * defaultValue,bool isPassword)10 {11     editBox->CCNode::setPosition(editPoint.x,editPoint.y); //位置12     editBox->setFontColor(ccWHITE); //文字颜色13     editBox->setPlaceHolder(defaultValue); //输入框缺省文字14     editBox->setPlaceholderFontColor(ccWHITE); //缺省文字颜色15     editBox->setMaxLength(20); //最大长度16     editBox->setReturnType(kKeyboardReturnTypeDone); //默认使用键盘return类型为Done17     editBox->setInputMode(kEditBoxInputModeEmailAddr); //输入键盘模式18     if (isPassword) {19         editBox->setInputFlag(kEditBoxInputFlagPassword); //输入密码时的替代符20     }21     editBox->setDelegate(this); //设置委托代理对象为当前类22     23     this->addChild(editBox);24 }

相关属性还是比较好理解的,大家可以改变属性查看不同的效果。其中setReturnType、setInputMode、setInputFlag这3个方法的参数可能会有些疑问,但是我们可以在“CCEditBox.h”头文件中查看各参数的含义,也可以改变各参数,分别查看不同的效果。例如,我们这里对密码类型输入框的设置“editBox->setInputFlag(kEditBoxInputFlagPassword);”会得到如下效果:

各参数的原始定义如下:

 1 enum KeyboardReturnType { 2     kKeyboardReturnTypeDefault = 0, 3     kKeyboardReturnTypeDone, 4     kKeyboardReturnTypeSend, 5     kKeyboardReturnTypeSearch, 6     kKeyboardReturnTypeGo 7 }; 8  9 10 /**11  * \brief The EditBoxInputMode defines the type of text that the user is allowed12  * to enter.13  */14 enum EditBoxInputMode15 {16     /**17      * The user is allowed to enter any text, including line breaks.18      */19     kEditBoxInputModeAny = 0,20     21     /**22      * The user is allowed to enter an e-mail address.23      */24     kEditBoxInputModeEmailAddr,25 26     /**27      * The user is allowed to enter an integer value.28      */29     kEditBoxInputModeNumeric,30 31     /**32      * The user is allowed to enter a phone number.33      */34     kEditBoxInputModePhoneNumber,35 36     /**37      * The user is allowed to enter a URL.38      */39     kEditBoxInputModeUrl,40 41     /**42      * The user is allowed to enter a real number value.43      * This extends kEditBoxInputModeNumeric by allowing a decimal point.44      */45     kEditBoxInputModeDecimal,46 47     /**48      * The user is allowed to enter any text, except for line breaks.49      */50     kEditBoxInputModeSingleLine51 };52 53 /**54  * \brief The EditBoxInputFlag defines how the input text is displayed/formatted.55  */56 enum EditBoxInputFlag57 {58     /**59      * Indicates that the text entered is confidential data that should be60      * obscured whenever possible. This implies EDIT_BOX_INPUT_FLAG_SENSITIVE.61      */62     kEditBoxInputFlagPassword = 0,63 64     /**65      * Indicates that the text entered is sensitive data that the66      * implementation must never store into a dictionary or table for use67      * in predictive, auto-completing, or other accelerated input schemes.68      * A credit card number is an example of sensitive data.69      */70     kEditBoxInputFlagSensitive,71 72     /**73      * This flag is a hint to the implementation that during text editing,74      * the initial letter of each word should be capitalized.75      */76     kEditBoxInputFlagInitialCapsWord,77 78     /**79      * This flag is a hint to the implementation that during text editing,80      * the initial letter of each sentence should be capitalized.81      */82     kEditBoxInputFlagInitialCapsSentence,83 84     /**85      * Capitalize all characters automatically.86      */87     kEditBoxInputFlagInitialCapsAllCharacters88 89 };

在我们了解了CCEditBox的相关属性和用法后,就可以完成我们的注册场景了,注册场景操作层的init方法代码如下:

 1 bool RegisterHandleLayer::init() 2 { 3     if (!CCLayer::init()) { 4         return false; 5     } 6      7     //精灵帧缓存 8     CCSpriteFrameCache * sfCache = CCSpriteFrameCache::sharedSpriteFrameCache(); 9     sfCache->addSpriteFramesWithFile("p_register.plist");10     11     //屏幕尺寸12     CCSize size = CCDirector::sharedDirector()->getWinSize();13     14     //注册框15     CCSpriteFrame * f_register_box = sfCache->spriteFrameByName("register.png");16     CCSprite * spriteBox = CCSprite::createWithSpriteFrame(f_register_box);17     spriteBox->setPosition(CCPointMake(size.width/2, size.height/2));18     this->addChild(spriteBox);19     20     //注册框尺寸21     CCSize boxSize = spriteBox->getContentSize();22     23     //用户名24     CCSpriteFrame * f_register_username = sfCache->spriteFrameByName("username.png");25     CCSprite * spriteUsername = CCSprite::createWithSpriteFrame(f_register_username);26     CCSize spriteUsernameSize = spriteUsername->getContentSize();27     CCSize editSize = CCSizeMake(spriteUsernameSize.width*3/5, spriteUsernameSize.height);28     CCPoint spriteUsernamePoint = CCPointMake(size.width/2, size.height/2+spriteUsernameSize.height*11/6);29     spriteUsername->setPosition(spriteUsernamePoint);30     this->addChild(spriteUsername);31     32     //密码33     CCSpriteFrame * f_register_password = sfCache->spriteFrameByName("password.png");34     CCSprite * spritePassword = CCSprite::createWithSpriteFrame(f_register_password);35     CCPoint spritePasswordPoint = CCPointMake(size.width/2, size.height/2+spriteUsernameSize.height/2);36     spritePassword->setPosition(spritePasswordPoint);37     this->addChild(spritePassword);38     39     //重复密码40     CCSpriteFrame * f_register_repassword = sfCache->spriteFrameByName("password.png");41     CCSprite * spriteRePassword = CCSprite::createWithSpriteFrame(f_register_repassword);42     CCPoint spriteRePasswordPoint = CCPointMake(size.width/2, size.height/2-spriteUsernameSize.height*5/6);43     spriteRePassword->setPosition(spriteRePasswordPoint);44     this->addChild(spriteRePassword);45     46     //添加输入框47     editBoxUsername = CCEditBox::create(editSize, CCScale9Sprite::create());48     addEditBox(editBoxUsername, spriteUsernamePoint, "输入账号",false);49     editBoxPassword = CCEditBox::create(editSize, CCScale9Sprite::create());50     addEditBox(editBoxPassword, spritePasswordPoint, "创建密码",true);51     editBoxRePassword = CCEditBox::create(editSize, CCScale9Sprite::create());52     addEditBox(editBoxRePassword, spriteRePasswordPoint, "重复密码",true);53     54     //注册按钮55     CCSpriteFrame * f_register_btn_register = sfCache->spriteFrameByName("btn_register_normal.png");56     CCSprite * sprite_register_btn_register = CCSprite::createWithSpriteFrame(f_register_btn_register);57     58     CCSpriteFrame * f_register_btn_register_select = sfCache->spriteFrameByName("btn_register_select.png");59     CCSprite * sprite_register_btn_register_select = CCSprite::createWithSpriteFrame(f_register_btn_register_select);60     61     CCMenuItemSprite * itemRegister = CCMenuItemSprite::create(
sprite_register_btn_register,
sprite_register_btn_register_select,
this,
menu_selector(RegisterHandleLayer::toGameScene));
62 CCSize registerBthSize = itemRegister->getContentSize();63 itemRegister->setPosition(CCPointMake(size.width/2-boxSize.width/4,
size.height/2 - boxSize.height/2 + registerBthSize.height*2));64 65 //已有账号登录按钮66 CCSpriteFrame * f_register_btn_login = sfCache->spriteFrameByName("btn_register_login_normal.png");67 CCSprite * sprite_register_btn_login = CCSprite::createWithSpriteFrame(f_register_btn_login);68 69 CCSpriteFrame * f_register_btn_login_select = sfCache->spriteFrameByName("btn_register_login_select.png");70 CCSprite * sprite_register_btn_login_select = CCSprite::createWithSpriteFrame(f_register_btn_login_select);71 72 CCMenuItemSprite * itemLogin = CCMenuItemSprite::create(
sprite_register_btn_login,
sprite_register_btn_login_select,
this,
menu_selector(RegisterHandleLayer::toLoginScene));
73 CCSize loginBthSize = itemLogin->getContentSize();74 itemLogin->setPosition(CCPointMake(size.width/2+boxSize.width/4,
size.height/2 - boxSize.height/2 + loginBthSize.height*2));75 76 //按钮菜单77 CCMenu * menu = CCMenu::create(itemRegister,itemLogin,NULL);78 menu->setPosition(CCPointZero);79 this->addChild(menu);80 81 return true;82 }

代码比较简单,我们的注册场景现在基本完成了,参数验证等其他功能我们会在后续文章中再做补充。

cocos2dx注册场景 使用CCEditBox实现输入框