44 lines
1.2 KiB
GDScript
44 lines
1.2 KiB
GDScript
class_name PressurePlate extends Node2D
|
|
|
|
signal activated
|
|
signal deactivated
|
|
|
|
var bodies := 0
|
|
var is_active := false
|
|
var offset_rectangle: Rect2
|
|
|
|
@onready var area: Area2D = $Area2D
|
|
@onready var audio: AudioStreamPlayer2D = $AudioStreamPlayer2D
|
|
@onready var audio_activate: AudioStream = preload("res://interactables/dungeon/lever-01.wav")
|
|
@onready var audio_deactivate: AudioStream = preload("res://interactables/dungeon/lever-02.wav")
|
|
@onready var sprite: Sprite2D = $Sprite2D
|
|
|
|
func _ready() -> void:
|
|
area.body_entered.connect(on_body_entered)
|
|
area.body_exited.connect(on_body_exited)
|
|
offset_rectangle = sprite.region_rect
|
|
|
|
func on_body_entered(_body: Node2D) -> void:
|
|
bodies += 1
|
|
calc_state_activated()
|
|
|
|
func on_body_exited(_body: Node2D) -> void:
|
|
bodies -= 1
|
|
calc_state_activated()
|
|
|
|
func calc_state_activated() -> void:
|
|
if bodies > 0 and !is_active:
|
|
is_active = true
|
|
sprite.region_rect.position.x = offset_rectangle.position.x - 32
|
|
activated.emit()
|
|
play_audio(audio_activate)
|
|
elif bodies <= 0 and is_active:
|
|
is_active = false
|
|
sprite.region_rect.position.x = offset_rectangle.position.x
|
|
deactivated.emit()
|
|
play_audio(audio_deactivate)
|
|
|
|
func play_audio(stream: AudioStream) -> void:
|
|
audio.stream = stream
|
|
audio.play()
|