Player.gd 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. extends Area2D
  2. var direction = Vector2()
  3. const DEG_UP = 0
  4. const DEG_RIGHT = 90
  5. const DEG_DOWN = 180
  6. const DEG_LEFT = 270
  7. const DEG_LIST = [DEG_UP, DEG_RIGHT, DEG_DOWN, DEG_LEFT]
  8. const DIR_UP = 0
  9. const DIR_RIGHT = 1
  10. const DIR_DOWN = 2
  11. const DIR_LEFT = 3
  12. var posix
  13. var posiy
  14. var dirx = 0
  15. var diry = 0
  16. var dire = DIR_UP
  17. var grid
  18. var is_moving = false
  19. var tween
  20. var target_pos = Vector2()
  21. var blocks = []
  22. var is_blocked:bool = false
  23. export (NodePath) var rayU
  24. export (NodePath) var rayD
  25. export (NodePath) var rayL
  26. export (NodePath) var rayR
  27. var raycast
  28. func _ready():
  29. grid = get_parent()
  30. posix = int (position.x / 64)
  31. posiy = int (position.y / 64)
  32. turn(DIR_UP)
  33. tween = $Tween
  34. tween.connect_into(self)
  35. pass
  36. func _physics_process(delta):
  37. if Input.is_action_pressed("ui_left"):
  38. if !is_moving:
  39. dire -= 1
  40. if dire < 0:
  41. dire = 3
  42. tween.rotate_char(self, rotation_degrees - 90)
  43. is_moving = true
  44. elif Input.is_action_pressed("ui_right"):
  45. if !is_moving:
  46. dire += 1
  47. if dire > 3:
  48. dire = 0
  49. tween.rotate_char(self, rotation_degrees + 90)
  50. is_moving = true
  51. if Input.is_action_pressed("ui_up"):
  52. turn(dire)
  53. if !is_moving and !raycast.is_colliding():
  54. posix += dirx
  55. posiy += diry
  56. target_pos = Vector2(posix * 64 + 32, posiy * 64 + 32)
  57. tween.move_char(self, target_pos)
  58. is_moving = true
  59. func _on_tween_completed(o, k):
  60. is_moving = false
  61. pass
  62. func _on_area_entered(a):
  63. if a.get_parent() != $Position2D:
  64. print(a)
  65. blocks.append(a)
  66. is_blocked = true
  67. pass
  68. func _on_area_exited(a):
  69. blocks.erase(a)
  70. is_blocked = blocks.size()
  71. pass
  72. func turn(dir:int):
  73. dirx = 0
  74. diry = 0
  75. if dir == DIR_UP:
  76. raycast=get_node(rayU)
  77. diry -= 1
  78. elif dir == DIR_RIGHT:
  79. raycast=get_node(rayR)
  80. dirx += 1
  81. elif dir == DIR_DOWN:
  82. raycast=get_node(rayD)
  83. diry += 1
  84. else:
  85. raycast=get_node(rayL)
  86. dirx -= 1
  87. pass
  88. func update_avatar_dir():
  89. $Sprite.rotation_degrees = DEG_LIST[dire]