取巧实现cocos2d-x输入框的多行输入

声明:本博客为原创博客,转载请注明,原文地址为http://blog.csdn.net/chengyingzhilian/article/details/38660735

关于设计

关于如何实现多行输入,貌似cocos2d-x 一直没有解决,为啥UI会有如此缺陷呢。不该不该啊。网上搜索的基本的实现思路是:集成TextFieldTTF,然后重写关键算法。相对于这种正规军来说,下面的设计思路就算是取巧吧。

首先说明一下,EditBox是单行输入。虽然API wiki中出现多行的字眼。其次,LabelTTF是支持多行显示的。所以呢。取巧的方式正式采用EditBox+LabelTTF组合实现的。大体的设计思路呢,就是用Label
实时显示EditBox 的内容。

先看下设计图吧。

说明一下,绿色的框呢,表示屏幕界面,就这么大。多了看不到其他内容。

紫色的框呢表示输入区域,在此添加一个Label,用于显示输入的内容。

红色的区域是EditBox,左侧之所以要比屏幕长呢。原因有两点:

1 必须保证点击输入框位置能弹出输入法。这也就是输入框位置要有editBox 控件。

2.EditBox 要距离屏幕可识区域尽量的远,这样输入的单行内容就无法显示在EditBox中,而实时监听EditBox,一旦有变化更新到LabelTTF上。

灰色区域是一个事件遮罩。避免点击输入框外面而弹出输入框。

关于实现:

明白思路了,代码实现起来就简单多了。实现代码见本博客

在此呢。使用Lua 脚本实现。

<span style="font-family:KaiTi_GB2312;">function multLineInput:init()
    local Spritecache = cc.SpriteFrameCache:getInstance()
    local frame = Spritecache:getSpriteFrame("touming.png")
    local codeBg1 = cc.Scale9Sprite:createWithSpriteFrame(frame)
    local size = self.contentNode:getContentSize()

    local boxSize = cc.size(size.width,size.height)
    self.editBox = cc.EditBox:create(boxSize,codeBg1)
    self.editBox:setAnchorPoint(cc.p(0.0,0.0))
    self.editBox:setFontSize(0)
    self.editBox:setMaxLength(330)
    self.editBox:setOpacity(0)
    self.contentNode:addChild(self.editBox)

local handler = function(event)
    if event == "began" then
        self.editBox:setText( self.contentLabel:getString())
    end

    if event == "changed" then
        local str =  self.editBox:getText()
        self.contentLabel:setString(str)
    end

    if event == "return" then
       local str =  self.editBox:getText()
       self.editBox:setText("")
       self.contentLabel:setString(str)
    end
end
    self.editBox:registerScriptEditBoxHandler(handler)
end</span>

对于监听可使用registerScriptEditBoxHandler 来实现。注意在退出的时候,需要unregisterScriptEditBoxHandler。

不过有一点需要注意,输入框是没有光标的。

如果研究一些cocos2d-x 做的游戏,你用发现在多行输入的界面,有些也是没有光标的。比如 昆仑的《武侠Q传》也是这样实现的吗。

取巧实现cocos2d-x输入框的多行输入

时间: 2024-07-30 04:41:06

取巧实现cocos2d-x输入框的多行输入的相关文章

Java命令行输入求和的简单学习

思想:命令行输入的参数,必须先转换为数字才能进行加法计算,这就需要引用java.util.Scanner; 流程框图: 源代码: //实现几个整数相加的程序 //高开拓,2015.9.26 package add; import java.util.Scanner; public class Add { public static void main(String[] args){ Scanner scan = new Scanner(System.in); int n; System.out.

[Android新手区] android里面EditTex多行输入及输入置顶问题

在麦子学院android交流群里面有人问edittex多行输入及输入置顶的问题,其实这个效果很好的实现的,现在跟说说: 在EditText里面添加android:minLines="3"即可,但是现实效果如下: 如果想要使输入从顶部开始,可以在xml文件里面添加一句 android:gravity="Top"即可.效果如下:

c编程:输入一个数字n,则n代表n行,每行输入2个数字a,b计算每行的a+b问题。

输入 第一行输入要计算的数据组数 n 接下来的 n 行,每行包含两个数a和b 输出 每行输出一组数据中a+b的值 样例输入 2 1 2 4 0 样例输出 3 4 代码: #include<stdio.h> int main() { int n; int i,j;//循环变量i,j int a,b;//每行的两个整数a,b int sum[10]={0};//存储每行的和a+b scanf("%d",&n); for(i=0;i<n;++i) { scanf(&

编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。

编写一个程序,从标准输入读取几行输入.每行输入都要打印到标准输出上,前面加上行号. 在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制. #include <stdio.h> #include <stdlib.h> int main() { char ch = '0'; int n = 1; int flag = 1; while (1) { printf("please input the line: "); do { scanf("%c

ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.

#include<stdio.h> //每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多. /* 样例输入: 样例输出: 1 2 2 4 3 5 4 8 78 83 0 */ //78的二进制位1001110,有4个1:83比78大且83的二进制位1001011也是4个1. int main() { int count1,count2;//count1统计原数据对应的二进制中1的个数,count2... int a[100];//存输入的数字 int i=

Linux 命令行输入

这几天刚刚接触到Linux,在windows上安装的VMWare虚拟机,Centos7.安装什么都是贾爷和办公室的同事帮忙搞定的. 在虚拟机界面,按快捷键Ctrl+Alt+Enter,可以全屏显示Linux界面,再按一次则退出全屏. 如何在Linux里输入命令行,这个问题让我捉急了好一会儿,之后发现,选中任何一个文件夹或者什么,右键,选择在终端中打开,就进入命令行输入界面了. 可以输入su root进入root权限,输入密码时不显示的,输完回车就好 然后就能使用root权限了.在哪个文件需要使用

&lt;&lt;锋利的jQuery&gt;&gt;样例改进利用, html文本输入框得到与失去输入焦点的提示信息显示切换函数

该书第二版3.2.10一节中,介绍val()方法时,所用的样例代码是有共性的,而且该样例的场景模式在实际工作中会用到,所以试着优化了一下,写了一个html文本输入框得到与失去输入焦点的提示信息显示切换函数.原书代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

iOS实现多行输入

在iOS中.比較偷懒的一种做法.实现文本的多行输入.而且带有自己主动换行的功能,能够用UITextView来比較偷懒的实现. 实现代码就比較简单: UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 100, 100, 40)]; textView.layer.cornerRadius = 5; textView.layer.masksToBounds = YES; [self.view addSubvi

输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号

1 //编写一个程序,从标准输入读取几行输入.每行输入都要打印到标准输出上,前面要加上行号. 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main() 5 { 6 int ch; 7 int line; 8 int at_beginning; 9 line = 0; 10 at_beginning = 1; 11 while((ch = getchar()) != EOF){ 12 if(at_beginning == 1){