Godot - у меня проблемы с избавлением от сохраненного импульса при переключении в разные режимы движения - PullRequest
0 голосов
/ 15 января 2020

Я новичок и в Stackoverflow, и в Godot. У меня есть сценарий для моего игрока, который позволяет мне переключаться с движения на основе импульса (крылатого) на традиционное движение в 8 направлениях (бег). Однако, когда я отключаю (крылатый), пока я двигаюсь, и переключаюсь назад (крылатый), он запоминает импульс, который у меня был, и стреляет в меня в этом направлении. Я хочу, чтобы мой проигрыватель сбрасывал скорость до нуля каждый раз, когда я переключаюсь. Мне кажется, я пропускаю только одну или две строки. Вот мой код

extends KinematicBody2D
export var speed = 300
var velocity = Vector2()
var wings = false

export var MAX_SPEED = 1000
export var ACCELERATION = 1800
var motion = Vector2.ZERO


func _physics_process(delta):
    if (!wings):
        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 = 70
        else:
            speed = 300
        move_and_slide(velocity)
    if (wings):
        var axis = get_input_axis()
        if axis == Vector2.ZERO:
            apply_friction(ACCELERATION * delta)
        else:
            apply_movement(axis * ACCELERATION * delta)
        motion = move_and_slide(motion)

func _process(delta):
    if Input.is_action_just_pressed("toggle"):
        wings = !wings



func get_input_axis():
    if (wings):
        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()

func apply_friction(amount):
    if (wings):
        if motion.length() > amount:
            motion -= motion.normalized() * amount
        else:
            motion = Vector2.ZERO

func apply_movement(acceleration):
    if (wings):
        motion += acceleration
        motion = motion.clamped(MAX_SPEED)

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Я вижу, вы исправили свою проблему, и я хотел предложить альтернативу.

Ниже приводится инкапсуляция вашего другого кода движения. Это сочетание паттерна 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)
0 голосов
/ 15 января 2020

Я понял это.

Я добавил это в функции переключателя:

СТАРЫЙ:

func _process(delta):
if Input.is_action_just_pressed("toggle"):
    wings = !wings

NEW:

func _process(delta):
if Input.is_action_just_pressed("toggle"):
    motion = Vector2.ZERO
    wings = !wings
...