嘿,我正试图像鳕鱼一样为我的游戏制作场景
class GameSCNScene:SCNScene{
let scnView: SCNView!
let _size:CGSize!
var scene:SCNScene!
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
init(currentview view: SCNView) {
super.init()
scnView = view
_size = scnView.bounds.size
// retrieve the SCNView
scene = SCNScene()
scnView.scene = scene
scnView.allowsCameraControl = true
scnView.showsStatistics = true
scnView.backgroundColor = UIColor.blackColor()
}
} 但是编译器给出了这个错误" Getter for' scene'使用Objective-C选择器'场景'与初始化程序冲突&#init;('来自超级' SCNScene'使用相同的Objective-C选择器"我不明白如何删除此错误...请帮助我,我是swift的新手
答案 0 :(得分:0)
错误消息告诉您已经在超类上定义了名为scene
的方法,并且您的新定义与之冲突。这是一个使用Objective-C签名[SCNScene scene]
的类方法,它以init()
的形式出现在Swift中。超类的scene
方法与您的var scene:SCNScene!
冲突。这就是你问的问题的答案。
...然而
在scene
上拥有scene
是没有意义的。这就是你所定义的。
在SCNScene上定义一个view
属性是非常值得怀疑的。场景可以同时显示在多个视图中。它可以在没有视图的情况下呈现。
SCNScene并不意味着是子类。这里有一个讨论:Trouble subclassing SCNScene。苹果SceneKit工程师在这里作为推荐反对它。 (我在周末通过尝试子类化SCNNode将自己描绘成一个角落;也不要将其子类化!)
最常见的做法似乎是将您向我们展示的初始化代码移动到视图控制器。这对于初学者来说是一种相当简单,合理的方法。但是,这种架构使得非常复杂,臃肿的视图控制器。最好的方法是将游戏逻辑放在自己的游戏控制器类中。
将SCNScene视为数据。您的游戏控制器包含逻辑。当你准备为游戏添加第二级时,你会编写第二个SCNScene,并使用相同的游戏控制器加载它。当您准备将游戏从iOS移动到OS X或tvOS时,您将处理编写新的视图控制器,但可以重用您的场景和游戏控制器。
由于你是Swift的新手,你的第一站应该是Daniel Steinberg的书“A Swift Kickstart”,可以在iBooks上找到。