From bd197168c39551c3456099ed2a39375a8442483f Mon Sep 17 00:00:00 2001 From: David Luevano Alvarado Date: Tue, 31 May 2022 03:49:28 -0600 Subject: working snake generation and path following, minor refactor --- .../actors/snake/scripts/generic_segment.gd | 8 +++++ src/entities/actors/snake/scripts/head.gd | 30 ++++++++++++++++ src/entities/actors/snake/scripts/snake.gd | 42 ++++++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 src/entities/actors/snake/scripts/generic_segment.gd create mode 100644 src/entities/actors/snake/scripts/head.gd create mode 100644 src/entities/actors/snake/scripts/snake.gd (limited to 'src/entities/actors/snake/scripts') 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) -- cgit v1.2.3