开源游戏引擎Godot3.2重大更新,支持更华丽的动态富文本特效

开源游戏引擎Godot3.2

  • 开源游戏引擎Godot3.2近期更新,支持BBCode富文本

开源游戏引擎Godot3.2近期更新,支持BBCode富文本


此PR添加了一种支持实时文本效果的新ItemFX类型RichTextLabel。这还增加了使用自定义RichTextEffect扩展添加附加bbcode命令的功能(灵感来自于#23135)。

当/如果它被批准为一项新功能,我将需要编写更多文档。以下是这两个功能的简要介绍:

您可以在此处下载此提交的示例项目:RichTextEffects.zip。这是体验通过此提交所做的更改的最佳方法,但是下面链接了一些gfycat示例。

新的实时文本效果
实时特效将更新并绘制每一帧。如果在bbcode字符串中找到ItemFX键入的效果,它将自动启用set_process。这意味着RichTextLabel如果使用了动态文本效果,则仅需要处理每个帧。


  1. 文本将根据其相对X位置在Y轴上上下波动。
    amp= 波的振幅。
    freq= 波的频率。

  2. 龙卷风
    [center]Here’s a look at the [tornado radius=5 freq=5]tornado[/tornado] text effect.[/center]
    文本将以循环方式移动。每个字符在圆周上的位置将由其x位置确定,从而产生有趣的波纹效果。
    radius= 控制其偏移的圆的半径。
    freq= 整圈运动的频率。

  3. 抖动
    [center]Here’s a look at the [shake rate=15 level=10]shake[/shake] text effect.[/center]
    rate= 文字重新定位的频率
    level= 文字与原点的偏移量

  4. 褪色
    [center]Here’s a look at the [fade start=4 length=14]fade text effect…[/fade][/center]
    根据起始位置和长度值淡出文本。
    start=起始位置衰减。相对于淡入命令的插入位置。
    length=应该淡出多少个字符。(粗略的衰减控制。)

  5. 彩虹[center]Here’s a look at the [rainbow freq=0.2]rainbow[/rainbow] text effect.[/center]
    根据x位置和时间为文本提供彩虹色分配。
    freq= 每秒完整的彩虹周期数。
    sat= 彩虹的饱和度。
    val= 彩虹的值(例如亮度)。
    自定义BBCode和文本效果
    2018-11-11 16-44-13的屏幕截图

现在,您可以扩展RichTextEffect资源类型以创建自己的自定义BBCode。您可以查看示例项目以获取更多详细信息,但是下面是一个粗糙的示例。

扩展:
您首先要扩展RichTextEffect资源类型。tool如果希望这些自定义效果在编辑器中运行,请在gdscript文件中添加前缀。RichTextLabel不需要附加脚本,也不需要在tool模式下运行。

以下是一些自定义效果的示例:

鬼影
tool extends RichTextEffect

var bbcode = “ghost”

func _process_custom_fx(char_fx):

var speed = char_fx.get_or("freq", 5.0)
var span = char_fx.get_or("span", 10.0)

var alpha = sin(char_fx.elapsed_time * speed + (char_fx.absolute_index / span)) * 0.5 + 0.5
char_fx.color.a = alpha
return true;
  1. 脉冲

tool extends RichTextEffect

var bbcode = “pulse”

func _process_custom_fx(char_fx):
var color = char_fx.get_or(“color”, char_fx.color)
var height = char_fx.get_or(“height”, 0.0)
var freq = char_fx.get_or(“freq”, 2.0)

var sinedTime = (sin(char_fx.elapsed_time * freq) + 1.0) / 2.0
var y_off = sinedTime * height
color.a = 1.0
char_fx.color = char_fx.color.linear_interpolate(color, sinedTime)
char_fx.offset = Vector2(0, -1) * y_off
return true
  1. 矩阵

tool extends RichTextEffect

var bbcode = “matrix”

func _process_custom_fx(char_fx):
var clear_time = char_fx.get_or(“clean”, 2.0)
var dirty_time = char_fx.get_or(“dirty”, 1.0)
var text_span = char_fx.get_or(“span”, 50)

var value = char_fx.character

var matrix_time = fmod(char_fx.elapsed_time + (char_fx.absolute_index / float(text_span)), \
						clear_time + dirty_time)

matrix_time = 0.0 if matrix_time < clear_time else \
			(matrix_time - clear_time)/dirty_time

if( value >= 65 && value < 126 && matrix_time > 0.0 ):
	value -= 65
	value = value + int((1 * matrix_time * (126-65)))
	value %= (126 - 65)
	value += 65
char_fx.character = value
return true

您只需扩展一个名为named的函数_process_custom_fx(char_fx)。(可选)您还可以通过添加成员名称bbcode来提供自定义bbcode标识符。该代码将自动检查bbcode,或者仅使用文件名来确定bbcode应该是什么。

_process_custom_fx。
这是每种效果的逻辑发生的地方,在文本渲染的绘制阶段每个字符调用一次。这传入了一个CharFXTransform对象,该对象包含一些控制如何呈现关联字符的变量。第一个是identity,它将指定要处理的自定义效果。您应该将其用于代码流控制。relative_index将告诉您作为索引位于给定自定义效果块中的距离。absolute_index会告诉您作为索引在整个文本中的距离。elapsed_time是文本效果已运行的总时间。visible会告诉您该字符是否可见,还可以使您隐藏文本的给定部分。offset是相对于给定字符在正常情况下应呈现的位置的偏移位置。color是给定字符的颜色。还有env一个分配给给定自定义效果的变量字典(例如,查看上面的代码)。关于此函数要注意的最后一件事是,必须返回一个布尔true值以验证效果是否正确处理。这样,如果呈现给定角色存在问题,它将完全退出呈现自定义效果,直到用户修复其自定义效果逻辑中出现的任何错误为止。

这将添加一些新的bbcode命令,其用法如下:
[center][ghost]This is a custom [matrix]effect[/matrix][/ghost] made in [pulse freq=5.0 height=2.0][pulse color=#00FFAA freq=2.0]GDScript[/pulse][/pulse].[/center]

你可能感兴趣的:(Godot,游戏开发,游戏引擎)