Sprite Kit - 从didBeginContact()创建节点

时间:2015-10-06 22:09:13

标签: ios swift sprite-kit position nodes

我正在使用自定义砖类:

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类中定义的(100,50)。实际上,如果我继续使用println(brick.position)我得到(100,50),但在屏幕上它看起来位于(0,0)。

如果我在代码中的任何其他位置创建砖块,例如在touchesBegan()update()函数中,则位置设置正确。仅在从didBeginContact()创建节点时才会出现此问题。

1 个答案:

答案 0 :(得分:0)

这应该有所帮助,它解释了单帧中的步骤。

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

您正在错误的时间创建它,因此幕后的其中一个步骤是重置它,因为缺少一些步骤。处理didFinishUpdate命令的队列。 (我只是在did接触中创建对象,然后将其抛入数组,然后在didFinishUpdate上,遍历数组并将它们添加到场景中,并清除数组)