0 votes

here is my code

extends KinematicBody

var mousesensitivity = 1
var joystick
deadzone = 0.2

var runspeed = 15 # Running speed in m/s
var walk
speed = runspeed / 1.8
var crouch
speed = runspeed / 4.5
var jump
height = 7

var currentspeed = runspeed

var groundacceleration = 15
var air
acceleration = 7
var acceleration = air_acceleration

var direction = Vector3()
var velocity = Vector3() # Direction with acceleration added
var movement = Vector3() # Velocity with gravity added

var gravity = 19
var gravity_vec = Vector3()

var snapped = false
var canjump = true
var crouched = false
var can
crouch = true

Data:

var playerspeed = 0
var falling
velocity = 0

func ready():
Input.set
mousemode(Input.MOUSEMODE_CAPTURED)

func input(event):
# Look with the mouse
if event is InputEventMouseMotion:
rotation
degrees.y -= event.relative.x * mousesensitivity / 18
$Head.rotation
degrees.x -= event.relative.y * mousesensitivity / 18
$Head.rotation
degrees.x = clamp($Head.rotation_degrees.x, -90, 90)

direction = Vector3()

func physicsprocess(delta):
# Look with the right analog of the joystick
if Input.getjoyaxis(0, 2) < -joystickdeadzone or Input.getjoyaxis(0, 2) > joystickdeadzone:
rotationdegrees.y -= Input.getjoyaxis(0, 2) * 2
if Input.get
joyaxis(0, 3) < -joystickdeadzone or Input.getjoyaxis(0, 3) > joystickdeadzone:
$Head.rotation
degrees.x = clamp($Head.rotationdegrees.x - Input.getjoy_axis(0, 3) * 2, -90, 90)

# Direction inputs
direction = Vector3()

if Input.is_key_pressed(KEY_W):
    direction.z += -1
if Input.is_key_pressed(KEY_S):
    direction.z += 1
if Input.is_key_pressed(KEY_A):
    direction.x += -1
if Input.is_key_pressed(KEY_D):
    direction.x += 1

direction = direction.normalized()

#If we aren't using the keyboard, take the input from the left analog of the joystick
if direction == Vector3():
    direction.z = Input.get_joy_axis(0, 1)
    direction.x = Input.get_joy_axis(0, 0)

    # Apply a deadzone to the joystick
    if direction.z < joystick_deadzone and direction.z > -joystick_deadzone:
        direction.z = 0
    if direction.x < joystick_deadzone and direction.x > -joystick_deadzone:
        direction.x = 0

# Rotates the direction from the Y axis to move forward
direction = direction.rotated(Vector3.UP, rotation.y)

# Snaps the character on the ground and changes the gravity vector to climb
# slopes at the same speed until 45 degrees
if is_on_floor():
    if snapped == false:
        falling_velocity = gravity_vec.y
        land_animation()
    acceleration = ground_acceleration
    movement.y = 0
    gravity_vec = -get_floor_normal() * 10
    snapped = true
else:
    acceleration = air_acceleration
    if snapped:
        gravity_vec = Vector3()
        snapped = false
    else:
        gravity_vec += Vector3.DOWN * gravity * delta

if is_on_floor():
    if Input.is_key_pressed(KEY_SHIFT) or Input.get_joy_axis(0, 6) >= 0.6:
        current_speed = run_speed
    else:
        current_speed = walk_speed
    if crouched:
        current_speed = crouch_speed

if Input.is_key_pressed(KEY_SPACE) or Input.is_joy_button_pressed(0, JOY_XBOX_A):
    if is_on_floor() and can_jump:
        snapped = false
        can_jump = false
        gravity_vec = Vector3.UP * jump_height
else:
    can_jump = true

if is_on_ceiling():
    gravity_vec.y = 0

if Input.is_key_pressed(KEY_CONTROL) or Input.is_key_pressed(KEY_C) or Input.is_joy_button_pressed(0, JOY_XBOX_B):
    crouch_animation(true)
else:
    crouch_animation(false)

velocity = velocity.linear_interpolate(direction * current_speed, acceleration * delta)

movement.x = velocity.x + gravity_vec.x
movement.z = velocity.z + gravity_vec.z
movement.y = gravity_vec.y

movement = move_and_slide(movement, Vector3.UP)

player_speed = movement.length()

func landanimation():
var movement
y = clamp(falling_velocity, -20, 0) / 40

$LandTween.interpolate_property($Head/Camera, "translation:y", 0, movement_y, 0.1, Tween.TRANS_SINE, Tween.EASE_OUT)
$LandTween.interpolate_property($Head/Camera, "translation:y", movement_y, 0, 0.25, Tween.TRANS_SINE, Tween.EASE_IN_OUT, 0.1)
$LandTween.start()

func crouchanimation(buttonpressed):
if buttonpressed:
if not crouched:
$CrouchTween.interpolate
property($MeshInstance, "mesh:midheight", $MeshInstance.mesh.midheight, 0.25, 0.2, Tween.TRANSSINE, Tween.EASEINOUT)
$CrouchTween.interpolate
property($CollisionShape, "shape:height", $CollisionShape.shape.height, 0.25, 0.2, Tween.TRANSSINE, Tween.EASEINOUT)
$CrouchTween.interpolate
property($Head, "translation:y", $Head.translation.y, 1.35, 0.2, Tween.TRANSSINE, Tween.EASEINOUT)
$CrouchTween.start()
crouched = true
else:
if crouched:
$CrouchTween.interpolate
property($MeshInstance, "mesh:midheight", $MeshInstance.mesh.midheight, 0.75, 0.2, Tween.TRANSSINE, Tween.EASEINOUT)
$CrouchTween.interpolate
property($CollisionShape, "shape:height", $CollisionShape.shape.height, 0.75, 0.2, Tween.TRANSSINE, Tween.EASEINOUT)
$CrouchTween.interpolate
property($Head, "translation:y", $Head.translation.y, 1.6, 0.2, Tween.TRANSSINE, Tween.EASEIN_OUT)
$CrouchTween.start()
crouched = false

Godot version 3.5.1
in Engine by (39 points)

1 Answer

0 votes

If stoponslope is true, body will not slide on slopes when you include gravity in linear_velocity and the body is standing still.

Try adding true as the third argument for move_and_slide():

movement = move_and_slide(movement, Vector3.UP,true)
by (62 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.