使用静态方法和属性创建SKSpriteNode
问题描述:
嗨,伙计们!使用静态方法和属性创建SKSpriteNode
我用SpriteKit框架编写游戏,我尝试使用多种配置来创建对象,所以我必须使用static来避免init方法和一些带解码器的样板代码。所以我写了代码,但我不知道这个代码是否可以用于创建目的,但是这段代码实际上工作正常。
class Island: SKSpriteNode {
static func populateIsland(at point: CGPoint) -> SKSpriteNode {
let islandImageName = configureIslandName()
let island = SKSpriteNode(imageNamed: islandImageName)
island.setScale(randomScaleFactor)
island.position = point
return island
}
fileprivate static func configureIslandName() -> String {
let distribution = GKRandomDistribution(lowestValue: 1, highestValue: 4)
let randomNumber = distribution.nextInt()
let imageName = "pic" + "\(randomNumber)"
return imageName
}
fileprivate static var randomScaleFactor: CGFloat {
let distribution = GKRandomDistribution(lowestValue: 7, highestValue: 10)
let randomNumber: CGFloat = CGFloat(distribution.nextInt())/10
return randomNumber
}
}
所以实际的例子是:
let island = Island.populateIsland(at: CGPoint(x: 100, y: 100))
谢谢你的建议,提前!
答
我认为这完全没问题。
使用静态成员时,它们与类型的实例无关,但与类型本身相关。由于您的方法只是创建并返回SKSpriteNode
,因此它不需要任何状态,因此可以独立于Island
类型的实例。
我也认为你应该重新命名一些你的成员名称来符合Swift 3 API指南,并且使其目的更加清晰。例如populateIslands(atPosition:)
并不真正“填充”岛屿。它只创建一个一个单岛精灵并返回它。我建议你将它重命名为createIsland(at:)
。
是的,谢谢。你是对的,我只是做了一个快速的改变,把它张贴在这里,所以对我有点遗憾。现在我想着如何将实例方法附加到实例本身,因为它只是SKSpriteNode :) –
@ wm.p1us你是什么意思“攻击实例方法来实例本身”?你的意思是“附加”?实例方法本身附加到实例上,你不需要做任何事情。 – Sweeper
对。这里应该附上当然。 –