SpriteKit 中的动作无法正常工作

Action not working correctly in SpriteKit

我是 iOS 编程的新手,我正在尝试学习使用 Sprite Kit 在 swift 中创建游戏。

我想要实现的是不断创建块并在屏幕上向右移动。

我首先创建一个包含所有初始块的集合,然后向每个块添加一个动作 "constant movement",使它们向右缓慢移动。我遇到的问题是向屏幕添加新块。

块的最后一列有一个 "isLast" 布尔值设置为真,当它超过某个阈值时它应该切换到假并向集合添加一个新的块列现在有 "isLast" 设置为真。

集合中的每个块都添加了 "constantMovement" 动作,使它们向右缓慢移动,新块也添加了它,但它们不像原来的那样工作。

不是所有的移动,即使我打印 "hasActions()" 它说他们这样做,而那些移动的人在到达屏幕中间时停止这样做。我不知道为什么会这样,请有经验的人给我提示吗?

这是更新函数:

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
    let constantMovement = SKAction.moveByX(-1, y: 0, duration: 10);
    background.runAction(SKAction.repeatActionForever(constantMovement));
    let removeBlock = SKAction.removeFromParent();
    let frame = self.frame;
    var currentBlockSprite:SKSpriteNode;
    var newBlock: Block;

    for block in blocks {
        currentBlockSprite = block.sprite!;
        currentBlockSprite.runAction(constantMovement);
        if(block.column == NumColumns - 1) {
            block.isLast = true;
        }

        if(block.isNew) {
            println("position \(currentBlockSprite.position.x) has actions \(currentBlockSprite.hasActions())");
        }

        if(block.isLast && currentBlockSprite.position.x < frame.maxX - 50) {
            println("the block that hits is " + block.description);
            println("HITS AT \(currentBlockSprite.position.x)");
            block.isLast = false;

            for row in 0..<NumRows {
                newBlock = Block(column: NumColumns - 1, row: row, blockType: BlockType.random(), isLast: true, isNew: true);
                blocks.addElement(newBlock);
                addBlockSprite(newBlock);
                println("new block: " + newBlock.description + "position \(newBlock.sprite?.position.x)");
            }
        }

        if(currentBlockSprite.position.x < frame.minX) {
            currentBlockSprite.runAction(removeBlock);
            blocks.removeElement(block);
        }
    }

}

我的整个项目都在这里:https://github.com/thanniaB/JumpingGame/tree/master/Experimenting 但请记住,由于我是新手,它可能充满了令人畏惧的不良做法。

我会从更新函数中删除任何 SKAction 代码,因为这是个坏主意。相反,当您将块精灵添加到场景中时,我只会应用 SKAction,就像这样。

func addBlockSprite(block: Block) {
    let blockSprite = SKSpriteNode(imageNamed: "block");
    blockSprite.position = pointForColumn(block.column, row:block.row);

    if(block.blockType != BlockType.Empty) {
        addChild(blockSprite);

        let constantMovement = SKAction.moveByX(-10, y: 0, duration: 1)
        var currentBlockSprite:SKSpriteNode

        let checkPosition = SKAction.runBlock({ () -> Void in
            if(blockSprite.position.x < -512){
                blockSprite.removeAllActions()
                blockSprite.removeFromParent()
            }
        })

        let movementSequence = SKAction.sequence([constantMovement, checkPosition])

        let constantlyCheckPosition = SKAction.repeatActionForever(movementSequence)
        blockSprite.runAction(constantlyCheckPosition)
    }
    block.sprite = blockSprite;
}

这将允许您在您认为合适的时候简单地添加一个新块,并且在添加时它会执行适当的操作。

我使用 512 作为 iPhone 5 屏幕的尺寸,但您可以将其换成另一个屏幕尺寸,或者更好的是动态反映屏幕尺寸的变量。