Простая анимация с текстурами, не выполняющимися в SpriteKit - PullRequest
1 голос
/ 29 февраля 2020

Я пытаюсь создать простую анимацию (с 3 текстурами), которая должна запускаться только один раз каждый раз, когда игрок умирает. Я написал код ниже, ища в Интернете, как изменить текстуры и заставить программу ждать между сменой текстур (я хотел сделать это таким образом, а не с атласом, потому что это только 3 текстуры).

Игра работает так, что мяч остается на том месте, где он умирает. Затем он остается в этом положении, в то время как печать (я ждал) печатает 3 раза. Однако между ожиданиями текстура моего мяча не меняется. Это единственное, что не работает в приведенном ниже коде.

Как заставить этот код работать, или есть еще один простой способ создания одноразовой анимации?

override func update(_ currentTime: TimeInterval) {

    //CHECK IF BALL IS INSIDE THE MAP
    if (map_1_buffer.contains(ball.position)) {
           } else {
        let texture1 = SKTexture(imageNamed: "death_1")
        let texture2 = SKTexture(imageNamed: "death_2")
        let texture3 = SKTexture(imageNamed: "death_3")
        let normal = SKTexture(imageNamed: "Ball1")

        ball.texture = texture1
        sleep(UInt32(2))
        print("i waited 1")
        ball.texture = texture2
        sleep(UInt32(2))
        print("i waited 2")
        ball.texture = texture3
        sleep(UInt32(2))
        print("i waited 3")
        ball.texture = normal


        death += 1
        ball.physicsBody?.velocity.dx = 0
        ball.physicsBody?.velocity.dy = 0
        ball.position = CGPoint(x: -120, y: 40)

    }
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Спасибо bg2b за помощь; мой вопрос почти решен. Код, который у меня есть, теперь ждет выполнения анимации, а затем переходит к функции resetBall только один раз (благодаря предложенному вами двоичному флагу), поэтому счетчик смерти работает.

Есть еще одна проблема, которую я пытался решить, и я задам ее как новый вопрос.

func resetBall() {
    ballDying = false
    ball.physicsBody?.velocity.dx = 0
    ball.physicsBody?.velocity.dy = 0
    let normalTexture: SKTexture = SKTexture.init(imageNamed: "Ball1")
    self.ball.texture = SKTexture(imageNamed: "Ball1")
    self.ball.position = CGPoint(x: -120, y: 40)
    self.ball.size = CGSize(width: 40, height: 40)
    death += 1
    nbr_touches = 0
}

var ballDying = false

override func update(_ currentTime: TimeInterval) {
    if ((map_1_buffer.contains(ball.position)) == false) && !ballDying {
        ballDying = true
        let texture1 = SKTexture(imageNamed: "death_1")
        let texture2 = SKTexture(imageNamed: "death_2")
        let texture3 = SKTexture(imageNamed: "death_3")
        let deathAnimation = SKAction.animate(with: [texture1, texture2, texture3], timePerFrame: 0.03)
        ball.physicsBody?.velocity.dx = 0
        ball.physicsBody?.velocity.dy = 0
        self.ball.run(deathAnimation, completion: resetBall)
    }
}
0 голосов
/ 01 марта 2020

Функция update предназначена для того, чтобы вызываться один раз для каждого refre sh, поэтому ввод таких вызовов, как sleep, не будет выполнять то, что вы хотите. Я бы посоветовал прочитать обзор цикла рендеринга здесь: https://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events

Цикл рендеринга выполняется непрерывно, и ваша цель - поместить вещи в update или в процедуры обработки физики. как didBegin или еще что-нибудь, чтобы обнаруживать и реагировать на события, происходящие в игре. Ответы включают в себя такие вещи, как настройка свойств узла, добавление или удаление узлов или добавление действий к узлам. В вашем конкретном случае кажется, что вы хотите иметь анимацию при обнаружении условия. Вы можете сделать это в update примерно следующим образом. Он запускает анимацию шара, и когда действие завершается, он запускает дополнительный код для сброса шара. опечатки, и некоторые вещи в действии завершения для сброса мяча могут не иметь self в зависимости от его объема, но идея, надеюсь, ясна.)

...