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.5 KiB
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]
|
|
|