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()
.
创建节点时发生
这应该有帮助,它在一个框架中解释了步骤。
您在错误的时间创建它,因此由于缺少一些步骤,幕后的其中一个步骤正在重置它。将该进程排队等待 didFinishUpdate 命令。 (我只是在 did contact 中创建对象,然后将其放入数组中,然后在 didFinishUpdate 中遍历数组并将它们添加到场景中,然后清除数组)
我使用的是自定义积木 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()
.
这应该有帮助,它在一个框架中解释了步骤。
您在错误的时间创建它,因此由于缺少一些步骤,幕后的其中一个步骤正在重置它。将该进程排队等待 didFinishUpdate 命令。 (我只是在 did contact 中创建对象,然后将其放入数组中,然后在 didFinishUpdate 中遍历数组并将它们添加到场景中,然后清除数组)