summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player.gd24
-rw-r--r--ps_base.gd7
-rw-r--r--ps_curve.gd14
-rw-r--r--ps_forced.gd23
-rw-r--r--ps_hanging.gd46
-rw-r--r--ps_init.gd4
-rw-r--r--ps_normal.gd15
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)