extends Area2D ## 门:集齐钻石后碰到就过关;没集齐则闪一下红色提示。 @export var required_diamonds: int = 3 ## 门贴图在图集里的区域(不同门可以不一样) @export var atlas_region: Rect2 = Rect2(180, 108, 18, 18) ## 开场时擦掉脚下的占位地砖 @export var erase_placeholder_tile: bool = true const ATLAS := preload("res://assets/game/tilesets/kenney_tiles_atlas.png") var _sprite: Sprite2D = null func _ready() -> void: body_entered.connect(_on_body_entered) _sprite = get_node_or_null("Sprite") if _sprite != null: var tex := AtlasTexture.new() tex.atlas = ATLAS tex.region = atlas_region _sprite.texture = tex if erase_placeholder_tile: _erase_placeholder_tile() func _on_body_entered(body: Node2D) -> void: if not body.has_method("add_diamond"): return if int(body.diamonds) < required_diamonds: _flash_locked() return var clear := get_tree().get_first_node_in_group("level_clear") if clear != null: clear.show_clear() func _flash_locked() -> void: if _sprite == null: return _sprite.modulate = Color(1.0, 0.45, 0.45) await get_tree().create_timer(0.4).timeout if is_instance_valid(_sprite): _sprite.modulate = Color.WHITE func _erase_placeholder_tile() -> void: var root: Node = owner if owner != null else get_parent() if root == null: return for layer in root.find_children("*", "TileMapLayer", true, false): var cell: Vector2i = layer.local_to_map(layer.to_local(global_position)) if layer.get_cell_source_id(cell) != -1: layer.erase_cell(cell)