blob: 6ded026409d4755c405a6f210fb46f05f4c39bfe (
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
|
extends Node
signal direction_changed
@export_node_path("CharacterBody2D") var entityPath: NodePath
@onready var entity: CharacterBody2D = get_node(entityPath)
@export_node_path("AnimatedSprite2D") var spritePath: NodePath
@onready var sprite: AnimatedSprite2D = get_node(spritePath)
@export var SPEED: int
const DIRECTIONS = [Vector2.UP, Vector2.RIGHT, Vector2.DOWN, Vector2.LEFT]
var CURRENT_DIRECTION = Vector2.UP
@export var timer_time: float = 3.0
@onready var MovementTimer: Timer = Timer.new()
func _ready():
MovementTimer.wait_time = timer_time
MovementTimer.autostart = true
MovementTimer.connect("timeout", Callable(_on_movement_timer_timeout))
add_child(MovementTimer)
func physics_process(delta):
if CURRENT_DIRECTION == Vector2.UP:
entity.velocity.y -= SPEED
sprite.play("up")
elif CURRENT_DIRECTION == Vector2.DOWN:
entity.velocity.y += SPEED
sprite.play("down")
elif CURRENT_DIRECTION == Vector2.LEFT:
entity.velocity.x -= SPEED
sprite.play("left")
elif CURRENT_DIRECTION == Vector2.RIGHT:
entity.velocity.x += SPEED
sprite.play("right")
var collision = entity.move_and_collide(entity.velocity * delta)
entity.velocity = entity.velocity.lerp(Vector2(0, 0), 1) # speed too low => no collision
if collision:
if MovementTimer.time_left > 0:
_on_movement_timer_timeout()
return collision
func _on_movement_timer_timeout():
var directions = DIRECTIONS.duplicate()
directions.remove_at(directions.find(CURRENT_DIRECTION))
directions.shuffle()
CURRENT_DIRECTION = directions[0]
emit_signal("direction_changed", CURRENT_DIRECTION)
MovementTimer.start()
|