首页 > 解决方案 > 在 SpriteKit 中没有执行纹理的简单动画

问题描述

我正在尝试创建一个简单的动画(具有 3 个纹理),每次玩家死亡时应该只运行一次。我通过在线查找如何更改纹理并让程序在更改纹理之间等待来编写下面的代码(我想这样做而不是使用图集,因为它只有 3 个纹理)。

游戏有效,因此球停留在它死亡的位置。然后它停留在那个位置,而 print(I waited) 打印 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)

    }
}

标签: swiftxcodesprite-kit

解决方案


update函数旨在为每次显示刷新调用一次,因此将诸如sleep调用之类的东西放入其中不会达到您想要的效果。我建议在这里阅读渲染周期的概述:https ://developer.apple.com/documentation/spritekit/skscene/responding_to_frame-cycle_events

渲染周期持续运行,您的目标是将事物放入update或放入物理处理例程中,例如didBegin检测和响应游戏中发生的事情。响应包括调整节点属性、添加或删除节点或向节点添加操作等内容。在您的特定情况下,您似乎想要在检测到条件时制作动画。您可以通过以下方式做到这update一点。它让球运行动画,当动作完成时,它将运行一些额外的代码来重置球。


func checkOutOfBounds() {
  if (!map_1_buffer.contains(ball.position)) {
    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: 2.0)
    ball.run(deathAnimation) {
      self.death += 1
      self.ball.texture = SKTexture(imageNamed: "Ball1")
      self.ball.physicsBody?.velocity.dx = 0
      self.ball.physicsBody?.velocity.dy = 0
      self.ball.position = CGPoint(x: -120, y: 40)
    }
  }
}

override func update(_ currentTime: TimeInterval) {
  checkOutOfBounds()
}

(我没有实际测试此代码的框架,因此可能存在拼写错误,并且重置球的完成操作中的某些内容可能没有,self具体取决于其范围,但希望这个想法很清楚。)


推荐阅读