extends StaticBody2D ## 砖块:被球撞扣血,归零销毁并发出 destroyed(points) 信号。 ## ## 反馈:被击中时闪白 + 缩放抖动;血量越低颜色越亮。 ## 击杀时按 power_up_drop_chance 概率额外发 power_up_dropped(位置) 信号。 signal destroyed(points: int) signal power_up_dropped(spawn_position: Vector2) @export var max_hp: int = 1 @export var points: int = 100 @export var power_up_drop_chance: float = 0.15 ## 击杀掉落道具的概率 @export var color_by_hp: Dictionary = { 1: Color(0.30, 0.70, 0.40), 2: Color(0.95, 0.75, 0.20), 3: Color(0.85, 0.30, 0.30), } var _hp: int func _ready() -> void: add_to_group("bricks") _hp = max_hp _refresh_color() func hit() -> void: _play_hit_feedback() _hp -= 1 if _hp <= 0: # 击杀:摇骰子决定是否掉落道具 if randf() < power_up_drop_chance: power_up_dropped.emit(position) destroyed.emit(points) queue_free() else: _refresh_color() func _play_hit_feedback() -> void: var rect := get_node_or_null("ColorRect") as ColorRect if not rect: return var original_color: Color = rect.color rect.color = Color(1, 1, 1) var tween := create_tween() tween.tween_property(rect, "color", original_color, 0.15) var original_scale: Vector2 = rect.scale tween.parallel().tween_property(rect, "scale", original_scale * 1.15, 0.05) tween.tween_property(rect, "scale", original_scale, 0.1) func _refresh_color() -> void: var rect := get_node_or_null("ColorRect") if rect and color_by_hp.has(_hp): rect.color = color_by_hp[_hp]