创建(使用)SKView作为(在)工厂(静态类)



我想做一个SKView,我可以使用作为一个工厂,使SKShapeNodes和"渲染"他们的纹理。

但是我不知道如何初始化这样的东西,而且我一点也不幸运。

我如何为此目的制作一个独立的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")
    }   
}

更新

在谷歌上更徒劳的时间后,我尝试搜索一个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")
    }
}

我不太清楚你所说的"我将如何初始化这样一个东西"是什么意思。怎么做取决于技术和工厂的整体工作。有些工厂不需要外部输入进行初始化,而其他工厂则需要。这里有几个非常粗糙的例子。这些可能过于简单,根本没有经过测试。

一个使用静态类的概念,而另一个是单例。这些都不是"这个比那个好"。也不是打开潘多拉的盒子,看哪个更好,等等。还有其他的线程会讨论这些细节。相反,它们只是让你前进的几种方法。

这是一个静态类版本

// 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)
    }
}

您还会注意到代码或多或少是相同的。但是在静态的情况下,类变量也必须是静态的。

的用法如下:

// 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实例在一个静态类的没有类型,其唯一的目的是这个工厂。

  1. 在Swift中,一个类不能有超类或继承。这意味着可以创建完全隔离的类文件,除了存储项目中通用访问的功能和属性之外没有其他目的。

  2. 这在OOP编程中被认为是"错误的",但从概念和使用的角度来看,以及将事情整齐地完成并易于查找和阅读的紧迫性,在我看来,这是非常宝贵的。

  3. 尽管SKView在UIKit世界中是一个令人害怕的高级类,但为了利用其功能,可以在静态类中简单地创建一个未使用和未识别的SKView实例

  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)

最新更新