spritekit中的多个NSTimers无法按预期工作

时间:2016-03-28 15:30:01

标签: ios swift sprite-kit swift2

目的:

我有粒子从屏幕顶部掉下来,我希望他们提高速度,因为得分达到一定值。

以前失败的尝试:

我首先使那些落下的粒子受到重力影响,并试图在分数达到一定值时增加重力值。然而它似乎没有用,所以我认为在游戏中不能改变引力。

现状:

经过一些研究,我想到了使用两个全球NSTimers,slowTimerfastTimer。在slowTimer中调用didMoveToView。在touchesBegan中,每次有一个点按,我都会调用一个函数,即changeSpeed:

    func changeSpeed()
        {

            if score >= 2

            {
                slowTimer.invalidate()
                makeWallsDividerT = 300

                fastTimer =  NSTimer.scheduledTimerWithTimeInterval(1.4, target: self, selector: Selector("makeWalls"), userInfo: nil, repeats: true)
            }

        }

makeWallsDividerTfunction makeWalls中的一个变量,由fastTimer调用。

当前情况的问题:

当游戏结束并且所有内容都重置时,我会fastTimer.invalidate()并且仍然存在问题,因为它没有重置为slowTimer。此外,似乎两个计时器都在重置后开启,游戏比fastTimer快得多。

请指点什么?或任何其他方式来实现我想要做的事情? 谢谢!

4 个答案:

答案 0 :(得分:2)

NSTimer的替代方法是使用SKAction

SKAction *wait = [SKAction waitForDuration:1.0f]; 

答案 1 :(得分:2)

问题是你根本不应该在NSTimers中使用SpriteKit

使用SKAction

    runAction(
        SKAction.sequence([
            SKAction.waitForDuration(1.4),
            SKAction.runBlock({
                self.makeWalls()
            })
        ])
    )

答案 2 :(得分:2)

要重新编写代码,以便不再使用NSTimers,您需要执行以下操作:

override func didMoveToView(view:SKView)
{
    let spawnWall = SKAction.runBlock({[unowned self] in self.makeWalls();});
    let sequence = SKAction.sequence([SKAction.waitForDuration(3),spawnWall])
    let repeatForever = SKAction.repeatActionForever(sequence);
    self.runAction(repeatForver, withKey:"makeWalls"); 
}

func changeSpeed()
{
    if score >= 2
    {
        self.removeActionForKey("makeWalls");  
        makeWallsDividerT = 300;
        let spawnWall = SKAction.runBlock({[unowned self] in self.makeWalls();});
        let sequence = SKAction.sequence([SKAction.waitForDuration(1.4),spawnWall])
        let repeatForever = SKAction.repeatForever(sequence);
        self.runAction(repeatForver, withKey:"makeWalls"); 

    }
}

这可以防止触发多个操作。 (在你的情况下,你有多个计时器被解雇,你只停止了最后一个计时器。)

答案 3 :(得分:2)

因为产卵动作很简单,例如。等待+添加墙,你可以修改产卵动作的速度,如下所示:

import SpriteKit

class GameScene: SKScene {

    var score = 0 { didSet{changeSpawningSpeed() } }

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

        let wait = SKAction.waitForDuration(2.0)
        let block = SKAction.runBlock({ [unowned self] in self.spawnWalls()})
        let sequence = SKAction.sequence([wait, block])

        runAction(SKAction.repeatActionForever(sequence), withKey: "spawning")
    }

    func spawnWalls(){print("Walls spawned")}

    func changeSpawningSpeed(){

        if score == 2 {
            if let action = actionForKey("spawning"){action.speed += 1.0}
        }
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
    {
        score += 1
    }
}