2016-02-24 32 views
1

嘿即时试图让我的游戏场景,如鳕鱼错误在建立游戏的场景scenekit

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

} 

} 但是编译器给这个错误“消气的‘场景’用Objective-C的选择器'场景'与来自超类'SCNScene'的初始化器'init()'有着相同的Objective-C选择器“我不明白如何去除这个错误...请帮助我即将新到

+0

很好的解释谢谢.... – Flying

回答

0

错误消息告诉你,在超类上已经定义了一个名为scene的方法,并且你的新定义与它冲突。这是一个类方法,带有Objective-C签名[SCNScene scene],它以Swift的形式出现在init()之内。超类的scene方法与您的var scene:SCNScene!冲突。这就是你问的问题的答案。

但是......

这是没有意义的有一个scene一个scene。这就是你所定义的。

在SCNScene上定义一个view属性是非常有问题的做法。场景可以同时显示在多个视图中。它可以在没有视图的情况下渲染。

SCNScene不打算分类。这里有一个讨论:Trouble subclassing SCNScene。苹果的SceneKit工程师在这里被记录为推荐它。 (我试图将子类SCNNode划分为一个角落;不要将子类划分为SCNNode)

最常见的做法似乎是将您向我们展示的初始化代码移动到您的视图控制器。对于初学者来说,这是一个相当简单,合理的方法。不过,这种架构会造成非常复杂的,臃肿的视图控制器。最好的方法是将您的游戏逻辑放在自己的游戏控制器类中。

将SCNScene视为数据。你的游戏控制器包含逻辑。当你准备为你的游戏添加第二个关卡时,你使用相同的游戏控制器编写第二个SCNScene并加载它。当你准备将你的游戏从iOS移到OS X或tvOS时,你会处理编写一个新的视图控制器,但可以重用你的场景和你的游戏控制器。

既然您是Swift的新手,那么您的第一站应该是Daniel Steinberg的书籍“Swift Kickstart”,可在iBooks上找到。