我正在使用自定义砖类:
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()
创建节点时才会出现此问题。
答案 0 :(得分:0)
这应该有所帮助,它解释了单帧中的步骤。
您正在错误的时间创建它,因此幕后的其中一个步骤是重置它,因为缺少一些步骤。处理didFinishUpdate命令的队列。 (我只是在did接触中创建对象,然后将其抛入数组,然后在didFinishUpdate上,遍历数组并将它们添加到场景中,并清除数组)