打字机效果换行怎么处理?

试了下如果是bmfont char模式可以将assembler.updateColor 方法替换,在写入顶点颜色数据的时候直接把后面几个字符刷成透明色。这样可以保证字体的位置始终不变。

        let assembler = this.lblText._assembler;
        assembler.updateColor = (comp, color) => {
            let uintVerts = assembler._renderData.uintVDatas[0];
            if (!uintVerts) return;
            color = color != null ? color : comp.node.color._val;
            let floatsPerVert = assembler.floatsPerVert;
            let colorOffset = assembler.colorOffset;
            let k = 0;

            // showCount表示要显示的字符数,在外部控制
            let showVertsCount = that._showCount * 4;
            for (let i = colorOffset, l = uintVerts.length; i < l; i += floatsPerVert) {
                if (k < showVertsCount)
                    uintVerts[i] = color;
                else
                    uintVerts[i] = 0;  // 后面的字符刷成透明色

                ++ k;
            }
        }

调整显示字符数的时候,增加showCount,并设置颜色的脏标记即可

        this._showCount += 1;
        this.lblText.node._renderFlag |= cc.RenderFlow.FLAG_COLOR;

不过对于非bmfont或非char模式,这种方式没有效果。
字体渲染的不同情况太多,已经看晕了。

1赞

虽然我没看懂,但是不影响我说一句大佬6p

不是这个问题。。。是因为我单字符输出,可能每行最后一个单词会出现跳行的问题

昨天的问题用shader处理了,新问题来了。。。由于换行导致的参差不齐的问题,感觉始终还是的用“-”手动去连啊。。。。这就很难受了

需要的自取,自己用的就没写注释了
lineWidth传的单行宽,lineHeight是单行高,width是当前显示宽度,height是节点高度
type-writer.effect.zip (909 字节)

我的使用代码:
截屏2022-02-16 上午10.18.47

// 取文本宽度这里赋值完成的当前帧获取不到实际宽度,做了个延时到下一帧获取
截屏2022-02-16 上午10.21.04

// 取节点高度这里我是做了个进场动画,进场后再取的高度
截屏2022-02-16 上午10.21.47

截屏2022-02-16 上午10.22.14

1赞

新问题还好吧,正常单词长度有限,大部分情况下尾部不会留很大的空

但愿如此。。。如果说起来了我就叫美术出成图片算了 :joy:
本身我这也不好布局

如果你的每个字符是等宽的,你就能直接算出来第几个需要加连字符了,如果不等宽,假如知道每个字符的宽也能每次打出一个字就知道增加了多宽,也能算出连字符的位置,手动打就太累了

:rofl:确定字体的话可以脱机算一下每个常用字符的宽度记下来?

把底层字符串处理的方法copy出来改改就行了。底层换行也是加\n实现的吧我记的没错的话

1赞

我去看看 :+1:

首先空格和其他就不等宽。。。然后再加其他符号就更难受了

难受了,你这是3.x的吧。。。?2.x的不一样。。。

2.4.5

2.4.2搜不到。。。

刚找到了,正在看

文字一开始全部显示, 然后用mask控制