Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 同时运行2个操作?游戏冻结?_Swift_Sprite Kit - Fatal编程技术网

Swift 同时运行2个操作?游戏冻结?

Swift 同时运行2个操作?游戏冻结?,swift,sprite-kit,Swift,Sprite Kit,好吧,我在这里尝试了一些不同的方法,但没有任何效果。 我有十几个sprite节点,每个节点都需要: 耽搁 永远重复这句话: a。向下移动屏幕,同时缩放到更大的尺寸(即这两种情况同时发生) b。然后向上移动屏幕,同时缩小到原始大小(这些也同时发生) 通常情况下,我认为这将与序列一起工作,并将缩放和移动动作分为两个块,但它没有起作用。下面获取节点执行一次: block1.runAction(SKAction.runBlock({ self.block1.runAction(

好吧,我在这里尝试了一些不同的方法,但没有任何效果。 我有十几个sprite节点,每个节点都需要:

  • 耽搁
  • 永远重复这句话:
  • a。向下移动屏幕,同时缩放到更大的尺寸(即这两种情况同时发生)

    b。然后向上移动屏幕,同时缩小到原始大小(这些也同时发生)

    通常情况下,我认为这将与序列一起工作,并将缩放和移动动作分为两个块,但它没有起作用。下面获取节点执行一次

     block1.runAction(SKAction.runBlock({
                self.block1.runAction(moveDownLeft)
                self.block1.runAction(scaleBlock)
                let nodelay = 0 * Double(NSEC_PER_SEC)
                let notime = dispatch_time(DISPATCH_TIME_NOW, Int64(nodelay))
                //during delay
                dispatch_after(notime, dispatch_get_main_queue()) {
                    //after delay
                    self.block1.runAction(moveUpLeft)
                    self.block1.runAction(scaleBlockBack)
                }
            })
            )
    
    但是,当我介绍了
    repeatActionForever
    时,整个游戏都冻结了

    为什么我不能永远循环现有代码?如何同时运行这两个操作?

    • SKAction.group(:)
      并行运行多个SKActions
    • SKAction.waitForDuration(:)
      会造成延迟

    使用这些工具的组合来产生你想要的效果。您的
    呼叫后调度是问题所在,尽管我不确定具体是什么。

    您遇到的最大问题是阻塞不能等待。它只是运行代码。所以现在发生的是,你正在开始一些动作,它到达了块的末尾,因为你在做“永远重复”,所以它会再次调用它,即使这些动作还没有完成。这将导致尽可能快地调用该块

    我不完全确定您希望延迟到哪里,但类似的事情应该会奏效,或者让您朝着正确的方向开始

    let delay = SKAction.waitForDuration(4.0) //whatever your delay is
    
    let scaleDownGroup = SKAction.group([moveDownLeft, scaleBlock])
    let scaleUpGroup = SKAction.group([moveUpLeft, scaleBlockBack])
    
    let sequence = SKAction.sequence([scaleDownGroup, delay, scaleUpGroup])
    
    let repeat = SKAction.repeatActionForever(sequence)
    
    self.block1.runAction(repeat)
    

    希望这能有所帮助。

    我想SpriteKit的
    runAction
    runBlock
    不是自动异步的?但我不知道;我还没有真正编写过SK应用程序。