You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.4 KiB
53 lines
1.4 KiB
extends Area2D
|
|
## 道具:Area2D 每帧下落,被挡板接到时发 collected 信号。
|
|
## 效果由 main.gd 调度(目前只做"加宽挡板")。
|
|
|
|
signal collected(kind: String)
|
|
|
|
enum Kind { WIDE_PADDLE, MULTI_BALL, SLOW_BALL, EXTRA_LIFE }
|
|
|
|
@export var kind: Kind = Kind.WIDE_PADDLE
|
|
@export var fall_speed: float = 150.0
|
|
@export var kind_color: Dictionary = {
|
|
Kind.WIDE_PADDLE: Color(0.3, 0.9, 0.4),
|
|
Kind.MULTI_BALL: Color(0.9, 0.9, 0.3),
|
|
Kind.SLOW_BALL: Color(0.4, 0.7, 1.0),
|
|
Kind.EXTRA_LIFE: Color(1.0, 0.4, 0.7),
|
|
}
|
|
|
|
@onready var visual: ColorRect = $Visual
|
|
@onready var label: Label = $Visual/Label
|
|
|
|
func _ready() -> void:
|
|
# 颜色按类型
|
|
if kind_color.has(kind):
|
|
visual.color = kind_color[kind]
|
|
# 字母标签:W / M / S / L
|
|
label.text = _label_for(kind)
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
position.y += fall_speed * _delta
|
|
# 掉到底就消失
|
|
if position.y > 730:
|
|
queue_free()
|
|
|
|
func _on_body_entered(body: Node) -> void:
|
|
if body.is_in_group("paddle"):
|
|
collected.emit(_kind_name())
|
|
queue_free()
|
|
|
|
func _kind_name() -> String:
|
|
match kind:
|
|
Kind.WIDE_PADDLE: return "wide_paddle"
|
|
Kind.MULTI_BALL: return "multi_ball"
|
|
Kind.SLOW_BALL: return "slow_ball"
|
|
Kind.EXTRA_LIFE: return "extra_life"
|
|
return "unknown"
|
|
|
|
func _label_for(k: Kind) -> String:
|
|
match k:
|
|
Kind.WIDE_PADDLE: return "W"
|
|
Kind.MULTI_BALL: return "M"
|
|
Kind.SLOW_BALL: return "S"
|
|
Kind.EXTRA_LIFE: return "L"
|
|
return "?"
|
|
|