godot-plateformer/_player/states/on_wall.gd

56 lines
1.7 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

extends LimboHSM
@onready var root: Normal = %Normal
func _setup() -> void:
self.add_event_handler(&"trigger_jump",_handler_trigger_jump)
self.add_event_handler(root.climb_state.EVENT_FINISHED,_handler_climb_state_finished)
self.add_event_handler(root.climb_jump_state.EVENT_FINISHED,_handler_climb_state_finished)
self.add_transition(root.climb_state,root.climb_jump_state,&"want_to_climb_jump")
func _enter() -> void:
if agent.is_on_wall():##如果已经在Wall上则什么都不做
return
snap_to_wall()
func snap_to_wall(max_snap_dist := 6.0) -> bool:
var wall_dir : float = sign(agent.wall_detector.wall_direction.x)
var from : Vector2 = agent.global_position
var to : Vector2 = from + Vector2(wall_dir * max_snap_dist, 0)
var query := PhysicsRayQueryParameters2D.create(from, to)
query.exclude = [agent]
query.collision_mask = agent.collision_mask
var result = agent.get_world_2d().direct_space_state.intersect_ray(query)
if result:
var target_x = result.position.x - wall_dir * agent.wall_snap_offset
agent.global_position.x = target_x
return true
return false
func _handler_climb_state_finished() -> bool:
if agent.is_on_floor():
self.dispatch(&"exit_on_ground")
else:
self.dispatch(&"exit_on_air")
return true
func _handler_trigger_jump() -> bool:
if self.get_active_state() == root.climb_state:
var input_x: float = agent.m_input_intent_direction.x
var wall_dir: float = agent.get_wall_normal().x
if sign(input_x) * sign(wall_dir) > 0:
root._trigger_climb_cd(.12)
self.get_root().blackboard.set_var(&"want_to_jump",true)
_handler_climb_state_finished()
return true
self.dispatch(&"want_to_climb_jump")
return true