navigation.gd 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. extends Navigation2D
  2. # Member variables
  3. const SPEED = 200.0
  4. var begin = Vector2()
  5. var end = Vector2()
  6. var path = []
  7. func _process(delta):
  8. if (path.size() > 1):
  9. var to_walk = delta*SPEED
  10. while(to_walk > 0 and path.size() >= 2):
  11. var pfrom = path[path.size() - 1]
  12. var pto = path[path.size() - 2]
  13. var d = pfrom.distance_to(pto)
  14. if (d <= to_walk):
  15. path.remove(path.size() - 1)
  16. to_walk -= d
  17. else:
  18. path[path.size() - 1] = pfrom.linear_interpolate(pto, to_walk/d)
  19. to_walk = 0
  20. var atpos = path[path.size() - 1]
  21. get_node("agent").set_pos(atpos)
  22. if (path.size() < 2):
  23. path = []
  24. set_process(false)
  25. else:
  26. set_process(false)
  27. func _update_path():
  28. var p = get_simple_path(begin, end, true)
  29. path = Array(p) # Vector2array too complex to use, convert to regular array
  30. path.invert()
  31. set_process(true)
  32. func _input(event):
  33. if (event.type == InputEvent.MOUSE_BUTTON and event.pressed and event.button_index == 1):
  34. begin = get_node("agent").get_pos()
  35. # Mouse to local navigation coordinates
  36. end = event.pos - get_pos()
  37. _update_path()
  38. func _ready():
  39. set_process_input(true)