Я вижу, вы исправили свою проблему, и я хотел предложить альтернативу.
Ниже приводится инкапсуляция вашего другого кода движения. Это сочетание паттерна State и небольшого паттерна Strategy.
При такой инкапсуляции это устраняет необходимость проверки if state:
в каждом методе, каждый объект может поддерживать свое собственное состояние, такое как speed
и velocity
, и у вас есть четкая точка входа и выхода для очистки, например, сброс velocity
на ноль.
Это не требуется, но я надеюсь, что это поможет.
extends KinematicBody2D
class _Movement:
var body = null
var velocity = Vector2()
func enter(body):
self.body = body
func exit():
body = null
func physics_process(delta):
pass
class Walk extends _Movement:
var speed = 0
func enter(body):
.enter(body)
speed = body.FAST_SPEED
func physics_process(delta):
velocity = Vector2()
if Input.is_action_pressed("right"):
velocity.x += speed
if Input.is_action_pressed("left"):
velocity.x -= speed
if Input.is_action_pressed("down"):
velocity.y += speed
if Input.is_action_pressed("up"):
velocity.y -= speed
if Input.is_action_pressed("shift"):
speed = body.SLOW_SPEED
else:
speed = body.FAST_SPEED
move_and_slide(velocity)
class Fly extends _Movement:
func enter(body):
.enter(body)
velocity = Vector2()
func physics_process(delta):
var axis = get_input_axis()
if axs == Vector2.ZERO:
apply_friction(body.ACCELERATION * delta)
else:
apply_movement(axis * body.ACCELERATION * delta)
velocity = body.move_and_slide(velocity)
func apply_friction(amount):
if velocity.length() > amount:
velocity -= velocity.normalized() * amount
else:
velocity = Vector2.ZERO
func apply_movement(acceleration):
velocity += acceleration
velocity = velocity.clamped(body.MAX_SPEED)
func get_input_axis():
var axis = Vector2.ZERO
axis.x = int(Input.is_action_pressed("right")) - int(Input.is_action_pressed("left"))
axis.y = int(Input.is_action_pressed("down")) - int(Input.is_action_pressed("up"))
return axis.normalized()
export var MAX_SPEED = 1000
export var ACCELERATION = 1800
export var SLOW_SPEED = 70
export var FAST_SPEED = 300
var FLY = Fly.new()
var WALK = Walk.new()
var wings = false
var movement = WALK
func _ready():
movement.enter(self)
func _unhandled_input(event):
if Input.is_action_just_pressed("toggle"):
wings = !wings
movement.exit()
movement = FLY if wings else WALK
movement.enter(self)
func _physics_process(delta):
movement.physics_process(delta)