复制 SpriteKit 节点位置

Posted

技术标签:

【中文标题】复制 SpriteKit 节点位置【英文标题】:Replicating SpriteKit node position 【发布时间】:2014-11-24 22:54:17 【问题描述】:

我无法将新节点添加到现有节点所在的场景中。添加它们时,我将.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 方法中向场景中添加新节点有关?

【问题讨论】:

【参考方案1】:

我找到了answer。

Paweł Białecki 和 Donn 找到了它。您不能在模拟树时对其进行修改。也就是说,您不能在didBeginContact() 方法内修改树,但您可以在didSimulatePhysics() 中设置标志并修改树。

【讨论】:

以上是关于复制 SpriteKit 节点位置的主要内容,如果未能解决你的问题,请参考以下文章

在 SpriteKit 项目中包含一个 UIKit 小游戏

SpriteKit:无法在联系人回调中更改节点位置

SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false

iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?

SpriteKit如何检测节点是不是正在移动

如何将 SpriteKit 节点移动为汽车驾驶体验?