2017-04-19 57 views
1

嗨,夥計們!使用靜態方法和屬性創建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)) 

謝謝你的建議,提前!

回答

1

我認爲這完全沒問題。

使用靜態成員時,它們與類型的實例無關,但與類型本身相關。由於您的方法只是創建並返回SKSpriteNode,因此它不需要任何狀態,因此可以獨立於Island類型的實例。

我也認爲你應該重新命名一些你的成員名稱來符合Swift 3 API指南,並且使其目的更加清晰。例如populateIslands(atPosition:)並不真正「填充」島嶼。它只創建一個一個單島精靈並返回它。我建議你將它重命名爲createIsland(at:)

+0

是的,謝謝。你是對的,我只是做了一個快速的改變,把它張貼在這裏,所以對我有點遺憾。現在我想着如何將實例方法附加到實例本身,因爲它只是SKSpriteNode :) –

+0

@ wm.p1us你是什麼意思「攻擊實例方法來實例本身」?你的意思是「附加」?實例方法本身附加到實例上,你不需要做任何事情。 – Sweeper

+0

對。這裏應該附上當然。 –