我正在学习SpriteKit游戏开发,只是出于兴趣,但却遇到了一个看似简单的问题,让我束手无策。
基本上,在我缩放有纹理的SKSpriteNode之后,它的框架不是我期望的。我已经想出了一些方法来强制它达到我想要的效果,但我想要了解发生了什么。任何想法都会受到赞赏!
这是我的代码没有进行缩放:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
// spaceship.setScale(0.50)
let debugFrame = SKShapeNode.init(rect: spaceship.frame)
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)
self.addChild(spaceship)
}
我的应用程序看起来是这样的:
如果我将缩放行移动到我将宇宙飞船添加到场景之后,它将做出我期望的操作,但那似乎是错误的:
这是添加宇宙飞船到场景后调用setScale的代码:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
let debugFrame = SKShapeNode.init(rect: spaceship.frame)
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)
self.addChild(spaceship)
spaceship.setScale(0.50)
}
这是我的应用程序运行时的情况:
虽然这样可以工作,但为什么需要这样做呢?
下面有人建议说这是SKShapeNode的一个bug。但是,将SKShapeNode替换为SKLabelNode也会遇到同样的问题:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
spaceship.setScale(0.50)
let scoreNode = SKLabelNode(text: "100")
scoreNode.position = CGPointMake(CGRectGetMidX(spaceship.frame), CGRectGetMaxY(spaceship.frame))
scoreNode.fontColor = SKColor.redColor()
scoreNode.fontSize = 15.0
scoreNode.fontName = "Monaco"
scoreNode.zPosition = 10.0
spaceship.addChild(scoreNode)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)
self.addChild(spaceship)
}
这给我们带来了以下问题:
本意是让得分标签(scoreNode)位于火箭正上方,但是你可以看到它在顶部舷窗的上方。在我调用spaceship.setScale之后,飞船的框架有些问题。
我发现了一个额外的问题:setScale调用不需要在我将飞船添加到场景后进行。它只需要在我将debugFrame/scoreNode添加到飞船后进行。如果我在那个时候进行setScale设置,一切都很好:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
let scoreNode = SKLabelNode(text: "100")
scoreNode.position = CGPointMake(CGRectGetMidX(spaceship.frame), CGRectGetMaxY(spaceship.frame))
scoreNode.fontColor = SKColor.redColor()
scoreNode.fontSize = 15.0
scoreNode.fontName = "Monaco"
scoreNode.zPosition = 10.0
spaceship.addChild(scoreNode)
spaceship.setScale(0.50)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)
self.addChild(spaceship)
}
这会导致: