创建 \(Use) SKView 作为 \(in a) factory \(static class)

Create \(Use) SKView as \(in a) factory \(static class)

我想制作一个 SKView,我可以将其用作制作 SKShapeNodes 的工厂,然后 "render" 将它们制作成纹理。

但我找不到如何初始化这样的东西,而且我一点运气也没有。

如何为此目的制作一个独立的 SKView?

或者是否有更好的方法来避免使用游戏场景?

这是我创建工厂的徒劳努力,这抱怨纹理(来自:)不明确。我不知道那是什么意思。

import SpriteKit

class Make: SKView{

static func circle() -> SKSpriteNode {
    let myShapeNode = SKShapeNode(circleOfRadius: 100)
    myShapeNode.fillColor = SKColor.lightGray
    myShapeNode.strokeColor = SKColor.gray
    let tex = texture(from: myShapeNode)
    return SKSpriteNode(texture: tex)
    }

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
    }   
}

更新

在 google 上浪费了更多时间后,我尝试搜索 UIView 的初始化,找到并添加了这段代码,它初始化了一个看似虚构的框架......但它有效!我不知道为什么...但是我不能将它用作工厂方法,只能用作实例方法,这样:

import Foundation
import SpriteKit

class Make: SKView{

    // added randomly found UIView initialisation "code"...
    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    func circle() -> SKSpriteNode {
        let myShapeNode = SKShapeNode(circleOfRadius: 100)
        myShapeNode.fillColor = SKColor.lightGray
        myShapeNode.strokeColor = SKColor.gray
        let tex = texture(from: myShapeNode)
        return SKSpriteNode(texture: tex)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

"how I would initialise such a thing" 不是很清楚你的意思。如何取决于技术和工厂的整体工作。一些工厂不需要外部输入来进行初始化,而另一些则需要。这里有几个非常粗略的例子。这些可能过于简单,根本没有经过测试。

一个使用静态的概念class,而另一个是单例。其中None作为"this is better than that"。也不是打开潘多拉魔盒哪个更好等等。还有其他讨论这些细节的话题。相反,它们只是让您前进的几种方法。

这里是静态class版本

// static class version
class SpriteFactory1 {
    private static let view:SKView = SKView()

    static func spriteFromShape(shape:SKShapeNode) -> SKSpriteNode? {
        guard let tex = view.texture(from:shape) else {
            return nil
        }

        return SKSpriteNode(texture:tex)
    }
}

这里是单例版本。从上面添加您的圈子代码...

// singleton version
class SpriteFactory2 {
    static let sharedInstance = SpriteFactory2()

    private let view:SKView = SKView()

    func spriteFromShape(shape:SKShapeNode) -> SKSpriteNode? {
        guard let tex = view.texture(from:shape) else {
            return nil
        }

        return SKSpriteNode(texture:tex)
    }

    func circle() -> SKSpriteNode {
        let myShapeNode = SKShapeNode(circleOfRadius: 100)
        myShapeNode.fillColor = SKColor.lightGray
        myShapeNode.strokeColor = SKColor.gray
        let tex = texture(from: myShapeNode)
        return SKSpriteNode(texture: tex)
    }
}

您还会注意到代码大致相同。但是在静态的情况下,class 变量也必须是静态的。

用法类似于:

// Test shape
let shape = SKShapeNode()
// Pretend shape is constructed as desired

let sprite1 = SpriteFactory1.spriteFromShape(shape: shape)    
let sprite2 = SpriteFactory2.sharedInstance.spriteFromShape(shape: shape)
let circle = SpriteFactory2.sharedInstance.circle()

(代表OP发帖).

问题已解决!

对于那些比我更了解编码的人,以下评论不适合您。它适用于像我这样的所有傻瓜和有抱负的工具。

感谢奇妙的耐心和我的知识 @MobileBen,我能够完全按照需要做,即有一个工厂可以从项目的任何地方创建 SKShapeNodes,通过一个 SKView 实例没有类型的静态 Class,其唯一目的就是成为这个工厂。

  1. A class 不能有 superclass 或继承 Swift。这意味着可以创建完全隔离的 Class 文件,这些文件除了存储功能和属性以供项目内的通用访问外别无他用。

  2. 这在 OOP 编程中有点被认为是 "wrong",但是从概念和使用的角度来看,以及将事情整齐地完成并易于查找和阅读的紧迫性,它是无价的,在我天真的意见。

  3. 尽管 SKView 在 UIKit 世界中是一个令人生畏的高class,但可以简单地在静态 class 中为利用其功能的目的

  4. 最终的用法优雅而简单,感谢MobileBen,像这样:

一个工厂,完全错误地使用大写命名,所以我在代码中立即看到它:

import SpriteKit

class MAKE {

private static let view:SKView = SKView()

static func circle(radius: CGFloat) -> SKSpriteNode {
    let myShapeNode = SKShapeNode(circleOfRadius: radius)
    myShapeNode.fillColor = SKColor.lightGray
    myShapeNode.strokeColor = SKColor.gray
    let tex = view.texture(from: myShapeNode)
    return SKSpriteNode(texture: tex)
    }
}

项目中有了这个,从项目的几乎任何其他部分,以下创建一个圆并将其存储在 myCircle 中:

let myCircle = MAKE.circle(radius: 50)