cocos2d-x-3.1 文本输入框简单使用
2014-12-22 21:18
369 查看
cocos2d-x-3.1 文本输入框简单使用 (coco2d-x 学习笔记九)
分类:cocos2d-x2014-06-19 23:12466人阅读评论(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?
#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
#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
[cpp]
view plaincopyprint?
#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");
}
#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
[cpp]
view plaincopyprint?
#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
#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
[cpp]
view plaincopyprint?
#include "TextFiledTTFManager.h"
#include "VisibleRect.h"
#define FONT_NAME "fonts/Marker Felt.ttf"
#define FONT_SIZE 36
static Rect getRect(Node* node){
Rect rect;
rect.origin = node->getPosition();
rect.size = node->getContentSize();
rect.origin.x -= rect.size.width / 2;
rect.origin.y -= rect.size.height / 2;
return rect;
}
void runTextFiledTTFManager(){
auto scene = Scene::create();
TextFiledTTFTest* layer = new TextFiledTTFTest();
layer->autorelease(); //交给内存池进行管理
scene->addChild(layer);
Director::getInstance()->runWithScene(scene);
}
keyBoradNotificationLayer::keyBoradNotificationLayer():_trackNode(0){
auto listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = CC_CALLBACK_2(keyBoradNotificationLayer::onTouchBegan,this);
listener->onTouchEnded = CC_CALLBACK_2(keyBoradNotificationLayer::onTouchEnded,
this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
}
bool keyBoradNotificationLayer::onTouchBegan(Touch* touch, Event* event){
_beganPos = convertToNodeSpace(touch->getLocation());
return true;
}
void keyBoradNotificationLayer::onTouchEnded(Touch *touch, Event *event){
if (!_trackNode){
return;
}
auto _endPos = touch->getLocation();
//做了个判断,滑动差距大于5的话则代表不会被触发输入法
float distance = 5.0f;
if (abs(_endPos.x - _beganPos.x) > distance ||
abs(_endPos.y - _beganPos.y) > distance){
//抹掉首次触摸的值
_beganPos.x = _beganPos.y = -1;
return;
}
/*如果点击的区域是在此文本框上就打开输入法*/
Rect rect;
auto touchPoint = convertTouchToNodeSpaceAR(touch);
log("KeyboardNotificationLayer:clickedAt(%f,%f)", touchPoint.x, touchPoint.y);
rect = getRect(_trackNode);
log("KeyboardNotificationLayer:TrackNode at(origin:%f,%f, size:%f,%f)",
rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
this->onClickTrackNode(rect.containsPoint(touchPoint));
}
void keyBoradNotificationLayer::keyboardWillShow(IMEKeyboardNotificationInfo& info){
Rect rect = getRect(_trackNode);
log(" jin ");
//_trackNode和键盘的交集监测
if (!rect.intersectsRect(info.end)){
return;
}
//计算软键盘需要的高度
float adjustHeight = info.end.getMaxY() - rect.getMinY();
/*调整所有的子节点*/
auto& children = getChildren();
Node * node = 0;
ssize_t count = children.size();
Vec2 pos;
for (int i = 0; i < count; ++i)
{
node = children.at(i);
pos = node->getPosition();
pos.y += adjustHeight;
node->setPosition(pos);
}
}
void TextFiledTTFTest::onClickTrackNode(bool b){
auto mTextFiled = (TextFieldTTF*)_trackNode;
if (b){
mTextFiled->attachWithIME();
}
else{
mTextFiled->detachWithIME();
}
}
void TextFiledTTFTest::onEnter(){
keyBoradNotificationLayer::onEnter(); //必须先调用父类的onEnter方法
auto s = Director::getInstance()->getWinSize();
auto mTextFiled = TextFieldTTF::textFieldWithPlaceHolder("click here for input", FONT_NAME, FONT_SIZE);
mTextFiled->setPosition(VisibleRect::center());
addChild(mTextFiled);
_trackNode = mTextFiled;
}
相关文章推荐
- cocos2d-x-3.1 文本输入框简单使用 (coco2d-x 学习笔记九)
- Cocos2d-x中CCEditBox文本输入框的使用实例
- Cocos2d-x中使用CCTextFieldTTF的简单应用显示文本和弹出软键盘
- Cocos2d-X中使用CCTextFieldTTF的简单应用显示文本和弹出软键盘
- iPhone之使用Cocos2d来开发简单的IPhone游戏教程
- 【iOS-Cocos2d游戏开发】使用plist文件制作简单精灵
- 在Silverlight中使用Socket进行通信(3)简单的文本聊天工具
- 用Windows API实现一个简单的文本输入框
- asp.net中使用文本输入框输入文本,保留文本基本格式,打印和显示的方法
- 【cocos2d-x】如何使用Cocos2D-x制作一款简单的iphone&Android游戏②
- 简单文本打印,PrintDocument使用
- 【Python】Python使用smtplib发送简单文本邮件
- Matplotlib简介和pyplot的简单使用——文本标注和箭头
- 2.如何使用cocos2d来做一个简单的iphone游戏教程(第一部分)
- 如何使用Cocos2D 2.X生成一个简单的iPhone游戏
- iOS-Cocos2d游戏开发】使用plist文件制作简单精灵
- 在Silverlight中使用Socket进行通信(3)简单的文本聊天工具
- 用Windows API实现一个简单的文本输入框(下)
- (译)如何使用cocos2d来做一个简单的iphone游戏教程(第一部分)
- jQuery中使用Ajax实现文本输入框的自动完成功能