summaryrefslogtreecommitdiff
path: root/src/entities/actors/snake/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/entities/actors/snake/scripts')
-rw-r--r--src/entities/actors/snake/scripts/generic_segment.gd8
-rw-r--r--src/entities/actors/snake/scripts/head.gd30
-rw-r--r--src/entities/actors/snake/scripts/snake.gd42
3 files changed, 80 insertions, 0 deletions
diff --git a/src/entities/actors/snake/scripts/generic_segment.gd b/src/entities/actors/snake/scripts/generic_segment.gd
new file mode 100644
index 0000000..ec34f43
--- /dev/null
+++ b/src/entities/actors/snake/scripts/generic_segment.gd
@@ -0,0 +1,8 @@
+extends PathFollow2D
+
+export(String, "body", "tail") var TYPE: String = "body"
+var speed: float = Global.SNAKE_SPEED
+
+
+func _process(delta: float) -> void:
+ offset += speed * delta \ No newline at end of file
diff --git a/src/entities/actors/snake/scripts/head.gd b/src/entities/actors/snake/scripts/head.gd
new file mode 100644
index 0000000..ea28f74
--- /dev/null
+++ b/src/entities/actors/snake/scripts/head.gd
@@ -0,0 +1,30 @@
+extends Node2D
+
+var speed: float = Global.SNAKE_SPEED
+var rot_speed: float = Global.SNAKE_ROT_SPEED
+var position_update_interval: float = Global.SNAKE_POSITION_UPDATE_INTERVAL
+
+var _direction: Vector2 = Vector2.UP
+var _time_elapsed: float = 0.0
+
+
+func _process(delta: float) -> void:
+ if Input.is_action_pressed("move_left"):
+ # _direction = _direction.rotated(deg2rad(-ROT_SPEED))
+ rotate(deg2rad(-rot_speed * delta))
+ if Input.is_action_pressed("move_right"):
+ # _direction = _direction.rotated(deg2rad(ROT_SPEED))
+ rotate(deg2rad(rot_speed * delta))
+
+ move_local_x(_direction.x * speed * delta)
+ move_local_y(_direction.y * speed * delta)
+
+ _handle_time_elapsed(delta)
+
+
+# using a timer is not recommended for < 0.01
+func _handle_time_elapsed(delta: float) -> void:
+ if _time_elapsed >= position_update_interval:
+ Event.emit_signal("new_curve_point", global_position)
+ _time_elapsed = 0.0
+ _time_elapsed += delta
diff --git a/src/entities/actors/snake/scripts/snake.gd b/src/entities/actors/snake/scripts/snake.gd
new file mode 100644
index 0000000..e604011
--- /dev/null
+++ b/src/entities/actors/snake/scripts/snake.gd
@@ -0,0 +1,42 @@
+class_name Snake
+extends Node2D
+
+export(PackedScene) var BODY_SEGMENT_NP: PackedScene
+export(PackedScene) var TAIL_SEGMENT_NP: PackedScene
+
+onready var path: Path2D = $Path
+
+var current_body_segments: int = 0
+var max_body_segments: int = 1
+var body_segment_size: float = 16.0
+
+
+func _ready():
+ Event.connect("new_curve_point", self, "_on_Head_new_curve_point")
+
+
+func _draw() -> void:
+ if path.curve.get_baked_points().size() >= 2:
+ draw_polyline(path.curve.get_baked_points(), Color.aquamarine, 1, true)
+
+
+func add_point_to_curve(coordinates: Vector2) -> void:
+ path.curve.add_point(coordinates)
+ # update call is to draw curve as there are new points
+ update()
+
+ if current_body_segments < max_body_segments:
+ add_snake_segment(BODY_SEGMENT_NP)
+ elif current_body_segments == max_body_segments:
+ add_snake_segment(TAIL_SEGMENT_NP)
+
+
+func add_snake_segment(type: PackedScene) -> void:
+ if path.curve.get_baked_length() >= (current_body_segments + 1.0) * body_segment_size:
+ var _temp_body_segment: PathFollow2D = type.instance()
+ path.add_child(_temp_body_segment)
+ current_body_segments += 1
+
+
+func _on_Head_new_curve_point(coordinates: Vector2) -> void:
+ add_point_to_curve(coordinates)