我在将新节点添加到现有节点所在的场景时遇到了问题。当我添加它们时,我将.position
属性设置为相同,但它们出现在场景的原点而不是现有节点的位置。
我正在SpriteKit中构建一个非常简单的类似小行星的游戏。我的GameScene上有一个添加小行星的方法:
// MARK: - Asteroids
func insertAsteroids(count: Int, size: AsteroidSize, newPosition: CGPoint?) {
for i in 0 ..< initialAsteroidCount {
let asteroid = Asteroid(size: size)
if let position = newPosition {
asteroid.position = position
} else {
asteroid.position = randomPositionOnScene()
}
self.addChild(asteroid)
}
}
在我的GameScene中,我将其称为insertAsteroids(initialAsteroidCount, size: AsteroidSize.Big, newPosition: nil)
,newPosition
设置为nil
,因此它们会随机播放。
当我拍摄小行星时,我有一个调用相同方法的联系处理程序,但略有不同:
func didBeginContact(contact: SKPhysicsContact) {
[...]
//make new asteroids
if let newSize = oldAsteroid.smallerAsteroidSize() {
let newAsteroidCount = Int(arc4random_uniform(2)) + 2
self.insertAsteroids(newAsteroidCount, size: newSize, newPosition: oldAsteroid.position)
}
[...]
}
关键是oldAsteroid.position
。我可以在println()
之后立即insertAsteroids()
这些位置并看到它们是相同的但是当它们显示时它们出现在场景的左下角(原点)。
即使我强迫他们进入已知位置,他们仍然会出现在原点:
self.insertAsteroids(newAsteroidCount, size: newSize, newPosition: CGPoint(x: 40, y: 50))
我是否在协调系统中犯了错误,或者这与在SKPhysicsContactDelegate方法中为场景添加新节点有关?
答案 0 :(得分:0)
我找到了answer。
Paweł Białecki和Donn找到了它。您无法在模拟树时修改树。也就是说,您无法修改didBeginContact()
方法中的树,但您可以设置标记并在didSimulatePhysics()
中修改树。