我正在尝试使用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)是我想要的)
答案 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()
}