动作在SpriteKit中无法正常工作

时间:2015-04-26 01:15:43

标签: ios swift sprite-kit action

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

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

blocks need to move to the right, spaceship is sample

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

最后一列的块有一个" isLast" boolean设置为true,当它超过某个阈值时,它应该切换为false并向该组添加一个新的块列,该列现在具有" isLast"设为true。

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

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

blocks getting stuck

这是更新功能:

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 但请记住,因为我对此不熟悉,所以可能充满了令人讨厌的坏习惯。

1 个答案:

答案 0 :(得分:1)

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

    private void button1_Click(object sender, EventArgs e)
    {
        panel1.Controls.Add(new Button() { Top = panel1.Controls.Count * 30 });
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (panel1.Controls.Count > 0)
            panel1.Controls.RemoveAt(panel1.Controls.Count - 1);
        panel1.Refresh();
    }

然后,只要您认为合适,就可以添加一个新块,并在添加时执行相应的操作。

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