diff options
Diffstat (limited to 'character/fps_controller')
-rw-r--r-- | character/fps_controller/fps_controller.gd | 121 | ||||
-rw-r--r-- | character/fps_controller/fps_controller.tscn | 3 |
2 files changed, 60 insertions, 64 deletions
diff --git a/character/fps_controller/fps_controller.gd b/character/fps_controller/fps_controller.gd index 09ef556..8d5af12 100644 --- a/character/fps_controller/fps_controller.gd +++ b/character/fps_controller/fps_controller.gd @@ -15,83 +15,76 @@ var velocity : Vector3 var is_climbing : bool = false func _ready(): - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + func _process(_delta): - get_input() - + get_input() + func _physics_process(_delta): - handle_movement() - handle_jumping() - handle_collision() - + handle_movement() + handle_jumping() + handle_collision() + func get_input(): - var dir : Vector3 = Vector3.ZERO - - #Get base movement input - - if Input.is_action_pressed("forward"): - dir += -global_transform.basis.z - if is_climbing: - dir += global_transform.basis.y - if Input.is_action_pressed("backward"): - dir += global_transform.basis.z - if is_climbing: - dir += -global_transform.basis.y - if Input.is_action_pressed("left"): - dir += -global_transform.basis.x - if Input.is_action_pressed("right"): - dir += global_transform.basis.x - - dir = dir.normalized() - - #Pull X and Z values from directional input. Velocity.y will be handled in physics loop unless climbing. - - if is_climbing: - velocity.y = lerp(velocity.y, dir.y * walk_speed, accel) - - velocity.x = lerp(velocity.x, dir.x * walk_speed, accel) - velocity.z = lerp(velocity.z, dir.z * walk_speed, accel) + var dir : Vector3 = Vector3.ZERO + #Get base movement input + if Input.is_action_pressed("forward"): + dir += -global_transform.basis.z + if is_climbing: + dir += global_transform.basis.y + if Input.is_action_pressed("backward"): + dir += global_transform.basis.z + if is_climbing: + dir += -global_transform.basis.y + if Input.is_action_pressed("left"): + dir += -global_transform.basis.x + if Input.is_action_pressed("right"): + dir += global_transform.basis.x + dir = dir.normalized() + #Pull X and Z values from directional input. Velocity.y will be handled in physics loop unless climbing. + + if is_climbing: + velocity.y = lerp(velocity.y, dir.y * walk_speed, accel) + velocity.x = lerp(velocity.x, dir.x * walk_speed, accel) + velocity.z = lerp(velocity.z, dir.z * walk_speed, accel) func handle_movement(): - #Apply gravity - if !is_climbing: - velocity.y += gravity - if velocity.y < term_velocity: - velocity.y = term_velocity - - velocity = move_and_slide(velocity, Vector3.UP, true, 4, PI/4, false) + #Apply gravity + if !is_climbing: + velocity.y += gravity + if velocity.y < term_velocity: + velocity.y = term_velocity + velocity = move_and_slide_with_snap(velocity, Vector3.DOWN if velocity.y <= 0.0 else Vector3.ZERO, Vector3.UP, true, 4, PI/4, false) func _input(event): - #Handle mouse movement for camera - if event is InputEventMouseMotion: - self.rotate_y(-event.relative.x * Settings.mouse_sens) - camera.rotate_x(-event.relative.y * Settings.mouse_sens) - camera.rotation.x = clamp(camera.rotation.x, -1.2, 1.2) + #Handle mouse movement for camera + if event is InputEventMouseMotion: + self.rotate_y(-event.relative.x * Settings.mouse_sens) + camera.rotate_x(-event.relative.y * Settings.mouse_sens) + camera.rotation.x = clamp(camera.rotation.x, -1.2, 1.2) func handle_jumping(): - if Input.is_action_just_pressed("jump") and is_on_floor(): - velocity.y = jump_strength - + if Input.is_action_just_pressed("jump") and is_on_floor(): + velocity.y = jump_strength func handle_collision(): - for index in get_slide_count(): - var collision = get_slide_collision(index) - var collider = collision.collider - if (collider.get_class() == "RigidBody"): - var col_force_vec = -collision.normal * inertia # rotate the force along collision normal - # collision pos - # > RigidBody.add_force(force, pos) > The position uses the rotation of the global coordinate system, but is centered at the object's origin. - # > KinematicCollision.position() > The point of collision, in global coordinates. - # So to add force at collision position, substract colliders pos from collision.position - var col_pos = collision.position - collider.transform.origin - collider.add_force(col_force_vec, col_pos) + for index in get_slide_count(): + var collision = get_slide_collision(index) + var collider = collision.collider + if (collider.get_class() == "RigidBody"): + var col_force_vec = -collision.normal * inertia # rotate the force along collision normal + # collision pos + # > RigidBody.add_force(force, pos) > The position uses the rotation of the global coordinate system, but is centered at the object's origin. + # > KinematicCollision.position() > The point of collision, in global coordinates. + # So to add force at collision position, substract colliders pos from collision.position + var col_pos = collision.position - collider.transform.origin + collider.add_force(col_force_vec, col_pos) func _on_ladder_detector_body_entered(body): - if body.is_in_group("ladder"): - is_climbing = true + if body.is_in_group("ladder"): + is_climbing = true func _on_ladder_detector_body_exited(body): - if body.is_in_group("ladder"): - is_climbing = false + if body.is_in_group("ladder"): + is_climbing = false
\ No newline at end of file diff --git a/character/fps_controller/fps_controller.tscn b/character/fps_controller/fps_controller.tscn index ba047b4..b1d9cdf 100644 --- a/character/fps_controller/fps_controller.tscn +++ b/character/fps_controller/fps_controller.tscn @@ -11,6 +11,7 @@ radius = 0.374691 height = 0.0688557 [node name="fps_controller" type="KinematicBody"] +collision_mask = 20 script = ExtResource( 1 ) [node name="CollisionShape" type="CollisionShape" parent="."] @@ -26,6 +27,8 @@ cast_to = Vector3( 0, 0, -3 ) collision_mask = 2 [node name="ladder_detector" type="Area" parent="."] +collision_layer = 0 +collision_mask = 16 [node name="CollisionShape" type="CollisionShape" parent="ladder_detector"] transform = Transform( 1, 0, 0, 0, -1, -8.74228e-08, 0, 8.74228e-08, -1, 0, 0.0169024, -0.28562 ) |