Text jitter effect and individual char_fx offset

Godot Version

4.4.dev6

Question

I’m trying to create a “text jitter” effect. Each character in a text should have a small random offset that changes every second, but I can’t get each character to have a unique random offset. All characters share the same offset.

Here is the code I’m using:

@tool
extends RichTextEffect
class_name JitterEffect

var bbcode = "jitter_effect"
var last_time = -1
var current_offset_x = 0.0
var current_offset_y = 0.0

func _process_custom_fx(char_fx: CharFXTransform) -> bool:
	var elapsed_seconds = int(char_fx.elapsed_time * 3) % 2

	if elapsed_seconds != last_time:
		randomize()
		current_offset_x = randf_range(-3, 3)
		current_offset_y = randf_range(-3, 3)
		last_time = elapsed_seconds

	char_fx.offset = Vector2(current_offset_x, current_offset_y)

	return true

How can I make the offset of each character in the text unique?

you’re using global variables current_offset_x/y for all characters. Change these lines:

current_offset_x = randf_range(-3, 3)
current_offset_y = randf_range(-3, 3

Here’s how I’d do it.

@tool
extends RichTextEffect
class_name JitterEffect

var bbcode = "jitter_effect"
var last_time = -1

# Store em here
var char_offsets = {}

func _process_custom_fx(char_fx: CharFXTransform) -> bool:
    var elapsed_seconds = int(char_fx.elapsed_time * 3) % 2
    
    # create a key for each character depending on pos
    var char_key = char_fx.relative_index
    
    if elapsed_seconds != last_time:
        randomize()
        # initialize/update
        if not char_offsets.has(char_key):
            char_offsets[char_key] = {}
            
        char_offsets[char_key] = {
            "x": randf_range(-3, 3),
            "y": randf_range(-3, 3)
        }
        last_time = elapsed_seconds
    
    # apply it
    if char_offsets.has(char_key):
        char_fx.offset = Vector2(
            char_offsets[char_key]["x"],
            char_offsets[char_key]["y"]
        )
    
    return true