博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
<html>
阅读量:4312 次
发布时间:2019-06-06

本文共 15068 字,大约阅读时间需要 50 分钟。

多的不说,我这个学渣,我写的代码比較搓!

忍耐下吧!

CursorTextField.h

#ifndef _CursorTextField_H_#define _CursorTextField_H_#include "cocos2d.h"USING_NS_CC;class CursorTextField : public TextFieldTTF, public TextFieldDelegate , public IMEDelegate{private:	// 点击開始位置	Point m_beginPos;	// 光标精灵	Sprite * m_pCursorSprite;	// 光标动画	Action *m_pCursorAction;	// 光标坐标	Point m_cursorPos;	//输入框长度	float inputFrameWidth;	//同意输入的最大字符数Unicode	float inputMaxLength;	int nLenCount;	int codeNumType[50];    //每一个字符相应的字节数量	int codeCur;         //当前第几个字符	int startCur;        //行开头字符下标	int endCur;          //行末尾下标	// 输入框总内容	std::string m_pInputText;	std::string inpuText; //当前输入框内容public:	CursorTextField();	~CursorTextField();	// static	static CursorTextField * textFieldWithPlaceHolder(cocos2d::Node * node , const char *placeholder, const char *fontName, float fontSize);	// Layer	void onEnter();	void onExit();	bool init();	// 初始化光标精灵	void initCursorSprite(int nHeight);	// TextFieldDelegate	virtual bool onTextFieldAttachWithIME(TextFieldTTF *pSender) override;	virtual bool onTextFieldDetachWithIME(TextFieldTTF * pSender) override;	virtual bool onTextFieldInsertText(cocos2d::TextFieldTTF*  sender, const char * text, size_t nLen) override;	virtual bool onTextFieldDeleteBackward(cocos2d::TextFieldTTF*  sender, const char * delText, size_t nLen) override;	virtual void setPosition(const Point& pos);	virtual void setPosition(float &x, float &y);	void setCursorPositionX(float x); // 设置光标x位置	// 把光标加入到和输入框一起的层中	void AddCursor(Node *node);	// Layer Touch	bool onTouchBegan(Touch *pTouch, Event *pEvent);	void onTouchEnded(Touch *pTouch, Event *pEvent);	// 推断是否点击在TextField处	bool isInTextField(Touch *pTouch);	// 得到TextField矩形	Rect getRect();	// 打开输入法	void openIME();	// 关闭输入法	void closeIME();	std::string split_text(std::string name, int len , int start);	const char* getInputText();	void setInpuntText(char* text);	void setInputWidth(float width);	void setInputMaxLength(float length);	cocos2d::Node * parentNode;protected:	EventListenerTouchOneByOne * listener;};#endif
CursorTextField.cpp

#include "CursorTextField.h"#include "MyCharSet.h"const static float DELTA = 0.5f;using namespace cocos2d;using namespace std;CursorTextField::CursorTextField(){	TextFieldTTF();	m_pCursorSprite = NULL;}CursorTextField::~CursorTextField(){	}void CursorTextField::onEnter(){	TextFieldTTF::onEnter();	listener = EventListenerTouchOneByOne::create();	listener->setSwallowTouches(true);	listener->onTouchBegan = CC_CALLBACK_2(CursorTextField::onTouchBegan, this);	listener->onTouchEnded = CC_CALLBACK_2(CursorTextField::onTouchEnded, this);	Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);	this->setDelegate(this);}CursorTextField * CursorTextField::textFieldWithPlaceHolder(Node * node , const char *placeholder, const char *fontName, float fontSize){	auto pRet = new CursorTextField();	pRet->parentNode = node;	if (pRet && ((TextFieldTTF*)pRet)->initWithPlaceHolder(placeholder, fontName, fontSize))	{		pRet->autorelease();		if (placeholder)		{			pRet->setPlaceHolder(placeholder);		}		pRet->init();		pRet->initCursorSprite(fontSize);		pRet->setHorizontalAlignment(kCCTextAlignmentLeft);		return pRet;	}	CC_SAFE_DELETE(pRet);	return NULL;}bool CursorTextField::init(){	this->inputFrameWidth = 400;	this->inputMaxLength = 16;	this->nLenCount = 0;	memset(codeNumType, 0, sizeof(codeNumType));	this->codeCur = 0;	this->startCur = 0;	this->endCur = 0;	inpuText = "";	return true;}void CursorTextField::initCursorSprite(const int mHeight){	int column = 2;	int nHeight = 20;	int pixels[50][2];	for (int i = 0; i < nHeight; ++i)	{		for (int j = 0; j < column; ++j)		{			pixels[i][j] = 0xffffffff;		}	}	Texture2D* texture = new Texture2D();	texture->initWithData(pixels, 20, Texture2D::PixelFormat::RGB888, 4, mHeight, CCSizeMake(column, nHeight));	m_pCursorSprite = Sprite::createWithTexture(texture);	texture->autorelease();	if (m_pCursorSprite == nullptr)	{		CCLOG("NULL");	}	Size winSize = getContentSize();	m_pCursorSprite->setVisible(false);	parentNode->addChild(m_pCursorSprite);	m_pCursorAction = RepeatForever::create(Sequence::create(FadeOut::create(0.25f), FadeIn::create(0.25f), NULL));	m_pCursorSprite->runAction(m_pCursorAction);}void CursorTextField::setPosition(float &x, float &y){	Point posi(x, y);	setPosition(posi);}void CursorTextField::setPosition(const Point& pos){	TextFieldTTF::setPosition(pos);	// 设置光标位置	if (NULL != m_pCursorSprite)	{		Size winSize = getContentSize();		m_cursorPos = ccp(0, 0/*winSize.height / 2*/);		m_cursorPos = m_cursorPos + pos;		m_pCursorSprite->setPosition(m_cursorPos.x, m_cursorPos.y + m_pCursorSprite->getContentSize().height / 2.0);	}}void CursorTextField::setCursorPositionX(float x) // 设置光标x位置{	Point pt = getPosition(); // 获取输入框位置	m_pCursorSprite->setPositionX(pt.x + x);}// 把光标加入到和输入框一起的层中void CursorTextField::AddCursor(Node *node){	if (NULL != node && NULL != m_pCursorSprite)	{		node->addChild(m_pCursorSprite);		m_pCursorSprite->setPositionY(getContentSize().height / 2.0);		m_pCursorSprite->runAction(m_pCursorAction);	}}bool CursorTextField::onTouchBegan(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){	m_beginPos = pTouch->getLocation();	return true;}Rect CursorTextField::getRect(){	Size size = getContentSize();	return  CCRectMake(0, -size.height / 2, inputFrameWidth, size.height);}//获取输入框内容const char* CursorTextField::getInputText(){	const char* text = m_pInputText.c_str();	return text;}//设置输入框内容void CursorTextField::setInpuntText(char* text){	m_pInputText = "";	setString(text);	m_pCursorSprite->setPositionX(this->getPosition().x);	memset(codeNumType, 0, sizeof(codeNumType));	codeCur = 0;	startCur = 0;	endCur = 0;	inpuText = "";}//设置输入框宽度 一旦字符串宽度超度这个长度 字符串会自己主动向左缩进void CursorTextField::setInputWidth(float width){	this->inputFrameWidth = width;}//设置输入宽显示的最大字符数量Unicodevoid CursorTextField::setInputMaxLength(float length){	this->inputMaxLength = length;}//推断点击事件。是否响应在输入框范围内bool CursorTextField::isInTextField(cocos2d::Touch *pTouch){	return getRect().containsPoint(convertTouchToNodeSpaceAR(pTouch));}void CursorTextField::onTouchEnded(cocos2d::Touch *pTouch, cocos2d::Event *pEvent){	Point endPos = pTouch->getLocation();	// 推断是否为点击事件	if (::abs(endPos.x - m_beginPos.x) > DELTA ||		::abs(endPos.y - m_beginPos.y))	{		// 不是点击事件		m_beginPos.x = m_beginPos.y = -1;		return;	}	// 推断是打开输入法还是关闭输入法	isInTextField(pTouch) ? openIME() : closeIME();}//弹出手机键盘时响应事件bool CursorTextField::onTextFieldAttachWithIME(cocos2d::TextFieldTTF *pSender){	if (m_pInputText.empty()) {		return false;	}	m_pCursorSprite->setPositionX(this->getPosition().x + getContentSize().width);	return false;}//当有输入进来时响应//@param pSender 发送事件对象//@param text 输入内容//@param  内容字节长度bool CursorTextField::onTextFieldInsertText(cocos2d::TextFieldTTF* sender, const char * text, size_t nLen){	int j = 0 ;	std::string mytext = text;	for (j = 0; j < mytext.size();)	{		std::string sText = m_pInputText.c_str();		wchar_t* wText = new wchar_t[200];		char t[200];		memset(t, 0, sizeof(t));		strcpy(t, sText.c_str());		int unisize = 0;		int cou = MyCharSet::getinstence()->utf8_to_unicode((uint8_t*)t, (uint16_t **)wText, &unisize);		std::string ss = split_text(mytext, 1 , j);		j += ss.length();		//当字符数量超过规定值 不做处理		if (cou >= inputMaxLength)		{			CC_SAFE_DELETE_ARRAY(wText);			return true;		}		//return true;		//屏蔽回车输入		if (ss == "\n")		{			CC_SAFE_DELETE_ARRAY(wText);			continue;		}		//输入框总内容加入		m_pInputText.append(ss);				//输入框当前字符串加入		inpuText.append(ss);		//当前字符的长度		codeNumType[codeCur++] = ss.length();		std::string localText = m_pInputText;		setString(m_pInputText);		//假设总字符串的长度大于指定宽度		if (getContentSize().width > inputFrameWidth){			//大于。截取字符串,直到字符串的长度小于指定宽度为止			setString(inpuText);			while (getContentSize().width > inputFrameWidth){				int nnLen = ss.length();				if (codeNumType[startCur] == 1){					nnLen = 1;				}				if (codeNumType[startCur] == 3){					nnLen = 3;				}				startCur++;				nLenCount += nnLen;				float gap = localText.size() - nLenCount;				inpuText = localText.substr(nLenCount, gap);				setString(inpuText.c_str());				float coWidth = getContentSize().width;			}		}		else{			//小于,直接设置显示总字符串			nLenCount = 0;			startCur = 0;			setString(m_pInputText);		}		//设置光标位置		m_pCursorSprite->setPositionX(this->getPosition().x + getContentSize().width);		CC_SAFE_DELETE_ARRAY(wText);		//AndroidShowtext(mychar, 1);	}	return true;}//当有输入进来时响应//@param pSender 发送事件对象//@param text 删除内容//@param  内容字节长度bool CursorTextField::onTextFieldDeleteBackward(cocos2d::TextFieldTTF* sender, const char * delText, size_t nLen){	// 将总字符串长度减去nLen字节长	m_pInputText.resize(m_pInputText.size() - nLen);	//当前字符数减一	codeNumType[codeCur--] = 0;	std::string localText = m_pInputText;	setString(m_pInputText);	if (getContentSize().width > inputFrameWidth){		//大于指定宽度。截取字符串,直到字符串长度小于指定宽度		while (getContentSize().width > inputFrameWidth){			int nnLen = nLen;			if (codeNumType[startCur - 1] == 1){				nnLen = 1;			}			if (codeNumType[startCur - 1] == 3){				nnLen = 3;			}			nLenCount -= nnLen;			startCur--;			if (startCur <= 0)				startCur = 0;			if (nLenCount <= 0)				nLenCount = 0;			float gap = localText.size() - nLenCount;			const std::string text = localText.substr(nLenCount, gap);			setString(text);			inpuText = text;		}	}	else{		nLenCount = 0;		startCur = 0;		setString(m_pInputText.c_str());	}	//设置光标位置	m_pCursorSprite->setPositionX(this->getPosition().x + getContentSize().width);	if (m_pInputText.empty()) {		m_pCursorSprite->setPositionX(this->getPosition().x);	}	return true;}bool CursorTextField::onTextFieldDetachWithIME(cocos2d::TextFieldTTF *pSender){	return false;}void CursorTextField::openIME(){	m_pCursorSprite->setVisible(true);	setString(m_pInputText);	((TextFieldTTF *)this)->attachWithIME();}void CursorTextField::closeIME(){	m_pCursorSprite->setVisible(false);	//auto pTextField = (TextFieldTTF *)pRet;	((TextFieldTTF *)this)->detachWithIME();}void CursorTextField::onExit(){	TextFieldTTF::onExit();	Director::getInstance()->getEventDispatcher()->removeEventListener(listener);}std::string CursorTextField::split_text(std::string name, int len , int start){	int i = start;	std::string str;	if (name[i] < 0)	{		i++;	}	//while (name[i] < 0)	//{	//	i++;	//	if (i - start == 2)	//	{	//		break;	//	}	//}	if (start == i)	{		str = name.substr(start, 1);	}	else	{		str = name.substr(start, 3);	}	//log("mysubstr   %s", str.c_str());	return str;}
字节转换的

MyCharSet.h

#pragma once#include "stdint.h"#include "stdio.h"#include 
#include
#include
class MyCharSet{public: MyCharSet(); ~MyCharSet(); static MyCharSet * getinstence(); static void destoryinstence(); int utf8_to_unicode(uint8_t *in, uint16_t **out, int *outsize); int unicode_to_utf8(uint16_t *in, int insize, uint8_t **out);};

MyCharSet.cpp

#include "MyCharSet.h"static MyCharSet *_MyCharSet = NULL;MyCharSet::MyCharSet(){}MyCharSet::~MyCharSet(){}MyCharSet * MyCharSet::getinstence(){	if (_MyCharSet == NULL)	{		_MyCharSet = new MyCharSet();	}	return _MyCharSet;}void MyCharSet::destoryinstence(){	if (_MyCharSet != NULL)	{		delete _MyCharSet;	}}int MyCharSet::utf8_to_unicode(uint8_t *in, uint16_t **out, int *outsize){	uint8_t *p = in;	uint16_t *result = NULL;	int resultsize = 0;	uint8_t *tmp = NULL;	result = (uint16_t *)malloc(strlen((char *)in) * 2 + 2); /* should be enough */	memset(result, 0, strlen((char*)in) * 2 + 2);	tmp = (uint8_t *)result;	while (*p)	{		if (*p >= 0x00 && *p <= 0x7f)		{			*tmp = *p;			tmp++;			*tmp = '\0';			resultsize += 1;		}		else if ((*p & (0xff << 5)) == 0xc0)		{			uint16_t t = 0;			uint8_t t1 = 0;			uint8_t t2 = 0;			t1 = *p & (0xff >> 3);			p++;			t2 = *p & (0xff >> 2);			*tmp = t2 | ((t1 & (0xff >> 6)) << 6);//t1 >> 2;			tmp++;			*tmp = t1 >> 2;//t2 | ((t1 & (0xff >> 6)) << 6);			tmp++;			resultsize += 1;		}		else if ((*p & (0xff << 4)) == 0xe0)		{			uint16_t t = 0;			uint8_t t1 = 0;			uint8_t t2 = 0;			uint8_t t3 = 0;			t1 = *p & (0xff >> 3);			p++;			t2 = *p & (0xff >> 2);			p++;			t3 = *p & (0xff >> 2);			//Little Endian			*tmp = ((t2 & (0xff >> 6)) << 6) | t3;//(t1 << 4) | (t2 >> 2);			tmp++;			*tmp = (t1 << 4) | (t2 >> 2);//((t2 & (0xff >> 6)) << 6) | t3;			tmp++;			resultsize += 1;		}		p++;	}	//*tmp = '\0';	//tmp++;	//*tmp = '\0';	//resultsize += 2;	//*out = result;	//*outsize = resultsize;	return resultsize;}int MyCharSet::unicode_to_utf8(uint16_t *in, int insize, uint8_t **out){	int i = 0;	int outsize = 0;	int charscount = 0;	uint8_t *result = NULL;	uint8_t *tmp = NULL;	charscount = insize / sizeof(uint16_t);	result = (uint8_t *)malloc(charscount * 3 + 1);	memset(result, 0, charscount * 3 + 1);	tmp = result;	for (i = 0; i < charscount; i++)	{		uint16_t unicode = in[i];		if (unicode >= 0x0000 && unicode <= 0x007f)		{			*tmp = (uint8_t)unicode;			tmp += 1;			outsize += 1;		}		else if (unicode >= 0x0080 && unicode <= 0x07ff)		{			*tmp = 0xc0 | (unicode >> 6);			tmp += 1;			*tmp = 0x80 | (unicode & (0xff >> 2));			tmp += 1;			outsize += 2;		}		else if (unicode >= 0x0800 && unicode <= 0xffff)		{			*tmp = 0xe0 | (unicode >> 12);			tmp += 1;			*tmp = 0x80 | (unicode >> 6 & 0x00ff);			tmp += 1;			*tmp = 0x80 | (unicode & (0xff >> 2));			tmp += 1;			outsize += 3;		}	}	*tmp = '\0';	*out = result;	return outsize;}

假设使用直接:

CursorTextField *m_pCursorInputLayer = CursorTextField::textFieldWithPlaceHolder(this, "click and input",		"fonts/Marker Felt.ttf", 40);	m_pCursorInputLayer->setAnchorPoint(ccp(0.0f, 0.0f));	m_pCursorInputLayer->setInputWidth(visibleSize.width);	Vec2 posi(0, visibleSize.height / 2);	m_pCursorInputLayer->setPosition(posi);	this->addChild(m_pCursorInputLayer, 1);

我这个输入攻克了Android上一堆输入导致的错误,大家能够细致去看看!
这个输入自行扩展,如今我的需求不用不须要,也就没写,大家能够自行输入。

给个思路大家吧。在分割字符的时候能够自行加入回车,我临时想到这样来做。

我做的效果!

需求来了,希望能够移动光标进行删除指定的。所下面一篇讲讲光标移动实现!

版权声明:本文为博主原创文章,未经博主同意不得转载。
举报
  • 本文已收录于下面专栏:
0条评论

相关文章推荐

在游戏中,有时候修要用户输入usernamepassword等,这时候须要用到虚拟键盘来实现,在Cocos2dx中,通过使用集成输入法代理类(CCIMEDelegate)和其字标签类(CCLabelTTF)的输入框类(CC...
  • 2013-12-20 17:14
  • 8816

假设你总是匆匆写出代码。却从来不回头去推敲,改动和提炼,事实上是不可能提高编程水平的 优雅的代码的还有一个特征是,它的逻辑大体上看起来,是枝丫分明的树状结构(tree) 宏使程序难以理解,难以调试,容...
  • 2016-01-18 15:35
  • 141

如今光标最终可移动了。然后事实上主要是逻辑问题,也没什么技术含量,所以总是一大堆位置推断!再者自己能力比較水,所以代码比較挫,这里代码仅仅有更新那部分,详细的回车什么的自己去弄就好了。事实上跟这个思想几乎相同...
  • 2015-07-03 12:00
  • 1557

第一、培养积极的思维 事物总是不变,变的仅仅是人的看法。而人的看法则由每一个人的思维习惯决定,思维习惯分主动习惯和被动习惯。

在对待事情的时候往往是主动习惯和被动习惯的掺杂,这样的情况两个思维一般都是对立的。...

  • 2016-01-18 15:55
  • 180

如今光标最终可移动了,然后事实上主要是逻辑问题,也没什么技术含量,所以总是一大堆位置推断!再者自己能力比較水。所以代码比較挫,这里代码仅仅有更新那部分,详细的回车什么的自己去弄就好了,事实上跟这个思想几乎相同...
  • 2015-07-03 12:00
  • 1557

<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 1.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border
  • 2012-03-26 10:27
  • 702

cocos2d-x带光标的输入框的实现, 头文件代码例如以下:
  • 2014-08-19 11:31
  • 1481

对Cocos2dX使用c++版的base64编码文件: #include "DataBase64Himi.h
  • 2013-07-24 13:21
  • 642

在要使用的类中增加头文件:#include "DTCursorTextField.h" 初始化代码: DTCursorTextField *m_pTxtPsw1 =DTCursorTextFiel...
  • 2014-02-17 15:52
  • 1375

感谢点评与关注,欢迎转载与分享。勤奋努力,持之以恒! <span style=
  • 2014-05-30 14:59
  • 64

在线课程

转载于:https://www.cnblogs.com/llguanli/p/7382472.html

你可能感兴趣的文章
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
matplotlib绘图跳过时间段的处理方案
查看>>
vnpy学习_04回测评价指标的缺陷
查看>>
iOS开发中遇到的问题整理 (一)
查看>>
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>