SKAction没有重新启动

时间:2016-03-31 21:48:09

标签: ios iphone swift sprite-kit

在我的didMoveToView中,我有以下代码:

let spawnWall = SKAction.runBlock({[unowned self] in self.makeWalls();});
let sequence = SKAction.sequence([SKAction.waitForDuration(2.9),spawnWall])
let repeatForever = SKAction.repeatActionForever(sequence);
self.runAction(repeatForever, withKey:"makeWalls");

基本上每2.9秒调用一次函数makeWalls

现在只要有触摸,touchesBegan函数就会调用一个名为changeSpeed的函数来执行此操作:

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.repeatActionForever(sequence);
        self.runAction(repeatForever, withKey:"makeWalls");
    }
}

基本上停止从didMoveToView启动的上一个SKAction,并且当且仅当得分为> = 2时,调用makeWalls的速度更快(每1.4秒)。

在我的gameReset代码中,我有以下内容:

self.removeAllActions()
self.removeAllChildren()
self.view?.presentScene(self)

我期待

当游戏重新开始时,每2.9秒调用makeWalls,直到得分> = 2,然后每1.4秒调用一次makeWalls。

发生了什么

如果要执行上述操作,则每1.4秒调用

makeWalls。我这么说是因为墙壁看起来更快了。

我也尝试过但没有工作

我尝试在self.removeActionForKey("makeWalls");代码中添加didMoveToView代码中的{{1}}代码。不幸的是,这似乎也不起作用。

可以在这里找到: https://paste.ee/p/tGlrY#AtdTJLRBGUcPFXtkVo2XEvsFJkNK1hLR

任何帮助都将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为你最大的问题是场景没有正确地重置。我还没有看到有人做你正在做的事情并重新呈现你的场景(或者直接调用didMoveToView,我认为不会直接调用它)而不是重新启动一个新场景。我会尝试下面的...

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    /* Called when a touch begins */

    if freezeMainChar == 0
    {
        changeSpeed()
        let touch = touches.first
        let touchLocation = touch?.locationInNode(self)

        if touchLocation!.x == 450
        {
            //do something
        }
    }

    else
    {
        score = 0
        scoreLabel.text = "0"

        movingObjects.removeAllChildren()
        movingObjects.removeAllActions()
        gameOverLabelHolder.removeAllChildren()

        freezeMainChar = 0
        movingObjects.speed = 1

        self.removeAllActions()
        self.removeAllChildren()

        //didMoveToView(view!)
        let newScene = GameScene(size: size)
        newScene.scaleMode = scene.scaleMode
        view.presentScene(newScene)
    }

}

这应该为新游戏开启新鲜事物。希望这有助于解决您的问题。