【问题标题】:SKAction.waitForDuration not working in SpriteKitSKAction.waitForDuration 在 SpriteKit 中不起作用
【发布时间】:2015-03-07 05:30:45
【问题描述】:

我一直在为这个看似简单的功能而烦恼,我正在尝试将其构建到我正在使用 SpriteKit 和 Swift 开发的游戏中。我已经搜索过,无法弄清楚为什么这不起作用。

我想做什么: 当玩家接触到敌人或障碍物时,我想加载并播放一个爆炸动画 createExplosion()(动画在 0.5 秒内完成),然后进行 gameOverAction()。问题是只显示了动画的第一帧,然后它进入了 gameOverAction()。 我试图制作一个 SKAction.sequence,但 Xcode 不喜欢我在序列内调用函数,所以我找到了 SKAction.waitForDuration。问题是,它对代码的执行没有影响。 这应该如何正确完成?

func collisionWithPlayer(playerObject: SKSpriteNode) {
    runAction(SKAction.playSoundFileNamed("spaceExplosion.mp3", waitForCompletion: false))
    createExplosion(playerObject)
    playerObject.removeFromParent()
    runAction(SKAction.waitForDuration(NSTimeInterval(0.5)))
    gameOverAction()
    }

这里是 gameOverAction() 的代码:

func gameOverAction()   {

    backgroundMusicPlayer.stop()

    globalHighScore = NSUserDefaults.standardUserDefaults().objectForKey("GameHighScore") as? Int 

    localHighScore = self.monstersDestroyed

    if globalHighScore == nil {
        globalHighScore = localHighScore
    }

    globalHighScore = self.recordHighScore(localHighScore, highScore: globalHighScore!)
    println(globalHighScore!)

    let reveal = SKTransition.fadeWithDuration(1.0)
    let gameOverScene = GameOverScene(size: self.size, won: false)
    self.view?.presentScene(gameOverScene, transition: reveal)
}

func createExplosion(object: SKSpriteNode) -> SKSpriteNode {

    var explosionArray = Array<SKTexture>()
    var explosionSprite = SKSpriteNode()

    explosionArray.append(SKTexture(imageNamed: "explosionSprite01.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite02.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite03.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite04.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite05.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite06.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite07.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite08.png"))
    explosionArray.append(SKTexture(imageNamed: "explosionSprite09.png"))

    let animateAction = SKAction.animateWithTextures(explosionArray, timePerFrame: 0.05)
    explosionSprite = SKSpriteNode(texture:explosionArray[0])
    explosionSprite.position = CGPoint(x: object.position.x + 10.0, y: object.position.y)
    addChild(explosionSprite)
    explosionSprite.runAction(SKAction.sequence([animateAction, SKAction.removeFromParent()]))
    return(explosionSprite)
}

【问题讨论】:

  • 你需要在waitForDuration之后将gameOverAction作为一个序列运行
  • 能把gameOverAction的方法也发一下吗?
  • 我添加了代码。每当我尝试在 SKAction.sequence 中包含方法调用时,我都无法让 Xcode 满意。我知道方法不是 SKAction,所以我尝试了 .runBlock,但同样没有成功。

标签: ios swift sprite-kit


【解决方案1】:

waitForDuration SKAction 可用于在动作序列中引入延迟,但它不会阻塞调用 runAction 的线程 - 因此您的 waitForDuration 动作将设置为在您的节点上运行,但随后gameOverAction() 将立即被调用。

动作完成后可以使用runAction:completion的完成块来执行gameOverAction()-

func collisionWithPlayer(playerObject: SKSpriteNode) {
    var actions = Array<SKAction>();
     actions.append(SKAction.playSoundFileNamed("spaceExplosion.mp3", waitForCompletion: false))
     actions.append(SKAction.waitForDuration(NSTimeInterval(0.5)))
     actions.append(SKAction.removeFromParent())
     createExplosion(playerObject)
     let sequence = SKAction.sequence(actions);
     playerObject.runAction(sequence,completion: { () -> Void in
         self.gameOverAction()
     })
}

根据createExplosion 所做的事情,也可以将其合并到序列中并消除对waitForDuration 的需要

【讨论】:

  • 谢谢你的回答Paulw11,我已经成功了...当我实现你的代码建议时,只调用actions Array中的第一个动作,调用createExplosion并完成,但是gameOverAction () 永远不会被调用。为什么它不通过其余的 actions[] 值?
  • 另外,Xcode 要求我在完成语句中添加 self.gameOverAction(),这对我来说没有意义,因为 gameOverAction 不属于 collisionWithPlayer?我承认,我对此的理解并不完整。
  • self指的是当前对象实例,而不是当前函数——game over action是当前对象上的一个方法,所以需要用self来表示。
  • 包含 createExplosion 方法
  • 我不确定为什么没有调用您的完成处理程序。设置断点以确保。我能想到的唯一原因是您正在其他地方删除这些操作。
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多