summaryrefslogtreecommitdiff
path: root/src/entities/actors/snake/scripts/head.gd
blob: 874791077899ad147ac0d754bdd7a2d20a699edb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
extends KinematicBody2D

enum {
	LEFT=-1,
	RIGHT=1
}

onready var tongue_sprite: AnimatedSprite = $Tongue

var _initial_speed: float = Global.SNAKE_SPEED
var velocity: Vector2 = Vector2.ZERO
var _direction: Vector2 = Vector2.UP
var _time_elapsed: float = 0.0


func _ready() -> void:
	Event.connect("food_eaten", self, "_on_food_eaten")
	tongue_sprite.visible = false


func _physics_process(delta: float) -> void:
	if Input.is_action_pressed("move_left"):
		_rotate_to(LEFT)
	if Input.is_action_pressed("move_right"):
		_rotate_to(RIGHT)

	velocity = _direction * Global.SNAKE_SPEED

	# not sure if needed, worked wonders when using a Node2D instead of KB2D
	velocity = move_and_slide(velocity)

	# slow down on collisions, so it isn't as unfair
	if get_last_slide_collision():
		var speed: float = velocity.length()
		Global.SNAKE_SPEED = speed
	else:
		Global.SNAKE_SPEED = Global.SNAKE_SPEED_BACKUP

	# handle slow speeds
	if Global.SNAKE_SPEED <= Global.SNAKE_SPEED_BACKUP / 4.0:
		Global.SNAKE_SPEED = Global.SNAKE_SPEED_BACKUP
		Event.emit_signal("game_over")

	_handle_time_elapsed(delta)


func _rotate_to(direction: int) -> void:
	rotate(deg2rad(direction * Global.SNAKE_ROT_SPEED * get_physics_process_delta_time()))
	_direction = _direction.rotated(deg2rad(direction * Global.SNAKE_ROT_SPEED * get_physics_process_delta_time()))
	Event.emit_signal("snake_rotated")


# using a timer is not recommended for < 0.01
func _handle_time_elapsed(delta: float) -> void:
	if _time_elapsed >= Global.SNAKE_POSITION_UPDATE_INTERVAL:
		Event.emit_signal("snake_path_new_point", global_position)
		_time_elapsed = 0.0
	_time_elapsed += delta


func _on_food_eaten(properties: Dictionary) -> void:
	if not tongue_sprite.visible:
		tongue_sprite.visible = true
	tongue_sprite.play()
	yield(tongue_sprite, "animation_finished")
	tongue_sprite.stop()
	tongue_sprite.frame = 0