From 5d31cee75ce10f57ea3ff7facab31eb3fa8cc856 Mon Sep 17 00:00:00 2001 From: unfa Date: Wed, 19 May 2021 01:59:58 +0200 Subject: [PATCH] Updated player controller. Better, but still breaks when jumping against ledges. --- Game/Classes/Player.gd | 82 ++++++++++++++++++++-------------------- Game/Classes/Player.tscn | 10 ++--- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/Game/Classes/Player.gd b/Game/Classes/Player.gd index 799bf4a..b3f98e2 100644 --- a/Game/Classes/Player.gd +++ b/Game/Classes/Player.gd @@ -1,24 +1,32 @@ extends KinematicBody3D @export var mouse_sensitivity := 0.35 -@export var move_speed := 15 +#var speed := 15 @onready var head = $Head -@onready var ground_check = $GroundCheck - -var move_direction := Vector3.ZERO -var accel_h := 12 -var accel_air := 1 -var accel_ground := 12 +var direction := Vector3.ZERO +var accel := 0 +var speed := 0 +var medium = "ground" +var accel_type := { + "ground": 12, + "air": 1, + "water": 4 + } +var speed_type := { + "ground": 15, + "air": 15, + "water": 7.5 + } var gravity := 28 var jump := 14 -var vel_h := Vector3.ZERO +var velocity := Vector3.ZERO var movement := Vector3.ZERO var gravity_vec := Vector3.ZERO -var ground_contact := false var slide := Vector3.ZERO +var snap := Vector3.ZERO func _ready() -> void: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) @@ -44,51 +52,43 @@ func _input(event) -> void: aim(event) func _physics_process(delta): - move_direction = Vector3.ZERO + direction = Vector3.ZERO - if ground_check.is_colliding(): - ground_contact = true + if is_on_floor(): + snap = -get_floor_normal() + medium = "ground" + gravity_vec = Vector3.ZERO else: - ground_contact = false - - if not is_on_floor(): + snap = Vector3.DOWN + medium = "air" gravity_vec += Vector3.DOWN * gravity * delta - accel_h = accel_air - print("AIR") - elif is_on_floor() and ground_contact: - accel_h = accel_ground - print("FLOOR") - gravity_vec = -get_floor_normal() * gravity - else: - print("OTHER") - accel_h = accel_ground - #gravity_vec = -get_floor_normal() - gravity_vec = Vector3.DOWN * gravity * delta - if Input.is_action_just_pressed("move_jump") and (is_on_floor() or ground_contact): + if Input.is_action_just_pressed("move_jump") and is_on_floor(): + snap = Vector3.ZERO gravity_vec = Vector3.UP * jump if Input.is_action_pressed("move_forward"): - move_direction -= transform.basis.z + direction -= transform.basis.z if Input.is_action_pressed("move_backward"): - move_direction += transform.basis.z + direction += transform.basis.z if Input.is_action_pressed("move_left"): - move_direction -= transform.basis.x + direction -= transform.basis.x if Input.is_action_pressed("move_right"): - move_direction += transform.basis.x + direction += transform.basis.x - if move_direction.length() > 0: # normalized() will return a null - move_direction = move_direction.normalized() + if direction.length() > 0: # normalized() will return a null + direction = direction.normalized() - vel_h = vel_h.lerp(move_direction * move_speed, accel_h * delta) + speed = speed_type[medium] + accel = accel_type[medium] - movement.z = vel_h.z + gravity_vec.z - movement.x = vel_h.x + gravity_vec.x - movement.y = gravity_vec.y + velocity = velocity.lerp(direction * speed, accel * delta) - slide = move_and_slide(movement, Vector3.UP, ) + movement = velocity + gravity_vec - if not is_on_floor(): - vel_h.x = slide.x - vel_h.z = slide.z + slide = move_and_slide_with_snap(movement, snap, Vector3.UP) + + if not is_on_floor(): # while in mid-air collisions affect momentum + velocity.x = slide.x + velocity.z = slide.z gravity_vec.y = slide.y diff --git a/Game/Classes/Player.tscn b/Game/Classes/Player.tscn index bddfe75..6a5039a 100644 --- a/Game/Classes/Player.tscn +++ b/Game/Classes/Player.tscn @@ -27,12 +27,15 @@ script = null transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0 ) script = null -[node name="Camera3D" type="Camera3D" parent="Head"] +[node name="Camera" type="Camera3D" parent="Head"] transform = Transform( 1, 0, 2.38419e-07, 0, 1, 0, -2.38419e-07, 0, 1, 0, 0, 0 ) current = true fov = 90.0 script = null +[node name="Hand" type="Node3D" parent="Head/Camera"] +script = null + [node name="Body" type="CollisionShape3D" parent="."] shape = SubResource( 2 ) script = null @@ -40,8 +43,5 @@ script = null [node name="Feet" type="CollisionShape3D" parent="."] transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0 ) shape = SubResource( 3 ) -script = null - -[node name="GroundCheck" type="RayCast3D" parent="."] -target_position = Vector3( 0, -1.5, 0 ) +disabled = true script = null