使用静态方法和属性创建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:)

+0

是的,谢谢。你是对的,我只是做了一个快速的改变,把它张贴在这里,所以对我有点遗憾。现在我想着如何将实例方法附加到实例本身,因为它只是SKSpriteNode :) –

+0

@ wm.p1us你是什么意思“攻击实例方法来实例本身”?你的意思是“附加”?实例方法本身附加到实例上,你不需要做任何事情。 – Sweeper

+0

对。这里应该附上当然。 –