创建 \(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,其唯一目的就是成为这个工厂。
A class 不能有 superclass 或继承 Swift。这意味着可以创建完全隔离的 Class 文件,这些文件除了存储功能和属性以供项目内的通用访问外别无他用。
这在 OOP 编程中有点被认为是 "wrong",但是从概念和使用的角度来看,以及将事情整齐地完成并易于查找和阅读的紧迫性,它是无价的,在我天真的意见。
尽管 SKView 在 UIKit 世界中是一个令人生畏的高class,但可以简单地在静态 class 中为利用其功能的目的
最终的用法优雅而简单,感谢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)
我想制作一个 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,其唯一目的就是成为这个工厂。
A class 不能有 superclass 或继承 Swift。这意味着可以创建完全隔离的 Class 文件,这些文件除了存储功能和属性以供项目内的通用访问外别无他用。
这在 OOP 编程中有点被认为是 "wrong",但是从概念和使用的角度来看,以及将事情整齐地完成并易于查找和阅读的紧迫性,它是无价的,在我天真的意见。
尽管 SKView 在 UIKit 世界中是一个令人生畏的高class,但可以简单地在静态 class 中为利用其功能的目的
最终的用法优雅而简单,感谢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)