Player.gd 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #Johann Massyn, 23/06/2019
  2. #Godot (3.1) 3D Player movement script
  3. #Atatch script to 3d node with following structure
  4. #Kinematic body: Player
  5. # - CollisionShape: CollisionShape
  6. # - Camera: Camera
  7. extends KinematicBody
  8. export (bool) var can_move = true #Alow player to input movment.
  9. export (bool) var can_sprint = true #Alow player to toggle sprint movment.
  10. export (float) var move_speed = 8 #Players movement speed
  11. export (float) var move_speed_sprint = 16 #Players sprint movement speed
  12. export (bool) var move_sprint = false #Player sprinting toggle
  13. export (float) var move_acceleration = 7 #Players acceleration to movment speed
  14. export (float) var move_deacceleration = 10 #Players deacceleration from movment speed
  15. export (bool) var mouse_captured = true #Toggles mouse captured mode
  16. export (float) var mouse_sensitivity_x = 0.3 #Mouse sensitivity X axis
  17. export (float) var mouse_sensitivity_y = 0.3 #Mouse sensitivity Y axis
  18. export (float) var mouse_max_up = 45 #Mouse max look angle up
  19. export (float) var mouse_max_down = -50 #Mouse max look angle down
  20. export (float) var Jump_speed = 6 #Players jumps speed
  21. export (bool) var allow_fall_input = true #Alow player to input movment when falling
  22. export (bool) var stop_on_slope = false #Toggle sliding on slopes
  23. export (float) var max_slides = 4 #Maximum of slides
  24. export (float) var floor_max_angle = 60 #Maximum slop angle player can traverse
  25. export (bool) var infinite_inertia = false #Toggle infinite inertia
  26. export (float) var gravaty = 1.625 #9.81 #Gravaty acceleration
  27. export (Vector3) var gravaty_vector = Vector3(0, -1, 0) #Gravaty normal direction vector
  28. export (Vector3) var floor_normal = Vector3(0, 1, 0) #Floor normal direction vector
  29. export (Vector3) var jump_vector = Vector3(0, 1, 0) #Jump normal direction vector
  30. export (Vector3) var velocity = Vector3(0, 0, 0) #Initial velocity
  31. onready var up = global_transform.origin.normalized()
  32. onready var forward = global_transform.basis.y
  33. onready var right = forward.cross(up).normalized()
  34. func _ready():
  35. move_and_slide(Common.latLonToGlobal(Vector3(1,1,1737.4)), Vector3.UP)
  36. if mouse_captured:
  37. Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
  38. pass
  39. func _process(delta):
  40. var pos = self.global_transform.origin
  41. .get_parent().get_node("UI/1").text="x:%s y:%s z:%s" %[pos.x, pos.y, pos.z]
  42. .get_parent().get_node("UI/2").text="latlonhight: "+str(Common.globalToLatLon(pos))+","+str(pos.length())
  43. #.get_parent().get_node("UI/4").text="chunkDist: %s" % get_node("/Tiles").get_child(0).get_global_transform().origin
  44. floor_normal = pos.normalized()
  45. gravaty_vector = floor_normal * -1
  46. #self.transform.basis.y = floor_normal
  47. #rotation_degrees.x = 90
  48. func _physics_process(delta):
  49. #player movement XY
  50. var dir = Vector3()
  51. up = global_transform.origin.normalized()
  52. right = forward.cross(up).normalized()
  53. forward = up.cross(right).normalized()
  54. if can_move and (is_on_floor() or allow_fall_input):
  55. #Left
  56. if Input.is_action_pressed("move_left"):
  57. dir -= right
  58. #Right
  59. if Input.is_action_pressed("move_right"):
  60. dir += right
  61. #Forward
  62. if Input.is_action_pressed("move_forward"):
  63. dir += forward
  64. #Backwards
  65. if Input.is_action_pressed("move_backward"):
  66. dir -= forward
  67. # Jump
  68. if not is_on_floor():
  69. if Input.is_action_pressed("move_up"):
  70. dir += up
  71. if Input.is_action_pressed("move_down"):
  72. dir -= up
  73. #Jump
  74. #if Input.is_action_pressed("move_jump") and is_on_floor():
  75. # velocity += jump_vector * Jump_speed - (jump_vector * -1).normalized() * velocity.dot(jump_vector * -1)
  76. #Sprint toggle
  77. if can_sprint and Input.is_action_just_pressed("move_sprint"): #and is_on_floor():
  78. move_sprint = true
  79. if can_sprint and not Input.is_action_pressed("move_sprint"): #and is_on_floor():
  80. move_sprint = false
  81. velocity = velocity.linear_interpolate(dir * (move_speed_sprint if move_sprint else move_speed), move_acceleration * delta)
  82. if !is_on_floor():
  83. velocity += gravaty_vector * gravaty * delta
  84. velocity = move_and_slide(velocity, up)
  85. transform = transform.looking_at(global_transform.origin + forward, up)
  86. #Smooth movement
  87. #dir = transform.basis.xform(dir.normalized()) * (move_speed_sprint if move_sprint else move_speed)
  88. #if is_on_floor() or dir != Vector3(0, 0, 0):
  89. # var acceleration = move_acceleration if dir.dot(velocity) else move_deacceleration
  90. # var vp = gravaty_vector.normalized() * velocity.dot(gravaty_vector)
  91. # velocity = (velocity - vp).linear_interpolate(dir, acceleration * delta) + vp
  92. #Gravaty
  93. #if !is_on_floor():
  94. # velocity += gravaty_vector * gravaty * delta
  95. #Player move
  96. #move_and_slide(velocity, floor_normal, stop_on_slope, max_slides, deg2rad(floor_max_angle), infinite_inertia)
  97. #Player orientation
  98. #var spos = Common.globalToLatLon(self.global_transform.origin)
  99. #global_rotate(Vector3(1,0,0), deg2rad(spos.x))
  100. #global_rotate(Vector3(0,1,0), deg2rad(spos.y))
  101. func _input(event):
  102. #Mouse movement
  103. if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
  104. rotate_y(deg2rad(-event.relative.x * 0.3))
  105. forward = forward.rotated(up, deg2rad(-event.relative.x * mouse_sensitivity_x))
  106. #rotate_y(deg2rad(-event.relative.x * mouse_sensitivity_x))
  107. #self.rotation_degrees.y += -event.relative.x * mouse_sensitivity_x
  108. $Camera.rotation_degrees.x = clamp($Camera.rotation_degrees.x + -event.relative.y * mouse_sensitivity_y, mouse_max_down, mouse_max_up)
  109. pass