Sprite Kit - 从 didBeginContact() 创建节点

Sprite Kit - Creating node from didBeginContact()

我使用的是自定义积木 class:

import SpriteKit
class Brick: SKSpriteNode {

    enum type { case Normal }

    convenience init (type: Brick.type) {
        self.init(color: .greenColor(), size: CGSizeMake(75, 25))

        physicsBody.SKPhysicsBody(rectangleOfSize: size)
        physicsBody!.mass = 9999
        physicsBody!.affectedByGravity = false

        position = CGPointMake(100, 50)

        // Category and collision bitmasks ...
        // Action to move the brick upwards ...
    }

    // Stuff
}

在我的场景中,我正在创建一块初始积木,一切正常。但是,当我尝试在 didBeginContact() 函数中添加积木时,我得到了意想不到的结果。

我在屏幕的 1/5 高度处有一个 SKNode。所以每当一块砖到达那个高度时,它就会与这个不可见的节点接触并创建一个新的砖:

// Inside SKScene
func didBeginContact(contact: SKPhysicsContact) {

    // I set physics body A and B ...

    if a.categoryBitMask == Category.brick && b.categoryBitMask == Category.brickSpawner {
        addChild(Brick(type: .Normal))
    }
}

所以问题是:当我在此函数中创建新砖时,位置设置为 (0, 0) 而不是 Brick [=29= 中定义的 (100, 50) ].实际上,如果我继续使用 println(brick.position),我会得到 (100, 50),但在屏幕上它看起来位于 (0, 0)。

如果我在代码的其他任何地方创建砖块,例如在 touchesBegan()update() 函数中,位置设置正确。此问题仅在从 didBeginContact().

创建节点时发生

这应该有帮助,它在一个框架中解释了步骤。

https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Introduction/Introduction.html

您在错误的时间创建它,因此由于缺少一些步骤,幕后的其中一个步骤正在重置它。将该进程排队等待 didFinishUpdate 命令。 (我只是在 did contact 中创建对象,然后将其放入数组中,然后在 didFinishUpdate 中遍历数组并将它们添加到场景中,然后清除数组)