Как оживить и переместить узел игрока одновременно, используя сцену спрайтового набора? - PullRequest
0 голосов
/ 04 января 2019

Я работаю над небольшой игрой для ios с этой библиотекой джойстиков , встроенной в нее.Моя проблема заключается в том, что после вычисления направления движения джойстика я хочу, чтобы персонаж изменился на работающую анимацию (я реализую анимацию с помощью файла .sks).Это почти работает, кроме как после того, как анимация началась, она останавливается и не заканчивается, пока игрок не отпустит палку.Часть моего кода ниже.Любая помощь приветствуется.

Функция для настройки ручки:

func setupJoystick() {
    addChild(analogJoyStick)

    analogJoyStick.trackingHandler = { [unowned self] data in
        self.thePlayer.position = CGPoint(x: self.thePlayer.position.x + (data.velocity.x * 0.04), y: self.thePlayer.position.y + (data.velocity.y * 0.04))

        let degrees = self.analogJoyStick.data.angular * 360 / (2 * .pi)
        if degrees > 0 {
         let walkAnimation:SKAction = SKAction(named: "WalkLeft")!
         self.thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")
        } else if degrees < 0 {
         let walkAnimation:SKAction = SKAction(named: "WalkRight")!
         self.thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")
        }
    }

    analogJoyStick.beginHandler = { [unowned self] in
        let degrees = self.analogJoyStick.data.angular * 360 / (2 * .pi)
        if degrees > 0 {
            let walkAnimation:SKAction = SKAction(named: "WalkLeft")!
            self.thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")
        } else if degrees < 0 {
            let walkAnimation:SKAction = SKAction(named: "WalkRight")!
            self.thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")
        }
    }

    analogJoyStick.stopHandler = { [unowned self] in
        self.thePlayer.removeAction(forKey: "animating")
    }
}

Вот изображение кода: Spritekit Demo

1 Ответ

0 голосов
/ 05 января 2019

Я прочитал инструкции библиотеки джойстиков и увидел два метода (обработчика), которые вы можете использовать:

var beginHandler: (() -> Void)? // before move
var stopHandler: (() -> Void)? // after move

В beginHandler() добавьте (повторную) анимацию ходьбы:

let walkAnimation: SKAction = SKAction(named: theAnimation)!
thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")

И удалить действие в stopHandler()

thePlayer.removeAction(forKey: "animating")

Или с помощью замыканий (также из документации):

joystick.beginHandler = { [unowned self] in
  let walkAnimation: SKAction = SKAction(named: ".sks")!
  self.thePlayer.run(SKAction.repeatForever(walkAnimation), withKey: "animating")
}

joystick.stopHandler = { [unowned self] in
  self.thePlayer.removeAction(forKey: "animating")
}
...