CocosCreator上实现自定义字体的输入框

CocosCreator3.8研究笔记(十二)CocosCreator 字体资源理解 系统字体是调用运行平台自带的系统字体来渲染文字,不需要用户在项目中添加任何相关资源。Cocos Creator 常用的字体资源有三种:系统字体、动态字体、位图字体。图片组成,fnt 文件提供了对每一个字符小图的索引。目前 Cocos Creator 支持。使用系统字体, Label 组件。中,即可完成字体资源的导入。格式的字体文件和一张。 阅读详情

目前CocosCreator的最新版本2.0.4提供的输入框组件cc.EditBox没有自定义字体的功能,而且文字也不能居中显示,为了实现这些功能,可以在cc.EditBox的基础上再包装一层,把原本cc.EditBox的文字隐藏,在其上方放置一个文本标签,通过监听cc.EditBox的输入事件来设置文本标签的内容。而文本标签cc.Label是可以设置字体以及实现对齐方式的,故而可以此来实现输入框的这些效果。

下载

  • 要预览输入框效果,可点击效果样例,下载后用CocosCreator打开运行。
  • 本人写的输入框脚本组件,下载后即可挂载到某个节点上即可使用,可在编辑器下运行。功能不完善,可能有bug,请指正。

实现

下面介绍一下主要的实现过程。

隐藏原本的cc.EditBox

新的输入框的实现借助了cc.EditBox的输入事件,而它原本显示的文本我们要隐藏掉,以便在那个位置上显示我们自己的文本标签。为了隐藏掉cc.EditBox的文本,本人试过了很多方法,把其所在节点active设置false虽然可以隐藏但输入框也无法响应操作了,自然不可行;透明度设为0或是把其放置到背景下层,输入的时候文字还是会浮现在最上层(后查知这似乎是与CocosCreator原生组件永远最后渲染有关);最后发现把其节点的高度设置为0就能实现文字的隐藏,但这样的话将无法点击到输入框,即无法开始输入。

点击开始输入

为了实现可以点击开始输入,查阅文档得知cc.EditBox有一个方法setFocus()。

setFocus
让当前 EditBox 获得焦点

当用户点击当前节点后调用这个方法可以强行开始输入,在手机端弹出键盘。
在CustomEditBox.js的onLoad中写入以下代码,以创建带cc.EditBox的节点:

//创建带输入框组件的节点。弹出及收起键盘、获取输入的文字,都是通过这个组件来实现的
let nodeEditBox = new cc.Node("EditBox");
nodeEditBox.width = this.node.width;
//高度为0,以隐藏输入时显示的文字
nodeEditBox.height = 0;
this.node.addChild(nodeEditBox, 0);
//添加并设置输入框组件
let editBox = nodeEditBox.addComponent(cc.EditBox);
editBox.inputMode = cc.EditBox.InputMode.SINGLE_LINE;
editBox.maxLength = this.maxLength;

然后监听触摸结束事件,在回调函数中调用setFocus开始输入。此时只能监听触摸结束事件,因为如果在触摸开始或触摸移动中调用setFocus,接下来一定触发触摸结束事件,而触摸结束事件触发时会使输入框失去焦点而使得输入结束,最终导致点击开始输入后立即就结束了。

//监听cc.EditBox组件产生的事件,以实现变更输入文字,结束输入的操作
this.node.on("touchend", () => {
    this._startEdit();
});
创建显示输入文字的节点

首先在脚本文件的properties字段中声明一个字体资源的属性,以便用户可以在编辑器中拖拽字体资源来设置字体。

font: {
    displayName: "字体",
    type: cc.Font,
    default: null,
    //设置notify以在编辑器中实时预览设置效果
    notify: function () {
    	if (this.node) {
    		//获取文字显示节点的Label组件并设置其字体
    		this.node.getChildByName("Text").getComponent(cc.Label).font = this.font;
    	}
    }
}

关于更多的属性声明的内容可以参阅CocosCreator脚本属性在属性面板的显示

//创建文本显示节点。显示在输入框输入的文字,通过读取cc.EditBox组件的文字来更新自身文字内容
let nodeText = this.node.getChildByName("Text");
if (!nodeText) {    //获取并判断名为Text的子节点是否存在是为了编辑器中不重复创建节点
    nodeText = new cc.Node("Text");
    this.node.addChild(nodeText, 1);
    //添加并设置Label组件
    let label = nodeText.addComponent(cc.Label);
    //设置字体
    if (this.font) {
        label.font = this.font;
    }
}

有了显示输入内容的节点,就可以在点击开始输入时显示闪烁的光标,以提示用户可以开始输入了。

光标闪烁

为了实现在脚本的onLoad中创建光标,而不依赖任何外部图像资源,且要与字体颜色保持一致,可以创建一个Label的节点,其文字设置为一个特殊字符: █,即完全填充一个字符位置的色块。然后设置Label组件的overflow为 CLAMP,节点宽度为1。这样文字被截成宽度为1,高度为行高的字符,正好可以用来做光标。

而光标闪烁实现可以在脚本文件的update中更新光标节点的可见性。

ctor() {
    //光标节点的引用
    this._cursor = null;
    //标记当前是否处于编辑状态
    this._isEditing = false;
    //实现光标闪烁所需的计时器
    this._blinkTimer = 0;
},
//每帧更新光标的状态
update(dt) {
    if (!CC_EDITOR) {    //编辑器下不更新光标
        this._updateCursor(dt);
    }
},
//实现光标闪烁
_updateCursor(dt) {
    if (!this._isEditing) {    //不是编辑状态
        this._cursor.active = false;
        return;
    }

    if (this._blinkTimer >= 0.5) {    //计时器运行了0.5秒
    	//重置计时器
        this._blinkTimer = 0;
        //反转光标节点可见性
        this._cursor.active = !this._cursor.active;
    } else {    //计时器还没到0.5秒
    	//计时器增加两帧之间的时间间隔
        this._blinkTimer += dt;
    }
}
显示正在输入的文字

通过监听cc.EditBox的节点上的text-changed事件,可在输入文字改变时获取cc.EditBox的文字,以此来更新显示出来的文字。

//this._editBox为cc.EditBox的引用
this._editBox.node.on("text-changed", () => {
		//this._labelText为用于显示文字的Label组件的引用
    	this._labelText.string = this._editBox.string;
    }
});

至此,CustomEditBox已经可以实现点击开始输入文字,光标闪动,按下键盘可以看到输入文字的增加,但还没实现结束输入。结束输入可以监听上面代码中的this._editBox的editing-did-ended事件,在事件回调中隐藏光标,即表示结束输入了。
Android平台和微信小游戏平台会出现点击输入框之外无法结束输入,翻阅Cocos文档并没有发现可以主动失去焦点的API,故这个问题还没有很优雅的解决方案。

CocosCreator 3.8字体资源全解析:系统字体、TTF与位图字体选型与优化实战 在游戏开发中,字体渲染是UI系统的关键技术,它直接影响视觉表现、多语言支持与运行时性能。其核心原理在于将字符信息转换为屏幕像素,主要分为矢量轮廓解析和位图贴图两种方式。从技术价值看,高效的字体方案能显著提升界面流畅度、控制包体大小并确保跨平台一致性。在应用场景上,动态文本、多语言UI、像素风游戏或对性能有极致要求的界面,各自需要不同的技术方案。本文聚焦于CocosCreator引擎,深入探讨系统字体、TTF动态字体和位图字体这三种核心方案。其中,TTF动态字体的字体子集化是优化资源体积的关键实践,而位图字体 阅读详情

相关推荐

CocosCreator 3.8字体系统全解析:系统字体、动态字体与位图字体实战指南

在游戏开发与跨平台应用构建中,字体渲染是影响用户体验与性能的关键技术环节。其核心原理涉及从矢量轮廓到屏幕像素的栅格化过程,不同的字体技术方案在此流程上存在显著差异。从技术价值看,高效的字体管理能直接提升应用性能、优化包体大小并确保多平台显示一致性。在CocosCreator等游戏引擎的应用场景中,开发者常面临**动态字体**加载导致的渲染闪烁与**位图字体**制作繁琐等挑战。本文聚焦于CocosCreator 3.8,深入探讨如何系统化地规划与实施字体解决方案,以应对这些常见痛点,实现稳定高效的文字渲染。

weixin_30608503的博客 313

cocos2d调用虚拟键盘

cocos2d没有自己的键盘输入(当然也不需要有,一个ios的游戏引擎做键盘干嘛。。。。。。),在网上查找资料,发现大家都是代码建立一个UITextField控件,通过激活此控件,来达到显示键盘的目的。总结如下:1.建立UITextField为了方便将来关闭键盘,我将此UITextField作为我的menu layer的一个成员。    @interface MainMenuLayer : CCLayer {IBOutlet UITextField *textField;}@property(retain,

漫长的曲折 3150

CocosCreator3.8字体资源实战:5分钟搞定TTF动态字体导入与性能优化

本文详细介绍了在CocosCreator3.8中如何快速导入TTF动态字体并进行性能优化的实战技巧。通过对比动态字体与系统字体的性能差异,提供字体子集化、多语言加载策略等高级优化方法,帮助开发者提升游戏视觉效果和运行效率。

purple的博客 1121

cocos textfield调用android键盘,Cocos2dx:在安卓平台使用原生输入框

《cocos2d Android 平台EditBox 2.x升级到3.12 输入框使用 原生控件 可以复制 粘贴》http://blog.youkuaiyun.com/Phan_Chen/article/details/53141990最终解决方案:更改windowSoftInputMode为adjustNothing:将Cocos2dxActivity.java中的下面一句代码注释掉:window.setS...

weixin_42516490的博客 602

CocosCreator跨平台字体渲染异常:TTF元数据修复与位图字体实战

在跨平台应用与游戏开发中,字体渲染一致性是UI/UX实现的基础挑战。其核心原理在于,TrueType Font(TTF)等字体文件包含的元数据(如字体名称、度量值)在不同操作系统和渲染引擎(如Windows的DirectWrite、iOS的Core Text、Android的FreeType)下的解析与渲染逻辑存在差异,这直接影响了文本的视觉呈现。从技术价值看,解决字体兼容性问题能保障产品设计还原度,提升多端用户体验的一致性。尤其在CocosCreator等跨平台游戏引擎中,当TTF字体在编辑器预览正常,而

weixin_33519829的博客 771

【包教包会】CocosCreator组件label实现字体合批、变色、排版

包教包会、ccLabel合批、组件、Typescript

CocosCreator水煮肉片饭的博客 2372

Android Edittext 输入法软键盘屏蔽,有光标

方式一: [java] view plaincopyprint? /** 输入法软键盘屏蔽,有光标*/   private void srfpb(EditText text) {       if (android.os.Build.VERSION.SDK_INT 10) {//4.0以下              text.setInputTyp

Dijkstra的专栏 1238

CocosCreator3.8字体资源全攻略:系统字体、TTF动态字体、位图字体实战对比

本文深度解析了CocosCreator3.8中系统字体、TTF动态字体与位图字体三大字体资源的性能机制与实战应用。通过详尽的性能测试数据对比,为开发者提供了清晰的选型策略:系统字体性能最优但不可控,TTF字体灵活但开销大,位图字体在艺术风格与渲染性能上表现卓越。文章还分享了位图字体生成的高级技巧与混合字体策略,旨在帮助开发者在游戏UI开发中实现性能与表现力的最佳平衡。

weixin_29011993的博客 407

【Cocos新手入门】使用 cocos creator 创建单行文本输入框及多行文本输入框

本篇文章主要讲解使用 cocos creator 创建单行文本输入框及多行文本输入框,并绑定文本框获取文本输入数据的方法。作者:任聪聪日期:2023年2月2日cocos引擎版本2.4.3。

任聪聪的博客 2631

CocosCreator3.8实战指南:系统字体、动态字体与位图字体的高效应用

本文深入解析CocosCreator3.8中系统字体、动态字体(TTF)与位图字体三大字体资源的核心应用策略。详细对比了各自的优缺点、适用场景与性能影响,并提供了跨平台适配指南与实战优化技巧,如字体子集化与混合方案,帮助开发者根据项目需求做出高效选择,实现UI效果与性能的最佳平衡。

desk3的博客 960

游戏UI必备!CocosCreator位图字体全攻略:从BMFont制作到特效文字实现

本文详细介绍了CocosCreator 3.8中位图字体的全流程开发,从BMFont工具配置到Shader特效实现。涵盖字符集优化、移动端适配、多语言处理及性能优化策略,帮助开发者打造风格化游戏UI,提升渲染效率与视觉效果。特别适合需要定制化字体和特效的游戏开发场景。

threejs5artist的博客 608

CocosCreator之字体资源

字体资源 使用 Cocos Creator 制作的游戏中可以使用三类字体资源:系统字体,动态字体和位图字体。 其中系统字体是通过调用游戏运行平台自带的系统字体来渲染文字,不需要用户在项目中添加任何相关资源。要使用系统字体,请使用Label组件中的Use System Font属性。 导入字体资源 动态字体 目前 Cocos Creator 支持TTF格式的动态字体。只要将扩展名为TTF的字体文件拖拽到资源管理器中,即可完成字体资源的导入。 位图字体 位图字体由fnt格式...

码之有道 4109

Hadoop实战:用MapReduce分析YouTube视频数据集(附完整代码)

本文提供了一个完整的Hadoop MapReduce实战教程,指导读者使用MapReduce框架分析YouTube视频数据集,统计不同视频类别的数量分布。教程涵盖从数据获取、预处理、HDFS操作到Java代码编写、作业提交及结果可视化的全流程,并附有完整代码,帮助开发者深入理解分布式计算思想。

lilh34434的博客 198

CocosCreator字体加载失败:从根因到多平台解决方案

在游戏和应用开发中,字体加载是UI渲染的基础环节,它直接影响品牌调性和用户体验。其原理涉及资源加载机制、网络请求和平台兼容性。当字体加载失败时,通常意味着资源路径、HTTP协议或文件本身出现了问题,这在跨平台部署和动态资源管理中尤为关键。从技术价值看,稳定的字体加载确保了视觉一致性,是提升产品专业度的基础。常见的应用场景包括Web应用、移动端游戏和各类需要定制化UI的交互界面。本文将聚焦于CocosCreator引擎中常见的“Download Font failed”错误,深入剖析其背后的平台差异、CORS

weixin_30780649的博客 387

STM32独立实现CANOpen主机功能:从零构建轻量级控制方案

本文详细介绍了如何在STM32上不依赖CanFestival库,从零构建一个轻量级的CANOpen主机方案。文章深入剖析了CANOpen主机的三大核心功能——NMT网络管理、SDO参数配置与PDO过程数据交换,并提供了从硬件准备、驱动层构建到协议实现的完整代码实战。该方案代码精简,资源占用低,特别适合在资源受限的STM32平台上实现工业控制、电机驱动等场景的稳定通信。

potato的博客 1072

解决相同型号USB设备在Windows系统中重复枚举问题

本文详细解析了Windows系统中相同型号USB设备重复枚举问题的成因及解决方案。通过修改注册表、使用PsTools工具清除设备记录以及编程实现自动化处理等方法,有效解决设备识别混乱问题,特别适用于自动化测试和工业设备管理场景。

weixin_42561040的博客 565

CocosCreator 3.8字体资源全解析:系统字体、TTF与位图字体实战选型

在游戏开发与前端项目中,字体渲染是影响性能与用户体验的关键技术。其原理涉及从矢量轮廓到屏幕像素的栅格化过程,不同的字体资源管理方式直接决定了内存占用、CPU开销和包体大小。从技术价值看,合理的字体选型能显著提升渲染效率、保证跨平台一致性并控制资源体积。在CocosCreator等游戏引擎或Web应用场景中,开发者常面临系统字体、TTF动态字体和位图字体的选择。例如,针对需要极致性能的固定文本,如得分显示,位图字体凭借其纹理贴图的查表机制,能实现极高的渲染效率;而对于包含大量动态内容的对话系统,经过字符集裁剪

weixin_33709219的博客 356

USB PD快充功率监测仪:高精度嵌入式USB电压电流测量终端

USB供电已从数据接口演进为关键电源总线,尤其在PD快充场景下,工程师亟需对5V–20V宽压范围内的实时电压、电流及瞬时功率进行精准捕获。其底层原理依赖高共模抑制比的高边电流检测与分压采样+ADC数字化处理,结合LDO低噪声供电保障模拟链路精度。该类设备的技术价值在于以低成本实现协议无关的‘电气层可视化’,规避商用ASIC测试仪的黑盒局限,支撑PD充电验证、电源设计调试与教学实验等工程实践。本文介绍的开源USB表即基于N32G430 MCU与INA199电流检测芯片,覆盖USB-C输入/输出双通道监测,具备

weixin_42174098的博客 207

一句代码实现CocosCreator版本2.2的字体阴影

摘要 CocosCreator 的 2.2.0 版本正式上线,一大亮点就是 Effect 语法更加方便理解了。今天 KUOKUO 就教大家用一句代码来实现字体的阴影。 正文 先看效果 一下子就有立体感了是吧!其实很简单,看步骤。 新建标签 在场景中新建一个标签,我们可以看到右下角就是默认的材质。那么要想自定义特殊效果很显然得新建自己的材质。 材质与Effect 我们在文件层级中新建 Effe...

kuokuo666的博客 1971

Multisim 14.0 实战:手把手教你仿真一个9MHz高频小信号放大器(附完整电路文件)

本文详细介绍了如何使用Multisim 14.0仿真一个9MHz高频小信号谐振放大器,从环境准备、电路设计到仿真参数设置与调试,手把手教你掌握射频电路仿真的核心技巧。适合电子工程师和学生快速上手高频电路设计,附完整电路文件供参考。

weixin_30335575的博客 113

cadence CIS 库建立--建立自己维护的CIS数据库

遇到一个问题,在使用cadecnce的时候,就是没有自己的本地/分享的数据库。 在画原理图或者PCB的时候,如果能搭建一个自己的数据库,在局域网或者本地 就好了。出于这样的想法,做了一些探索,找到了一种可能的答案。 由于数据库编制知识的缺乏,要自己建一个数据库似乎花费的时间会比较多。 偶发奇想,如果能够改编CIS 自带的数据库 另建立副本进行维护 就能够省下不少麻烦。 先说下CIS 是个啥。网上一搜:总之CIS 是个好东西。 功能强大。 点击CIS capture 中的 Options CIS Config

qq_29776365的博客 2万+

CocosCreator位图字体全攻略:从BMFont制作到特效UI性能优化

在游戏UI开发中,文字渲染是影响性能和表现的关键环节。系统字体组件在渲染复杂特效时往往面临性能开销大、效果单一的问题。位图字体技术通过预渲染字符为纹理图集,利用UV映射进行拼合,其核心原理在于将矢量轮廓计算和网格生成的开销转移到资源制作阶段,从而在运行时实现极高的渲染效率。这项技术的核心价值在于能显著降低GPU的绘制调用,尤其适用于对性能敏感的移动端H5小游戏和微信小游戏场景。通过专业的位图字体生成工具BMFont,开发者可以精细控制字符集、间距和抗锯齿,生成.fnt描述文件和对应的纹理图。结合图像处理软件

weixin_34007886的博客 355

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

本文介绍了在项目开发中实现坐标转换的方法,重点解析了两个关键函数UF_MTX4_csys_to_csys和UF_MTX4_vec3_multiply的使用。通过4个变换矩阵(transform1-4)实现工作坐标系与绝对坐标系之间的相互转换,并以圆柱体为例详细说明了坐标转换的具体实现过程,包括原点、X/Y轴方向的转换处理。相比之前采用的if-else判断方法,这种矩阵转换方式在代码复杂度和运行效率上都更具优势。

weixin_47753171的博客 599

CocosCreator批量更换整个项目的所有字体(使用了邪术,曲线救国)

CocosCreator如何批量更换整个项目的所有字体 在CocosCreator会遇到一个问题,制作Creator工程的时候会产生一个问题,就是每一个文本都要去赋予字体的属性,那么如何将文本node统一赋予某一个字体? ...

BlackBox5的博客 2468

LSTM 深度解析从原理推演到现代序列建模的演进

LSTM(Long Short-Term Memory,长短期记忆网络)是一种特殊的递归神经网络(RNN),它通过引入记忆单元(Cell State)来解决普通RNN在长序列数据处理中的梯度消失问题。LSTM可以在长时间的序列中捕捉依赖关系,是一种非常适合处理时间序列、自然语言处理、语音识别等任务的深度学习模型。在LSTM中,记忆单元(Cell State)是一个贯穿整个序列的数据通道,用于存储和传递关键信息。记忆单元在LSTM的时间步之间保持信息的持久性,可以看作是一个长期记忆的“容器”。

hello.reader 3万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CocosCreator -- 根据字体样式获取Label宽高

游戏中我们会用到很多的提示小窗口,同时根据不同文本配置和字体大小要求适配出最合适的框大小,在CocosCreator中怎么实现对应效果呢。 先看下面效果:,更改文字内容,变成了这个样式: 实现核心代码如下: export class LabelUtil { static lable: cc.Label; /** * @param text 要显示文本内容 *...

阳仔博客 5550

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: CocosCreator脚本属性在属性面板的显示
下一篇: Unity中使用动画状态机控制Spine动画
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值