策划同学想在游戏内增加投显子弹数量的功能,看了下Laya中并没有提供3d文本相关的组件,所以先去百度下看了下并没有相关的轮子可以直接使用,只能自己写下了

首先分析下需求 子弹数量投显 只需要显示0-9的数字就可以了
那么最简单的一种方式是:
让建模同学每一位搞一个面片 然后把对应的数字贴图贴上去 有几位搞几个面片
显然这种方式是最差解。。。

既然是造轮子,当然不能就这样结束了!

所以,决定用一张贴图一面片来实现这个功能
那么问题点就在于:怎么把0-9这几个数字在运行时实时的将需要的散图合并成一张新的贴图 ,然后放到材质中去渲染
Laya中有可以获取到加载后的图片的像素数据的接口 即 Texture.getTexturePixels
关键代码:

            var ctx = new ILaya.Context();ctx.size(width, height);ctx.asBitmap = true;var uv = null;if (x != 0 || y != 0 || width != tex2dw || height != tex2dh) {uv = this._uv.slice();var stu = uv[0];var stv = uv[1];var uvw = uv[2] - stu;var uvh = uv[7] - stv;var uk = uvw / texw;var vk = uvh / texh;uv = [stu + rePosX * uk, stv + rePosY * vk,stu + (rePosX + draww) * uk, stv + rePosY * vk,stu + (rePosX + draww) * uk, stv + (rePosY + drawh) * vk,stu + rePosX * uk, stv + (rePosY + drawh) * vk];}ctx._drawTextureM(this, marginL, marginT, draww, drawh, null, 1.0, uv);ctx._targets.start();ctx.flush();ctx._targets.end();ctx._targets.restore();var dt = ctx._targets.getData(0, 0, width, height);ctx.destroy();ret = new Uint8Array(width * height * 4);st = 0;dst = (height - 1) * wstride;for (i = height - 1; i >= 0; i--) {ret.set(dt.slice(dst, dst + wstride), st);st += wstride;dst -= wstride;}return ret;

这段操作就是将图片绘制到上下文中,并拿出像素数据,这时候拿到的数据如果直接使用的话会发现图片是上下颠倒的,需要对像素数据进行重新排列,最后将重排后的数据ret,return出去

理解后就可以对贴图进行合并了

以下为demo测试代码可以稍加修改直接使用

export default class UnlitNumberMaterial extends Laya.UnlitMaterial {/**数字资源地址 */private _numResTitle: string = "";/**加载标志 */private _loadedTag: boolean = false;/**要渲染的数字 */private _renderStr: string = "";/**显示几个数字  也就是有几位*/private _numberCount: number = 4;/**贴图宽度 */private _textureW: number = 64;/**贴图高度 */private _textureH: number = 64;constructor() {super();this.renderMode = Laya.UnlitMaterial.RENDERMODE_TRANSPARENT;}set fontType(type: string) {this._numResTitle = `${type}/num_`;Laya.loader.load(`res/atlas/${type}.atlas`, Laya.Handler.create(this, this.loadResComplete));}private loadResComplete() {this._loadedTag = true;this.refreshTexture();}set renderNumber(str: string) {this._renderStr = str;if (this._loadedTag) {this.refreshTexture();}}private refreshTexture() {let texW = this._numberCount * this._textureW, texH = this._textureH;let texture2d = new Laya.Texture2D(texW, texH, Laya.TextureFormat.R8G8B8A8, false, false);let renderTextures = this.getRenderTextures();let len = renderTextures.length;let totalWidth = len * this._textureW;let startX = (texW - totalWidth) / 2;for (let i = 0; i < renderTextures.length; i++) {let tex = renderTextures[i];texture2d.setSubPixels(startX + i * this._textureW, 0, this._textureW, this._textureH, tex.getTexturePixels(0, 0, this._textureW, this._textureH));}this.albedoTexture = texture2d;}private getRenderTextures() {let renderTextures = [];for (let index = 0; index < this._renderStr.length; index++) {let numTexture = Laya.loader.getRes(`${this._numResTitle}${this._renderStr[index]}.png`);if (numTexture) {renderTextures.push(numTexture);}}return renderTextures;}
}

Laya中贴图实时合并相关推荐

  1. 一文了解推荐系统中的图神经网络

    来源:RUC AI Box本文约4600字,建议阅读9分钟 本文主要介绍推荐系统中的图神经网络,欢迎交流探讨! [ 引言 ]近年来,GNN技术由于其在图数据学习方面的出色表现,在许多领域得到了广泛的应 ...

  2. python中e-r图_E-R图基本步骤

    以自底向上设计概念结构的方法为例,它通常分为两步: 第一步:首先要根据需求分析的结果(数据流图.数据字典等)对现实世界的数据进行抽象, 设计各个局部视图即分E-R图. 第二步:集成局部视图. 概念结构 ...

  3. Worktile 中百万级实时消息推送服务的实现

    Worktile 中百万级实时消息推送服务的实现 转自:http://www.360doc.com/content/15/0907/19/1073512_497529854.shtml 这是一个创建于 ...

  4. html合并单元格怎么把字竖着,电脑excel单元格中文字如何在合并单元格后竖排显示...

    电脑excel单元格中文字如何在合并单元格后竖排显示 excel软件是我们现在经常使用的数据处理工具之一,接下来小编就教大家怎样在软件中设置合并单元格之后竖排显示文字. 具体如下: 1. 首先我们需要 ...

  5. 在Unreal引擎中利用实现实时动作捕捉

    在Unreal引擎中利用实现实时动作捕捉 前言: 准备的软件: 准备工作: 为motionbuilder安装livelink插件: 演员及Motionbuilder准备: 捕捉流程 将Motionbu ...

  6. 如何在图数据库中训练图卷积网络模型

    在图数据库中训练GCN模型,可以利用图数据库的分布式计算框架现实应用中大型图的可扩展解决方案 什么是图卷积网络? 典型的前馈神经网络将每个数据点的特征作为输入并输出预测.利用训练数据集中每个数据点的特 ...

  7. 原创:Spark中GraphX图运算pregel详解

    原创:Spark中GraphX图运算pregel详解 由于本人文字表达能力不足,还是多多以代码形式表述,首先展示测试代码,然后解释: package com.txq.spark.test import ...

  8. 怎么对阿里iconfont两个项目中的字体图标合并

    1.把下载下来的2个文件夹都放入项目中 2.如要把iconfont2文件夹中的字体图标合并到iconfont文件夹中,则如下图,修改iconfon2文件夹下左侧该图标的五个文件名,同时修改这个文件夹中 ...

  9. android模糊检索_Android中实现输入框实时模糊搜索效果的方法

    Android中实现输入框实时模糊搜索效果的方法 发布时间:2020-08-13 16:27:11 来源:亿速云 阅读:161 作者:小新 Android中实现输入框实时模糊搜索效果的方法?这个问题可 ...

最新文章

  1. 显示一些整数的最大公因子
  2. leetcode算法题--最长湍流子数组
  3. Linux(DeepInOS) 下 mysql 的安装与基本配置
  4. oracle:主键,外键
  5. PostgreSQL技术周刊第20期:PostgreSQL何以支持丰富的NoSQL特性?
  6. linux命令 - alias
  7. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 提高Java架构师和程序员效率的10个工具
  9. java删除数组里的两个_java – 如何从两个数组列表中删除常用值
  10. 82.反向代理与负载均衡原理
  11. xShell+xFtp 破解版
  12. matlab中edge函数,matlabedge函数用法
  13. linux下查看共享文件夹,在Linux下查看共享文件夹
  14. mysql启动报sock_mysql启动错误:mysql.sock丢失
  15. 2021年中国传感器行业产业链分析:智能时代发展下,传感器市场需求旺盛[图]
  16. 微软官方Windows7 Ultimate with SP1 DVD 官方简体中文原版下载
  17. 机器学习 --- 概率图 - 表示 - 动态模型
  18. WPF字体图标——FontAwesom
  19. python多维数组分位数的求取
  20. 小猪佩奇的4种python玩法,带你趣味学python!

热门文章

  1. linux内核模块编程(六)----字符设备驱动中断开发
  2. 【模拟集成电路】环路滤波器(LPF)设计
  3. 什么是Linux主机?
  4. 小学老师工资多少一个月_小学教师工资待遇现在怎么样?乡村老教师含泪哭诉!...
  5. win10更新后,多了个500M的磁盘;
  6. SW2021软件安装教程
  7. 快速排序和归并排序中一趟的理解(递归和非递归)
  8. 怎么样使父元素的overflow:hidden不影响到子级absolute绝对定位元素
  9. SA387GR11CL2钢板密度
  10. ROS .bashrc笔记