extends Node2D
# --- 可配置参数 ---
@export var rain_count = 200
@export var fall_speed_min = 150.0
@export var fall_speed_max = 300.0
@export var rain_length_min = 10
@export var rain_length_max = 25
@export var font_size = 20
# --- 内部变量 ---
var screen_size: Vector2
var characters: PackedStringArray
var rain_labels: Array[Label]
func _ready():
screen_size = get_viewport_rect().size
# 【最终修正】使用一个不包含日文的纯代码字符串作为字符库
var char_string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;':,./<>?"
characters = char_string.split("")
create_rain_labels()
func _process(delta):
for label in rain_labels:
label.position.y += label.get_meta("speed") * delta
var current_text = label.text
if not current_text.is_empty():
label.text = current_text.substr(0, current_text.length() - 1) + characters[randi() % characters.size()]
if label.position.y > screen_size.y + label.size.y:
reset_label(label)
func create_rain_labels():
for i in range(rain_count):
var label = Label.new()
label.theme = load("res://assets/main_theme.tres")
label.add_theme_font_size_override("font_size", font_size)
reset_label(label)
add_child(label)
rain_labels.append(label)
func reset_label(label: Label):
label.position.x = randf_range(0, screen_size.x)
label.position.y = -randf_range(100, 400)
label.set_meta("speed", randf_range(fall_speed_min, fall_speed_max))
var rain_length = randi_range(rain_length_min, rain_length_max)
var new_text = ""
for i in range(rain_length):
new_text += characters[randi() % characters.size()] + "\n"
label.text = new_text
label.modulate = Color.WHITE
label.add_theme_color_override("font_color", Color("#00FF00"))