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

时间:2016-10-17 11:02:04

标签: sprite-kit skshapenode sktexture skview

我想制作一个SKView,我可以用它来制作SKShapeNodes和#34;渲染"它们是纹理。

但我无法找到如何初始化这样的事情,而且根本没有运气。

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

还是有更好的方法可以避免使用gamescene?

这是我在制作工厂时所做的努力,这抱怨纹理(来自:)模糊不清。我不知道这意味着什么。

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

2 个答案:

答案 0 :(得分:1)

“我如何初始化这样的事情”并不十分清楚你的意思。如何依赖于技术以及工厂的整体运作方式。有些工厂不需要外部输入进行初始化,而其他工厂则需要。这是一些非常粗略的例子。这些可能过于简单化,根本没有经过测试。

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

这是一个静态类版本

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

答案 1 :(得分:1)

(代表OP发布)

问题解决了!

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

感谢@MobileBen的精湛耐心和知识,我能够完全按照自己的需要做,即通过静态类中的SKView实例,从项目的任何位置创建SKShapeNodes工厂没有类型,其唯一目的是成为这家工厂。

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

  2. 在OOP编程中,这有点被认为是“错误的”,但是从概念和使用角度来看,以及简单易用地查找和阅读内容的紧迫性,这在我看来是非常宝贵的。

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

  4. 由于MobileBen,所得到的用法优雅而简单,如下所示:

  5. 工厂,完全不正确地使用大写字母命名,所以我可以立即在代码中看到它:

    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)