【问题标题】:SKSpriteNode creation with static methods and properties使用静态方法和属性创建 SKSpriteNode
【发布时间】:2017-04-19 06:29:19
【问题描述】:

大家好!

我正在使用 SpriteKit 框架编写游戏,并且我尝试使用多种配置制作对象,因此我必须使用静态来避免 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))

提前感谢您的建议!

【问题讨论】:

    标签: swift sprite-kit sprite


    【解决方案1】:

    我认为这完全没问题。

    静态成员与类型的实例无关,而是与类型本身相关时使用。由于您的方法只是创建并返回 SKSpriteNode,因此它不需要任何状态,因此可以独立于 Island 类型的实例。

    我还认为您应该重命名您的一些成员名称以符合 Swift 3 API 指南并使其目的更清晰。例如populateIslands(atPosition:) 并没有真正“填充”岛屿。它只是创建 一个 单岛精灵并返回它。我建议你把它重命名为createIsland(at:)

    【讨论】:

    • 好的,谢谢。你是对的,我刚刚做了快速更改以将其发布在这里,所以我有点想念。现在我正在考虑如何将实例方法附加到实例本身,因为它只是 SKSpriteNode :)
    • @wm.p1us “攻击实例方法到实例本身”是什么意思?您的意思是“附加”吗?实例方法自己附加到实例上,你不需要做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多