自定义SKSpriteNode addChild无效

时间:2015-11-08 11:51:36

标签: ios swift sprite-kit skspritenode

我正在尝试使用SpriteKit和Swift开发一个需要在所有场景中拥有共同背景的游戏。由于背景很常见且其操作需要连续,我创建了SKSpriteNode的自定义单例子类,如下所示:

class BackgroundNode: SKSpriteNode {
    static let sharedBackground = BackgroundNode()

    private init()
    {
        let texture = SKTexture(imageNamed: "Background")
        super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
        addActors()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    private func addActors() {
        addClouds()
    }

    private func addClouds() {
        addCloud1()
    }

    private func addCloud1() {
        let cloud1 = SKSpriteNode(imageNamed: "Cloud1")
        cloud1.size = CGSizeMake(0.41953125*self.size.width, 0.225*self.size.height)
        cloud1.position = CGPointMake(-self.size.width/2, 0.7*self.size.height)
        self.addChild(cloud1)
        let moveAction = SKAction.moveTo(CGPointMake(self.size.width/2, 0.7*self.size.height), duration: 20)
        cloud1.runAction(SKAction.repeatActionForever(moveAction))
    }
}

GameScene类我将此节点添加到当前视图中,如下所示:

class GameScene: SKScene {
    override func didMoveToView(view: SKView) {
        BackgroundNode.sharedBackground.size = CGSizeMake(self.size.width, self.size.height)
        BackgroundNode.sharedBackground.position = CGPointMake(self.size.width/2, self.size.height/2)
        addChild(BackgroundNode.sharedBackground)
    }
}

背景图片正确显示,但云未添加。从上面的代码开始,云应该出现在屏幕之外并通过另一个边缘进入屏幕并再次显示出来,但为了验证它是否被添加,我甚至尝试将云添加到屏幕的中心而不是任何动画。云还没有显现出来。这可能是什么问题?以及如何解决它?

修改

我发现孩子实际上已经添加了,但是正在添加并移动到远离屏幕的某些点。我还发现它可能与云的锚点有关,但无论我设置为锚点的值,云总是保留在屏幕的右上角。我可以做些什么来使云点出现(应考虑左下角为(0,0)是我想要的)

1 个答案:

答案 0 :(得分:1)

解决了这个问题。问题是我必须手动设置场景和节点的锚点。将场景和节点的锚点设置为(0,0)解决了问题。新代码如下:

<强> GameScene

override func didMoveToView(view: SKView) {
    anchorPoint = CGPointMake(0, 0) //Added this
    BackgroundNode.sharedBackground.size = CGSizeMake(self.size.width, self.size.height)
    BackgroundNode.sharedBackground.position = CGPointMake(0, 0)
    addChild(BackgroundNode.sharedBackground)
}

<强> BackgroundNode

private init()
{
    let texture = SKTexture(imageNamed: "Background")
    super.init(texture: texture, color: UIColor.clearColor(), size: texture.size())
    anchorPoint = CGPointMake(0, 0) //Added this
    addActors()
}