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

前端 未结 2 445
孤城傲影
孤城傲影 2020-12-20 05:02

I want to make an SKView I can use as a factory to make SKShapeNodes and \"render\" them to textures.

But I can\'t find how I would initialise such a thing, and am h

2条回答
  •  星月不相逢
    2020-12-20 05:43

    It's not quite clear what you mean by "how I would initialise such a thing". How is dependent upon technique and what the factory does overall. Some factories do not need external input for initialization while others do. Here is are a couple of really crude examples. These are perhaps overly simplistic and have not been tested at all.

    One uses the concept of a static class whilst the other is a singleton. None of this is to serve as "this is better than that". Nor is it to open Pandora's Box on which is better, etc. There are other threads which go over those details. Rather they are just a couple of approaches to get you going.

    Here is a static class version

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

    Here is a singleton version. Adding your circle code from above ...

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

    You'll also note the code is more or less the same. However in the case of the static, the class variables must be static as well.

    Usage would look something like:

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

提交回复
热议问题