From 3c3d0c3bfd9bac15b4406318c27a91954c3e7697 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sat, 29 Nov 2025 12:20:32 +0200 Subject: Store player ref in state scripts --- player.gd | 24 ++++++++++-------------- ps_base.gd | 7 +++++-- ps_curve.gd | 14 ++++++++------ ps_forced.gd | 23 ++++++++++++----------- ps_hanging.gd | 46 ++++++++++++++++++++++------------------------ ps_init.gd | 4 ++-- ps_normal.gd | 15 +++++++-------- 7 files changed, 66 insertions(+), 67 deletions(-) diff --git a/player.gd b/player.gd index 7ae89f6..a7cb2f3 100644 --- a/player.gd +++ b/player.gd @@ -7,7 +7,9 @@ extends CharacterBody2D @export var jump_held_coef: float @export var hook_distance_max: float -var state: PlayerState = PlayerStateInit.new() +var state: PlayerState = PlayerStateInit.new(self) +@onready var anim_sp: AnimatedSprite2D = $AnimatedSprite2D + var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") func get_facing() -> int: @@ -18,36 +20,30 @@ func get_facing() -> int: # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - state._handle(self, delta) + state._handle(delta) func _physics_process(delta: float): - state._handle_physics(self, delta) + state._handle_physics(delta) #region movement type setters func set_movement_normal(): - state = PlayerStateNormal.new() + state = PlayerStateNormal.new(self) func set_movement_forced(dir: String): if state is PlayerStateForced: return - - var psf: PlayerStateForced = PlayerStateForced.new() - psf.initialize(self, dir) - state = psf + + state = PlayerStateForced.new(self, dir) func set_movement_curve(curve: Curve2D, c_speed: float, c_reverse: bool): if state is PlayerStateCurve: return - var psc: PlayerStateCurve = PlayerStateCurve.new() - psc.initialize(self, curve, c_speed, c_reverse) - state = psc + state = PlayerStateCurve.new(self, curve, c_speed, c_reverse) func set_movement_hanging(target: Node2D, hang_dist: float): if state is PlayerStateHanging: return if not PlayerStateHanging.can_hang_from(self, target): return - var psh: PlayerStateHanging = PlayerStateHanging.new() - psh.initialize(self, target, hang_dist) - state = psh + state = PlayerStateHanging.new(self, target, hang_dist) #endregion func handle_action_input(): diff --git a/ps_base.gd b/ps_base.gd index 32bcdfc..9b0667f 100644 --- a/ps_base.gd +++ b/ps_base.gd @@ -1,5 +1,8 @@ @abstract class_name PlayerState extends RefCounted -@abstract func _handle(p: Player, delta: float) -@abstract func _handle_physics(p: Player, delta: float) +var p: Player + +func _init(pl: Player): p = pl +@abstract func _handle(delta: float) +@abstract func _handle_physics(delta: float) diff --git a/ps_curve.gd b/ps_curve.gd index ae34977..ab5c327 100644 --- a/ps_curve.gd +++ b/ps_curve.gd @@ -6,10 +6,9 @@ var target: Curve2D var speed: float var dir: int -func _to_string() -> String: - return "PlayerStateCurve" - -func initialize(_p: Player, c_target: Curve2D, c_speed: float, c_reverse: bool): +func _init(pl: Player, c_target: Curve2D, c_speed: float, c_reverse: bool): + super(pl) + target = c_target speed = c_speed if c_reverse: @@ -19,10 +18,13 @@ func initialize(_p: Player, c_target: Curve2D, c_speed: float, c_reverse: bool): dir = 1 t = 0 -func _handle(_p: Player, _delta: float): +func _to_string() -> String: + return "PlayerStateCurve" + +func _handle(_delta: float): pass -func _handle_physics(p: Player, delta: float): +func _handle_physics(delta: float): t += dir * speed * delta var finished: bool if dir == 1: diff --git a/ps_forced.gd b/ps_forced.gd index 9a8b41a..76c15b5 100644 --- a/ps_forced.gd +++ b/ps_forced.gd @@ -4,10 +4,9 @@ extends PlayerState var input_x: float var jump_coef = 1.3 -func _to_string() -> String: - return "PlayerStateForced" +func _init(pl: Player, dir: String): + super(pl) -func initialize(p: Player, dir: String): if dir == "LEFT": input_x = -1.0 elif dir == "JUMP_LEFT": @@ -25,21 +24,23 @@ func initialize(p: Player, dir: String): elif dir == "DROP": input_x = 0.0 -func _handle(p: Player, _delta: float): - var as2d = p.get_node("AnimatedSprite2D") +func _to_string() -> String: + return "PlayerStateForced" + +func _handle(_delta: float): if p.velocity.x > 0: - as2d.flip_h = false + p.anim_sp.flip_h = false elif p.velocity.x < 0: - as2d.flip_h = true + p.anim_sp.flip_h = true if not p.is_on_floor(): - as2d.set_animation("jump") + p.anim_sp.set_animation("jump") elif abs(p.velocity.x) > 0.0: - as2d.set_animation("walk") + p.anim_sp.set_animation("walk") else: - as2d.set_animation("idle") + p.anim_sp.set_animation("idle") -func _handle_physics(p: Player, delta: float): +func _handle_physics(delta: float): p.velocity.y += p.gravity * delta if p.velocity.y > p.jump_strength: p.velocity.y = p.jump_strength diff --git a/ps_hanging.gd b/ps_hanging.gd index d0a772d..0b3b80b 100644 --- a/ps_hanging.gd +++ b/ps_hanging.gd @@ -18,42 +18,40 @@ var T_travel: float = 0.1 enum S { MLEMING, TRAVELING, HANGING } var state: S = S.MLEMING +func _init(pl: Player, h_target: HookHanging, h_dist: float) -> void: + super(pl) + + t = 0 + L = h_dist + target = h_target + w = sqrt(p.gravity / L) * 0.8 + + state = S.MLEMING + func _to_string() -> String: return "PlayerStateHanging %s, θ₀ = %f" % [S.keys()[state], theta0] -static func can_hang_from(p: Player, target: HookHanging) -> bool: - var d = target.global_position - p.global_position +static func can_hang_from(pl: Player, c_target: HookHanging) -> bool: + var d = c_target.global_position - pl.global_position var angle = atan2(d.y, d.x) var revs = floor(angle / (2 * PI)) angle -= revs * 2 * PI return angle > deg_to_rad(135) or angle < deg_to_rad(45) -func initialize(p: Player, h_target: HookHanging, h_dist: float): - t = 0 - L = h_dist - target = h_target - w = sqrt(p.gravity / L) * 0.8 - - var d = target.global_position - p.global_position - var flip = d.x < 0 - p.get_node("AnimatedSprite2D").flip_h = flip - d - state = S.MLEMING - -func _handle(p: Player, _delta: float): +func _handle(_delta: float): if Input.is_action_just_pressed("move_left"): - p.get_node("AnimatedSprite2D").flip_h = true + p.anim_sp.flip_h = true if Input.is_action_just_pressed("move_right"): - p.get_node("AnimatedSprite2D").flip_h = false + p.anim_sp.flip_h = false -func _handle_physics(p: Player, delta: float): +func _handle_physics(delta: float): match state: - S.MLEMING: _mlem(p, delta) - S.TRAVELING: _travel(p, delta) - S.HANGING: _hang(p, delta) + S.MLEMING: _mlem(delta) + S.TRAVELING: _travel(delta) + S.HANGING: _hang(delta) _: print_debug("_handle_physics: unknown state %s" % str(state)) -func _mlem(p: Player, delta: float): +func _mlem(delta: float): t += delta var d = target.global_position - p.global_position @@ -76,7 +74,7 @@ func _mlem(p: Player, delta: float): travel_to = target.global_position - d.normalized() * L t = 0 -func _travel(p: Player, delta: float): +func _travel(delta: float): t += delta p.global_position = travel_from + (t / T_travel) * (travel_to - travel_from) @@ -93,7 +91,7 @@ func _travel(p: Player, delta: float): last_theta = theta0 t = 0 -func _hang(p: Player, delta: float): +func _hang(delta: float): var d = target.global_position - p.global_position tongue.points[0] = -d diff --git a/ps_init.gd b/ps_init.gd index 080b068..df49da0 100644 --- a/ps_init.gd +++ b/ps_init.gd @@ -4,8 +4,8 @@ extends PlayerState func _to_string() -> String: return "PlayerStateInit" -func _handle(_p: Player, _delta: float): +func _handle(_delta: float): pass -func _handle_physics(_p: Player, _delta: float): +func _handle_physics(_delta: float): pass diff --git a/ps_normal.gd b/ps_normal.gd index c50383d..d886e1e 100644 --- a/ps_normal.gd +++ b/ps_normal.gd @@ -10,21 +10,20 @@ var prev_dir: float = 0.0 func _to_string() -> String: return "PlayerStateNormal" -func _handle(p: Player, _delta: float): - var as2d = p.get_node("AnimatedSprite2D") +func _handle(_delta: float): if p.velocity.x > 0: - as2d.flip_h = false + p.anim_sp.flip_h = false elif p.velocity.x < 0: - as2d.flip_h = true + p.anim_sp.flip_h = true if not p.is_on_floor(): - as2d.set_animation("jump") + p.anim_sp.set_animation("jump") elif abs(p.velocity.x) > 0.0: - as2d.set_animation("walk") + p.anim_sp.set_animation("walk") else: - as2d.set_animation("idle") + p.anim_sp.set_animation("idle") -func _handle_physics(p: Player, delta: float): +func _handle_physics(delta: float): var grav_coef = 1.0 if p.velocity.y < 0 and Input.is_action_pressed("jump"): grav_coef = 1.0 + (p.jump_held_coef * p.velocity.y / p.jump_strength) -- cgit v1.3