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
|