cocos2d-html5的字符输入框

现在cocos2d-html5似乎还没有开发出输入框的概念,于是自己仿造了了他的menu类和menuItem类的关系继承menu类实现了一个inputMenu类,继承menuItem类实现了一个MenuItemInputBox类。然后大概写了下,不是很完善,至少能实现字符输入了。 
缺点在于创建了10个输入框后,CPU占用率达到了100%左右(firefox 17.01中得到的结果),暂时无办法解决,所以发上来看有没有人能解决。 
用法和menu类以及menuItem类使用方法是一样的。 
//简单封装了下
var createTextInputBoxWidthLabel = function(labelStr,labelFontStyle,labelFontSize,labelFontColor,labelX,labelY,centerX,centerY,width,height) {
var textInputBox = MenuItemInputBox.create(cc.c4b(255,0,0,255),cc.c4b(10,10,10,255),width,height);
if(labelStr) {
var inputBoxLabel = cc.LabelTTF.create(labelStr,labelFontStyle,labelFontSize);
inputBoxLabel.setColor(labelFontColor);
inputBoxLabel.setPosition(cc.p(labelX,labelY));
textInputBox.addChild(inputBoxLabel);
}
textInputBox.setPosition(cc.p(centerX,centerY));
return textInputBox;
};
var s = cc.Director.getInstance().getWinSize();
//创建了一个输入框
this._inputBoxUp = createTextInputBoxWidthLabel("向上","Arial",38,cc.c4b(100,100,100,255),80,15,-s.width / 2 + 150,150,40,40);
this._inputBoxUp.setInputStringLength(1);
this._inputBoxUp.setNormalColor(cc.c3b(150,50,150));
this._inputBoxUp.setOpacity(100);
//获取输入框里面输入的字符串
var keySet = this._inputBoxUp.getInputString();
复制代码
var TextInputDisplayLayer = cc.LayerColor.extend({
_labelStr:null,
_fontName:null,
_fontSize:0,
_fontColor:null,
init:function() {
this._super();
return true;
},
initWithSize:function(width,height) {
if(null == this._fontName)
this._fontName = "Arial";
if(0 == this._fontSize)
this._fontSize = 38;
if(null == this._fontColor)
this._fontColor = cc.c3b(0,0,0);
this.setContentSize(cc.size(width,height));
this._labelStr = cc.LabelTTF.create(" ",this._fontName,this._fontSize);
this._labelStr.setColor(this._fontColor);
this._labelStr.setPosition(cc.p(width / 2,height / 2));
this.addChild(this._labelStr);
return true;
},
displayStr:function(dispStr) {
this._labelStr.setString(dispStr);
},
setFontName:function(fontName) {
if(typeof(this._labelStr) != "undefined") {
this._labelStr.setFontName(fontName);
}
},
setFontSize:function(fontSize) {
if(typeof(this._labelStr) != "undefined") {
this._labelStr.setFontSize(fontSize);
}
},
setFontColor:function(fontColor) {
if(typeof(this._labelStr) != "undefined") {
this._labelStr.setColor(fontColor);
}
}
});
var MenuItemInputBox = cc.MenuItem.extend({
_inputDisplayLayer:null,
_textBuf:null,
_normalColor:null,
_selectedColor:null,
_colorOpacity:255,
_maxChracterNum:0,
_curChracterNum:0,
_isItemActive:false,
getNormalColor:function() {
return this._normalColor;
},
setNormalColor:function(color) {
if(color == this._normalColor)
return;
if(typeof(color) != "undefined" &&
typeof(this._inputDisplayLayer) != "undefined") {
this._normalColor = color;
if(!this._isItemActive) {
this._inputDisplayLayer.setColor(color);
}
}
},
getSelectedColor:function() {
return this._selectedImage;
},
setSelectedColor:function(color) {
if(color == this._selectedColor)
return;
if(typeof(color) != "undefined" &&
typeof(this._inputDisplayLayer) != "undefined") {
this._selectedColor = color;
if(this._isItemActive) {
this._inputDisplayLayer.setColor(color);
}
}
},
initWithNormalBgColor:function(normalColor,selectedColor,width,height) {
this.setContentSize(cc.size(width,height));
this._inputDisplayLayer = new TextInputDisplayLayer();
this._inputDisplayLayer.initWithSize(width,height);
this._inputDisplayLayer.setPosition(cc.p(0,0));
this.setNormalColor(normalColor);
this.setSelectedColor(selectedColor);
this.addChild(this._inputDisplayLayer);
this._isEnabled = true;
return true;
},
setColor:function(color) {
this.setNormalColor(color);
},
getColor:function() {
return this.getNormalColor(color);
},
setOpacity:function(opacity) {
this._colorOpacity = opacity;
if(typeof(this._inputDisplayLayer) != "undefined") {
this._inputDisplayLayer.setOpacity(opacity);
}
},
getOpacity:function(opacity) {
return this._colorOpacity = opacity;
},
setFontName:function(fontName) {
if(typeof(this._inputDisplayLayer) != "undefined") {
this._inputDisplayLayer.setFontName(fontName);
}
},
setFontSize:function(fontSize) {
if(typeof(this._inputDisplayLayer) != "undefined") {
this._inputDisplayLayer.setFontSize(fontSize);
}
},
setFontColor:function(fontColor) {
if(typeof(this._inputDisplayLayer) != "undefined") {
this._inputDisplayLayer.setFontColor(fontColor);
}
},
//box is selected(we can run callback)
selected:function() {
if(typeof(this._inputDisplayLayer) != "undefined") {
this._isItemActive = true;
this._inputDisplayLayer.setColor(this._selectedColor);
}
},
//back to unselected state
unselected:function() {
if(typeof(this._inputDisplayLayer) != "undefined") {
this._isItemActive = false;
this._inputDisplayLayer.setColor(this._normalColor);
}
},
handleKey:function(e) {
if(e === cc.KEY.Delete || e === cc.KEY.backspace) {
if(null != this._textBuf) {
if(1 == this._textBuf.length)
this._textBuf = null;
else
this._textBuf = this._textBuf.substr(1,this._textBuf.length - 1);
if(0 != this._curChracterNum)
this._curChracterNum--;
}
}
var key = null;
if(e === cc.KEY.a) {
key = "a";
} else if(e === cc.KEY.b) {
key = "b";
} else if(e === cc.KEY.c) {
key = "c";
} else if(e === cc.KEY.d) {
key = "d";
} else if(e === cc.KEY.e) {
key = "e";
} else if(e === cc.KEY.f) {
key = "f";
} else if(e === cc.KEY.g) {
key = "g";
} else if(e === cc.KEY.h) {
key = "h";
} else if(e === cc.KEY.i) {
key = "i";
} else if(e === cc.KEY.j) {
key = "j";
} else if(e === cc.KEY.k) {
key = "k";
} else if(e === cc.KEY.l) {
key = "l";
} else if(e === cc.KEY.m) {
key = "m";
} else if(e === cc.KEY.n) {
key = "n";
} else if(e === cc.KEY.o) {
key = "o";
} else if(e === cc.KEY.p) {
key = "p";
} else if(e === cc.KEY.q) {
key = "q";
} else if(e === cc.KEY.r) {
key = "r";
} else if(e === cc.KEY.s) {
key = "s";
} else if(e === cc.KEY.t) {
key = "t";
} else if(e === cc.KEY.u) {
key = "u";
} else if(e === cc.KEY.v) {
key = "v";
} else if(e === cc.KEY.w) {
key = "w";
} else if(e === cc.KEY.x) {
key = "x";
} else if(e === cc.KEY.y) {
key = "y";
} else if(e === cc.KEY.z) {
key = "z";
} else if((e === cc.KEY[‘0‘]) || (e === cc.KEY.num0)) {
key = "0";
} else if(e === cc.KEY[‘1‘] || e === cc.KEY.num1) {
key = "1";
} else if(e === cc.KEY[‘2‘] || e === cc.KEY.num2) {
key = "2";
} else if(e === cc.KEY[‘3‘] || e === cc.KEY.num3) {
key = "3";
} else if(e === cc.KEY[‘4‘] || e === cc.KEY.num4) {
key = "4";
} else if(e === cc.KEY[‘5‘] || e === cc.KEY.num5) {
key = "5";
} else if(e === cc.KEY[‘6‘] || e === cc.KEY.num6) {
key = "6";
} else if(e === cc.KEY[‘7‘] || e === cc.KEY.num7) {
key = "7";
} else if(e === cc.KEY[‘8‘] || e === cc.KEY.num8) {
key = "8";
} else if(e === cc.KEY[‘9‘] || e === cc.KEY.num9) {
key = "9";
} else if(e === cc.KEY[‘-‘]) {
key = "-";
} else if(e === cc.KEY[‘.‘]) {
key = ".";
} else if(e === cc.KEY[‘,‘]) {
key = ",";
} else if(e == cc.KEY.left) {
key = "←";
} else if(e == cc.KEY.right) {
key = "→";
} else if(e == cc.KEY.up) {
key = "↑";
} else if(e == cc.KEY.down) {
key = "↓";
}
if(null != key) {
if(null == this._textBuf) {
this._textBuf = key;
this._curChracterNum++;
} else if(this._curChracterNum < this._maxChracterNum) {
this._textBuf += key;
this._curChracterNum++;
} else if(this._curChracterNum >= this._maxChracterNum) {
if(1 == this._textBuf.length)
this._textBuf = key;
else {
this._textBuf = this._textBuf.substr(1,this._textBuf.length - 1);
this._textBuf += key;
}
}
}
if(null == this._textBuf)
this._inputDisplayLayer.displayStr(" ");
else
this._inputDisplayLayer.displayStr(this._textBuf);
//alert("_textBuf: " + this._textBuf);
},
_updateImagesVisibility:function () {
if(this._isEnabled) {
if(typeof(this._inputDisplayLayer) != "undefined") {
this.setOpacity(0);
}
} else {
if(typeof(this._inputDisplayLayer) != "undefined") {
this.setOpacity(this._colorOpacity);
}
}
},
setOpacityModifyRGB:function() {
},
isOpacityModifyRGB:function() {
return false;
},
setInputStringLength:function(len) {
this._maxChracterNum = len;
},
getInputString:function() {
if(this._maxChracterNum != 0 &&
this._curChracterNum != 0)
return this._textBuf;
else
return null;
}
});
MenuItemInputBox.create = function(normalColor,selectedColor,width,height) {
var ret = new MenuItemInputBox();
ret.initWithNormalBgColor(normalColor,selectedColor,width,height);
return ret;
};
var InputMenu = cc.Menu.extend({
_isItemActive:false,
onTouchBegan:function(touch,e) {
if(this._state != cc.MENU_STATE_WAITING || !this._visible || !this._enabled) {
return false;
}
for(var c = this._parent;c != null;c = c.getParent()) {
if(!c.isVisible()) {
return false;
}
}
var _tmpSelect = null;
if(!this._isItemActive) {
this._selectedItem = this._itemForTouch(touch);
} else {
_tmpSelect = this._itemForTouch(touch);
}
if(this._selectedItem) {
if(!this._isItemActive) {
//this._state = cc.MENU_STATE_TRACKING_TOUCH;
this._isItemActive = true;
this._selectedItem.selected();
} else {
if(null == _tmpSelect) {
cc.Assert(this._state == cc.MENU_STATE_TRACKING_TOUCH,"[Menu onTouchEnded] -- invalid state");
this._isItemActive = false;
if(this._selectedItem) {
this._selectedItem.unselected();
}
//this._state = cc.MENU_STATE_WAITING;
} else if(_tmpSelect != this._isItemActive) {
//pressed other input box!
if(this._selectedItem) {
this._selectedItem.unselected();
}
_tmpSelect.selected();
this._selectedItem = _tmpSelect;
}
}
return true;
}
return false;
},
onTouchEnded:function(touch,e) {
},
onTouchMoved:function (touch, e) {
},
onKeyUp:function(e) {
},
onKeyDown:function(e) {
//alert("_isItemActived:" + !this._isItemActive);
if(!this._isItemActive)
return;
this._selectedItem.handleKey(e);
},
initWithArray:function (arrayOfItems) {
if(this.init()){
this.setKeyboardEnabled(true);
this.setTouchEnabled(true);
this._enabled = true;
//it seems that we can‘t get _visible value from parent
this._visible = true;
var winSize = cc.Director.getInstance().getWinSize();
this.ignoreAnchorPointForPosition(true);
this.setAnchorPoint(cc.p(0.5, 0.5));
this.setContentSize(winSize);
this.setPosition(cc.p(winSize.width / 2,winSize.height / 2));
if(arrayOfItems){
for(var i = 0; i< arrayOfItems.length; i++){
this.addChild(arrayOfItems[i],i);
}
}
this._selectedItem = null;
this._state = cc.MENU_STATE_WAITING;
return true;
}
return false;
}
});
InputMenu.create = function() {
var ret = new InputMenu();
if(arguments.length == 0) {
ret.initWithItems(null,null);
} else if(arguments.length == 1) {
if(arguments[0] instanceof Array) {
ret.initWithArray(arguments[0]);
return ret;
}
}
ret.initWithItems(arguments);
return ret;
};

文章由http://nk.39.net/shjl/nszx/nsjf/index.html整编发布

时间: 2024-10-06 12:19:27

cocos2d-html5的字符输入框的相关文章

HTML5中的输入框

1.双引号 <input type="text"/> 2.单引号 <input type='text'/> 3.无引号 <input type=text/> 上面三种情况是等价的

CSS3&amp;HTML5各浏览器支持情况一览表

CSS3性质(CSS3 Properties) 平台 MAC WIN 浏览器 CHROME FIREFOX OPERA SAFARI CHROME FIREFOX OPERA SAFARI IE 版本 5 3.6 10.1 4 4 3.6 3 10 10.5 4 6 7 8 RGBA Y Y Y Y Y Y Y Y Y Y N N N HSLA Y Y Y Y Y Y Y Y Y Y N N N Multiple Backgrounds Y Y N Y Y Y N N Y Y N N N Bor

TERSUS画画一样开发软件 显示元件介绍-输入框类显示元件

无代码手机电脑管理类软件开发,其中可拖放使用的输入框类显示元件包括:字符输入框元件(Text Field).多行文本输入框元件(Text Area).密码输入框元件(Password Field).数字输入框元件(Number Field).日期输入框元件(Date Field).带标签字符输入框元件(Text Labeled Field).带标签数字输入框元件(Number Labeled Field).带标签日期输入框元件(Date Labeled Field).带标签下拉选择菜单元件(Se

html5新增表单控件和表单属性

新的输入性表单控件: email:电子邮箱文本框,跟普通的没什么区别 - 当输入不是邮箱的时候,验证不通过 - 移动端的键盘会发生变化 tel:电话号码 url:网页的URL search:搜索引擎 - chrome下输入文字后,会多出一个关闭的X range:特定范围内的数值选择器 - min.max.step(步数) - 例子: 用js来显示当前数值 number:只能包含数字的输入框 - 输入框末尾有两个箭头 上为加 下为减 color:颜色选择器    - 点击显示颜色版   datet

XSS零碎指南

该文章是本人两天的学习笔记,共享出来,跟大家交流.知识比较零散,但是对有一定 JS 基础的人来说,每个小知识都有助于开阔你的 Hack 视角.首先声明,本文只是 XSS 攻击的冰山一角,读者自行深入研究. 本文地址:http://www.cnblogs.com/hustskyking/p/xss-snippets.html ,转载请保留源地址. 一.XSS学习提要 http://qdemo.sinaapp.com/ppt/xss/ 三水清 简单介绍 xss http://drops.wooyun

非常强的一款开源的分布式游戏服务端引擎(kbengine)

一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术,将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承载上限,kbengine底层架构被设计为多进程分布式动态负载均衡方案,理论上只需要不断扩展硬

串口屏之------Usart GPU 使用手册

Usart GPU 使用手册 文档更新日期 更新内容 2014-9-10 C编程sprintf问题 2014-8-8 版本程序1.0,升级了自定义波特率部分 ------ 原始版本 第一部分:基础应用 概述: Usart 是串口的意思,GPU 是图形处理器的意思,产品的含义是做一个单片机使用的专用图形处理器,或者称之为串口液晶显示模块. 一. 接线 开箱后,可以将串口输出的4根引脚焊上排插,使用杜邦线将串口接到USB转TTL线上,即可接到电脑USB口上上电,屏幕即会显示第一屏的Hello界面:

开源分布式游戏服务端引擎kbengine

服务端引擎: http://www.kbengine.org 什么是KBEngine? 一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端. 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游戏服务端通用的底层技术, 将精力真正集中到游戏开发层面上来,快速的打造各种网络游戏. (经常被问到承

公司准备使用KBEngine游戏服务端引擎

经过几个月的挑选, 看过柚子.scut.Photon, 最后选定KBEngine. 内部进行过一轮测试, 性能高效, 安全稳定, 分布式扩展强, 开发速度快. 这引擎挺不错的, 免费开源而且很完善, 文档.工具控制台.计费服务等等都不用操心了. 数据库部分完全不需要关注, 引擎能够自动的进行存储和同步, 网络部分在写逻辑时也基本感觉不到了, 总之就是方便稳定高效. 这是引擎的介绍: 一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互, 使用KBEngine插件能够快速与(