尝试在具有 SpriteKit 场景 (SWIFT) 的 didMoveToView 中使用 waitForDuration 延迟生成节点但不工作

Posted

技术标签:

【中文标题】尝试在具有 SpriteKit 场景 (SWIFT) 的 didMoveToView 中使用 waitForDuration 延迟生成节点但不工作【英文标题】:Trying to delay spawn nodes using waitForDuration in didMoveToView with SpriteKit Scene (SWIFT) but not working 【发布时间】:2016-05-19 18:29:49 【问题描述】:

我试图在游戏开始时阻止我的节点掉落一两秒钟。所以我的问题是当我按下启动时,节点已经在屏幕的中间。我还尝试更改节点启动的高度,但这似乎是一个昂贵的解决方案,因为我要小心不要让我的 FPS 变得太低。在我的代码中,我试图在 didMoveToView 中执行此操作,并且我正在使用 waitForDuration 但它不起作用。

Example Image of Nodes Falling Down

有没有 SpriteKit 高手知道我应该怎么做?我正在使用斯威夫特。 这是我的代码:

    override func didMoveToView(view: SKView) 

            let wait = SKAction.waitForDuration(2.5)
            let run = SKAction.runBlock 
                self.spawnNumbers()
            
            numContainer.runAction(SKAction.sequence([wait, run]))
    

func spawnNumbers() 

        let minValue = self.size.width / 8
        let maxValue = self.size.width - 36

        let spawnPoint = CGFloat(arc4random_uniform(UInt32(maxValue - minValue)))
        let action = SKAction.moveToY(-300, duration: 2)

        numContainer = SKSpriteNode(imageNamed: "Circle")
        numContainer.name = "Circle"
        numContainer.size = CGSize(width: 72, height: 72)
        numContainer.anchorPoint = CGPointMake(0, 0)
        numContainer.position = CGPoint(x: spawnPoint, y: self.size.height)
        numContainer.runAction(SKAction.repeatActionForever(action))
        numContainer.zPosition = 2

        let numberLabel = SKLabelNode(fontNamed: "AvenirNext-Bold")
        numberLabel.text = "\(numToTouch)"
        numberLabel.name = "Label"
        numberLabel.zPosition = -1
        numberLabel.position = CGPointMake(CGRectGetMidX(numContainer.centerRect) + 36, CGRectGetMidY(numContainer.centerRect) + 36)
        numberLabel.horizontalAlignmentMode = .Center
        numberLabel.verticalAlignmentMode = .Center
        numberLabel.fontColor = UIColor.whiteColor()
        numberLabel.fontSize = 28

        addChild(numContainer)
        numContainer.addChild(numberLabel)
        numContainerArray.append(numContainer)
        numToTouch += 1
    

【问题讨论】:

所以这是基于物理的?还有你想说什么“因为我想成为ca”? @cocojoe 该应用程序不是基于物理的。 (也修正了错字。) 所以spawnNumbers() 为你启动了这个动作,它被调用的唯一地方是在这个动作块中?为什么不在玩家按下你的开始按钮后使用你的动作序列?对你的“保持我的 FPS 低”声明有点好奇? 显示 self.spawnNumbers() FPS 是每秒帧数。我这么说是因为我不想要低帧。 【参考方案1】:

我认为您必须将 2.5 秒转换为 NSTimeInterval:

 let wait = SKAction.waitForDuration(NSTimeInterval(2.5))

您也可以尝试将动作放入场景的init 函数中:

 override init (size: CGSize) 
     super.init(size: size)

     //your code from before
 

另外,不确定这是否重要,但这是我通常会做的,并且有效,

 let wait = SKAction.waitForDuration(NSTimeInterval(2.5))
 let action = SKAction.runBlock(() in self.spawnNumbers())
 let actionThenWait = SKAction.sequence([wait, action])
 self.runAction(actionThenWait)

【讨论】:

以上是关于尝试在具有 SpriteKit 场景 (SWIFT) 的 didMoveToView 中使用 waitForDuration 延迟生成节点但不工作的主要内容,如果未能解决你的问题,请参考以下文章

在 SpriteKit Swift 2 中切换场景

Swift / Spritekit:通过特定场景播放音乐

Swift,SpriteKit:释放游戏场景并重新分配新场景

Swift和Spritekit sceneDidLoad被调用多个

Swift,SpriteKit:如何保存场景的整个进度

在spritekit swift问题中更改场景