Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- extends CharacterBody2D
- # Переделанный под стейтмашину стандартный контроллер Godot 4
- # Вот наши стейты, они замыкаются на функции
- var walk_state := process_walk
- var talk_state := process_talk
- var jump_state := process_jump_fall
- var current_state : Callable # и вот наш куррент стейт, который будет процессировать
- const SPEED = 300.0
- const JUMP_VELOCITY = -400.0
- # Get the gravity from the project settings to be synced with RigidBody nodes.
- var gravity = ProjectSettings.get_setting("physics/2d/default_gravity")
- func _ready():
- # Инициируем машину дефолтным стейтом
- current_state = walk_state
- # В главном колбэке происходит вызов куррент стейта и мув. И всё.
- func _physics_process(delta: float):
- current_state.call(delta)
- move_and_slide()
- # А дальше начинаем разбирать стандартный контроллер на запчасти
- # Здесь работаем с гравитацией
- func add_gravity(delta: float):
- # Add the gravity.
- if not is_on_floor():
- velocity.y += gravity * delta
- # Здесь работаем с инпутом
- func get_input():
- # Get the input direction and handle the movement/deceleration.
- # As good practice, you should replace UI actions with custom gameplay actions.
- var direction = Input.get_axis("ui_left", "ui_right")
- if direction:
- velocity.x = direction * SPEED
- else:
- velocity.x = move_toward(velocity.x, 0, SPEED)
- # Здесь работаем с прыжком. Здесь появляется первый переход между стейтами.
- func handle_jump():
- # Handle jump.
- if Input.is_action_just_pressed("ui_accept"): # and is_on_floor(): это уже не нужно
- current_state = jump_state
- velocity.y = JUMP_VELOCITY
- # И наконец вот они замыкания-лямбды стейтов.
- # Это обработка ходьбы
- func process_walk(delta: float):
- add_gravity(delta) # Гравитируем
- handle_jump() # Прыгаем
- get_input() # Ходим
- # Здесь обработка прыжка (и падения)
- func process_jump_fall(delta: float):
- add_gravity(delta) # Гравитируем
- get_input() # смещаемся в полёте. Если это закомментировать, будет реалистично, но неудобно.
- if is_on_floor(): # Если не окажешься на полу, будешь падать вечно
- current_state = walk_state # поэтому здесь нужно еще логики набросать, что выходит за рамки примера
- # А вот так я бы сделал замыкание диалогового стейта
- func process_talk(delta: float):
- # if dialogue.closed:
- # current_state = walk_state
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement