#why does my velocity get reset here?

5 messages · Page 1 of 1 (latest)

amber rivet
#

player script:

class_name  Player
extends CharacterBody3D

const SPEED = 4
const ACCEL_SPEED = 11
const DECCEL_SPEED = 11
const JUMP_VELOCITY = 5

@onready var state_machine = $State_Machine

var input_dir : Vector2
var direction :Vector3

func _ready() -> void:
    state_machine.init(self)

func _process(delta: float) -> void:
    state_machine.process_frame(delta)
    $Label.text = state_machine.current_state.name

func _physics_process(delta: float) -> void:
    state_machine.process_physics(delta)
    
    input_dir = Input.get_vector("left", "right", "forward", "backward")
    direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()

func _unhandled_input(event: InputEvent) -> void:
    state_machine.process_input(event)

#

state script:

class_name State
extends Node

@export var move_speed: float = 300

var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")

var parent: Player

func enter() -> void:
    pass

func exit() -> void:
    pass

func process_input(_event: InputEvent):
    return null

func process_physics(_delta: float):
    return null

func process_frame(_delta: float):
    return null

#

state machine script:

extends Node

@export var starting_state  : State
@export var current_state   : State

#initialise en donnant a chaque etat une reference au parent
#entre dans le default state
func init(parent: Player) -> void:
    for child in get_children():
        child.parent = parent
    
    change_state(starting_state)

func change_state(new_state: State) -> void:
    if current_state:
        current_state.exit()

    current_state = new_state
    current_state.enter()

func process_input(event: InputEvent):
    var new_state = current_state.process_input(event)
    if new_state:
        change_state(new_state)

func process_physics(delta: float):
    var new_state = current_state.process_physics(delta)
    if new_state:
        change_state(new_state)

func process_frame(delta: float):
    var new_state = current_state.process_frame(delta)
    if new_state:
        change_state(new_state)

#

idle state:

extends State

@export var moving_state : State
@export var jumping_state : State
@export var falling_state : State

func enter() -> void:
    super()

func process_physics(delta):
    parent.velocity.x = lerp(parent.velocity.x, 0.0, delta * parent.DECCEL_SPEED)
    parent.velocity.z = lerp(parent.velocity.z, 0.0, delta * parent.DECCEL_SPEED)
    parent.move_and_slide()
    
    #if in the air:
    if !parent.is_on_floor():
        return falling_state

    #if trying to jump
    if Input.is_action_just_pressed("jump"):
        return jumping_state
    
    #if trying to move
    if parent.input_dir != Vector2.ZERO:
        return moving_state
    

moving state:

extends State

@export var idle_state : State
@export var jumping_state : State
@export var falling_state : State

func enter() -> void:
    super()

func process_physics(delta):
    parent.velocity.x = lerp(parent.velocity.x, parent.direction.x * parent.SPEED, delta * parent.ACCEL_SPEED)
    parent.velocity.z = lerp(parent.velocity.z, parent.direction.z * parent.SPEED, delta * parent.ACCEL_SPEED)
    parent.move_and_slide()
    
    #if in the air
    if !parent.is_on_floor():
        return falling_state
    
    #if trying to jump
    if Input.is_action_just_pressed("jump"):
        return jumping_state
    
    #if not moving
    if parent.input_dir == Vector2.ZERO:
        return idle_state
    

jumping state:

extends State

@export var falling_state : State

func enter() -> void:
    super()

func process_physics(_delta):
    parent.velocity.y = parent.JUMP_VELOCITY
    return falling_state

#

falling state:

extends State

@export var moving_state : State
@export var idle_state : State

func enter() -> void:
    super()

func process_physics(delta):
    parent.velocity.y -= gravity * delta
    parent.velocity.x = lerp(parent.velocity.x, 0.0, delta * parent.DECCEL_SPEED)
    parent.velocity.z = lerp(parent.velocity.z, 0.0, delta * parent.DECCEL_SPEED)
    parent.move_and_slide()
    
    if parent.is_on_floor():
        #if trying to move:
        if parent.input_dir != Vector2.ZERO:
            return moving_state
        else:
            return idle_state