|
@@ -1,60 +1,61 @@
|
|
|
-extends Position2D
|
|
|
+extends Node2D
|
|
|
|
|
|
enum States { IDLE, FOLLOW }
|
|
|
|
|
|
export(float) var speed = 200.0
|
|
|
var _state = null
|
|
|
|
|
|
-var path = []
|
|
|
-var target_point_world = Vector2()
|
|
|
-var target_position = Vector2()
|
|
|
+var _path = []
|
|
|
+var _target_point_world = Vector2()
|
|
|
+var _target_position = Vector2()
|
|
|
|
|
|
-var velocity = Vector2()
|
|
|
+var _velocity = Vector2()
|
|
|
|
|
|
func _ready():
|
|
|
_change_state(States.IDLE)
|
|
|
|
|
|
|
|
|
func _process(_delta):
|
|
|
- if not _state == States.FOLLOW:
|
|
|
+ if _state != States.FOLLOW:
|
|
|
return
|
|
|
- var arrived_to_next_point = move_to(target_point_world)
|
|
|
- if arrived_to_next_point:
|
|
|
- path.remove(0)
|
|
|
- if len(path) == 0:
|
|
|
+ var _arrived_to_next_point = _move_to(_target_point_world)
|
|
|
+ if _arrived_to_next_point:
|
|
|
+ _path.remove(0)
|
|
|
+ if len(_path) == 0:
|
|
|
_change_state(States.IDLE)
|
|
|
return
|
|
|
- target_point_world = path[0]
|
|
|
+ _target_point_world = _path[0]
|
|
|
|
|
|
|
|
|
func _input(event):
|
|
|
if event.is_action_pressed("click"):
|
|
|
+ var global_mouse_pos = get_global_mouse_position()
|
|
|
if Input.is_key_pressed(KEY_SHIFT):
|
|
|
- global_position = get_global_mouse_position()
|
|
|
+ global_position = global_mouse_pos
|
|
|
else:
|
|
|
- target_position = get_global_mouse_position()
|
|
|
+ _target_position = global_mouse_pos
|
|
|
_change_state(States.FOLLOW)
|
|
|
|
|
|
|
|
|
-func move_to(world_position):
|
|
|
+func _move_to(world_position):
|
|
|
var MASS = 10.0
|
|
|
var ARRIVE_DISTANCE = 10.0
|
|
|
|
|
|
var desired_velocity = (world_position - position).normalized() * speed
|
|
|
- var steering = desired_velocity - velocity
|
|
|
- velocity += steering / MASS
|
|
|
- position += velocity * get_process_delta_time()
|
|
|
- rotation = velocity.angle()
|
|
|
+ var steering = desired_velocity - _velocity
|
|
|
+ _velocity += steering / MASS
|
|
|
+ position += _velocity * get_process_delta_time()
|
|
|
+ rotation = _velocity.angle()
|
|
|
return position.distance_to(world_position) < ARRIVE_DISTANCE
|
|
|
|
|
|
|
|
|
func _change_state(new_state):
|
|
|
if new_state == States.FOLLOW:
|
|
|
- path = get_parent().get_node("TileMap")._get_path(position, target_position)
|
|
|
- if not path or len(path) == 1:
|
|
|
+ _path = get_parent().get_node("TileMap").get_astar_path(position, _target_position)
|
|
|
+ if not _path or len(_path) == 1:
|
|
|
_change_state(States.IDLE)
|
|
|
return
|
|
|
# The index 0 is the starting cell
|
|
|
# we don't want the character to move back to it in this example
|
|
|
- target_point_world = path[1]
|
|
|
+ _target_point_world = _path[1]
|
|
|
_state = new_state
|