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.
 
my-bricks/scripts/brick.gd

53 lines
1.5 KiB

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]