Add lever and jump pad components with activation logic
This commit is contained in:
40
scripts/components/cage_component.gd
Normal file
40
scripts/components/cage_component.gd
Normal file
@@ -0,0 +1,40 @@
|
||||
class_name CageComponent
|
||||
extends Node
|
||||
|
||||
@export var lever: LeverComponent
|
||||
@export var root: Node2D
|
||||
@export var move_value: Vector2 = Vector2(0, -100)
|
||||
@export var tween_duration: float = 0.5
|
||||
@export var should_free: bool = true
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
await get_tree().process_frame
|
||||
if not lever:
|
||||
var levers_nodes := get_tree().get_nodes_in_group("levers")
|
||||
print("Found levers: ", levers_nodes)
|
||||
for lever_node in levers_nodes:
|
||||
var lever_component: LeverComponent = lever_node.get_node_or_null("LeverComponent")
|
||||
print("Lever component: ", lever_component)
|
||||
if lever_component:
|
||||
lever_component.activated.connect(on_lever_activated)
|
||||
else:
|
||||
lever.activated.connect(on_lever_activated)
|
||||
|
||||
if not root:
|
||||
printerr("CageComponent: root is not set.")
|
||||
return
|
||||
|
||||
|
||||
func on_lever_activated() -> void:
|
||||
print("Lever activated, moving cage.")
|
||||
var tween: Tween = create_tween()
|
||||
var end_position: Vector2 = root.position + move_value
|
||||
tween.tween_property(root, "position", end_position, tween_duration)
|
||||
tween.tween_callback(_on_tween_completed)
|
||||
|
||||
|
||||
func _on_tween_completed() -> void:
|
||||
if not should_free:
|
||||
return
|
||||
root.queue_free()
|
2
scripts/components/can_be_launched_component.gd
Normal file
2
scripts/components/can_be_launched_component.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
class_name CanBeLaunchedComponent
|
||||
extends Node
|
@@ -6,9 +6,9 @@ var has_fade_away: bool = false
|
||||
|
||||
@export var area2d: Area2D
|
||||
@export var collectable_data: CollectableResource
|
||||
|
||||
signal collected(amount: int)
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if area2d:
|
||||
area2d.body_entered.connect(_on_area2d_body_entered)
|
||||
@@ -20,6 +20,7 @@ func _ready() -> void:
|
||||
if root.has_node("FadeAwayComponent"):
|
||||
has_fade_away = true
|
||||
|
||||
|
||||
func _on_area2d_body_entered(body: Node2D) -> void:
|
||||
if body.has_node("CanPickUpComponent"):
|
||||
collected.emit(collectable_data.amount)
|
||||
|
40
scripts/components/jump_pad_component.gd
Normal file
40
scripts/components/jump_pad_component.gd
Normal file
@@ -0,0 +1,40 @@
|
||||
class_name JumpPadComponent
|
||||
extends Node
|
||||
|
||||
@export var jump_force: float = 10.0
|
||||
@export var area2d: Area2D
|
||||
@export var sprite2d: Sprite2D
|
||||
@export var start_animation_index: int = 0
|
||||
@export var animation_duration: float = 0.5
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not area2d:
|
||||
printerr("JumpPadComponent: area2d is not set.")
|
||||
return
|
||||
|
||||
if not sprite2d:
|
||||
printerr("JumpPadComponent: sprite2d is not set.")
|
||||
return
|
||||
|
||||
area2d.body_entered.connect(_on_body_entered)
|
||||
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
var can_be_launched: CanBeLaunchedComponent = body.get_node_or_null("CanBeLaunchedComponent")
|
||||
if not can_be_launched:
|
||||
return
|
||||
|
||||
if body is PlayerController:
|
||||
handle_launchpad_animation()
|
||||
body.velocity.y = -jump_force
|
||||
|
||||
|
||||
func handle_launchpad_animation() -> void:
|
||||
if not sprite2d:
|
||||
return
|
||||
|
||||
var timer := get_tree().create_timer(animation_duration)
|
||||
sprite2d.frame = start_animation_index + 1
|
||||
await timer.timeout
|
||||
sprite2d.frame = start_animation_index
|
37
scripts/components/lever_component.gd
Normal file
37
scripts/components/lever_component.gd
Normal file
@@ -0,0 +1,37 @@
|
||||
class_name LeverComponent
|
||||
extends Node
|
||||
|
||||
@export var area2d: Area2D
|
||||
@export var sprite2d: Sprite2D
|
||||
@export var start_animation_index: int = 0
|
||||
@export var animation_duration: float = 0.5
|
||||
signal activated
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not area2d:
|
||||
printerr("LeverComponent: area2d is not set.")
|
||||
return
|
||||
|
||||
if not sprite2d:
|
||||
printerr("LeverComponent: sprite2d is not set.")
|
||||
return
|
||||
|
||||
area2d.body_entered.connect(_on_body_entered)
|
||||
|
||||
|
||||
func _on_body_entered(body: Node2D) -> void:
|
||||
var trigger_lever: TriggerLeverComponent = body.get_node_or_null("TriggerLeverComponent")
|
||||
if not trigger_lever:
|
||||
return
|
||||
|
||||
activate()
|
||||
|
||||
|
||||
func activate() -> void:
|
||||
print("Lever activated.")
|
||||
activated.emit()
|
||||
sprite2d.frame = start_animation_index + 1
|
||||
var timer := get_tree().create_timer(animation_duration)
|
||||
await timer.timeout
|
||||
sprite2d.frame = start_animation_index
|
2
scripts/components/trigger_lever_component.gd
Normal file
2
scripts/components/trigger_lever_component.gd
Normal file
@@ -0,0 +1,2 @@
|
||||
class_name TriggerLeverComponent
|
||||
extends Node
|
Reference in New Issue
Block a user