首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scenekit类与xcode 6更新有关的问题

scenekit类与xcode 6更新有关的问题
EN

Stack Overflow用户
提问于 2014-10-15 01:17:09
回答 1查看 682关注 0票数 0

我知道这个问题在新的更新中可能有些常见,而且很可能也是一个简单的修复,但是我最近从xcode-6 beta升级到了完整的版本,而且我的许多子类都有错误。我使用的是一个预先编程的scenekit 3d旋转地球仪,它可以很好地使用beta版本.我现在的构建失败了,这给了我一个快速的编译错误:'SCNMaterial?‘没有一个名为“这里有许多子类”的成员

在这里非常迷茫,所以任何帮助或方向都会大大的appreciated...thank你!

我正在使用的https://github.com/schwa/iOS-8-SceneKit-Globe-Test源代码--另外,下面是我的文件中的代码(与上面的Github文件相同).

代码语言:javascript
复制
    //
    //  AppDelegate.swift
    //  SceneKitTest
    //
    //  Created by Jonathan Wight on 6/6/14.
    //  Copyright (c) 2014 schwa.io. All rights reserved.
    //

    import UIKit

    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {

        var window: UIWindow?


        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
            // Override point for customization after application launch.
            return true
        }

        func applicationWillResignActive(application: UIApplication) {
            // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
            // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
        }

        func applicationDidEnterBackground(application: UIApplication) {
            // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
            // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
        }

        func applicationWillEnterForeground(application: UIApplication) {
            // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
        }

        func applicationDidBecomeActive(application: UIApplication) {
            // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
        }

        func applicationWillTerminate(application: UIApplication) {
            // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        }


    }



    //
    //  GameViewController.swift
    //  SceneKitTest
    //
    //  Created by Jonathan Wight on 6/6/14.
    //  Copyright (c) 2014 schwa.io. All rights reserved.
    //

    import UIKit
    import QuartzCore
    import SceneKit

    class GameViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

            // create a new scene
            let scene = GlobeScene()

            // create and add a light to the scene
            let lightNode = SCNNode()
            lightNode.light = SCNLight()

//error occurs with lightNode class
            lightNode.light.type = SCNLightTypeOmni
            lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
            scene.rootNode.addChildNode(lightNode)

            // create and add an ambient light to the scene
    //        let ambientLightNode = SCNNode()
    //        ambientLightNode.light = SCNLight()
    //        ambientLightNode.light.type = SCNLightTypeAmbient
    //        ambientLightNode.light.color = UIColor.darkGrayColor()
    //        scene.rootNode.addChildNode(ambientLightNode)

            // retrieve the SCNView
            let scnView = self.view as SCNView

            // set the scene to the view
            scnView.scene = scene

            // allows the user to manipulate the camera
            scnView.allowsCameraControl = true

            // show statistics such as fps and timing information
            scnView.showsStatistics = true

            // configure the view
            scnView.backgroundColor = UIColor.blackColor()

            // add a tap gesture recognizer
            let tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
            let gestureRecognizers = NSMutableArray()
            gestureRecognizers.addObject(tapGesture)
            gestureRecognizers.addObjectsFromArray(scnView.gestureRecognizers!)
            scnView.gestureRecognizers = gestureRecognizers
        }

        func handleTap(gestureRecognize: UIGestureRecognizer) {
            // retrieve the SCNView
            let scnView = self.view as SCNView

            // check what nodes are tapped
            let p = gestureRecognize.locationInView(scnView)
            let hitResults = scnView.hitTest(p, options: nil)

            // check that we clicked on at least one object
//error occurs with if statement below
            if hitResults.count > 0 {
                // retrieved the first clicked object
                let result: AnyObject! = hitResults[0]

                // get its material
                let material = result.node!.geometry.firstMaterial

                // highlight it
                SCNTransaction.begin()
                SCNTransaction.setAnimationDuration(0.5)

                // on completion - unhighlight
                SCNTransaction.setCompletionBlock {
                    SCNTransaction.begin()
                    SCNTransaction.setAnimationDuration(0.5)

                    material.emission.contents = UIColor.blackColor()

                    SCNTransaction.commit()
                }

                material.emission.contents = UIColor.redColor()

                SCNTransaction.commit()
            }
        }

        override func shouldAutorotate() -> Bool {
            return true
        }

        override func supportedInterfaceOrientations() -> Int {
            if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
                return Int(UIInterfaceOrientationMask.AllButUpsideDown.toRaw())
            } else {
                return Int(UIInterfaceOrientationMask.All.toRaw())
            }
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Release any cached data, images, etc that aren't in use.
        }

    }



    //
    //  GlobeScene.swift
    //  SceneKitTest
    //
    //  Created by Jonathan Wight on 6/6/14.
    //  Copyright (c) 2014 schwa.io. All rights reserved.
    //

    import SceneKit
    import QuartzCore

    class GlobeScene: SCNScene {

        var camera: SCNCamera
        var cameraNode: SCNNode
        var ambientLightNode: SCNNode
        var globeNode: SCNNode

        override init() {

            self.camera = SCNCamera()
            self.camera.zNear = 0.01
            self.cameraNode = SCNNode()
            self.cameraNode.position = SCNVector3(x: 0.0, y: 0.0, z: 1.5)
            self.cameraNode.camera = self.camera

            self.camera.focalBlurRadius = 0;
    //        CABasicAnimation *theFocusAnimation = [CABasicAnimation animationWithKeyPath:"focalBlurRadius"];
    //        theFocusAnimation.fromValue = @(100);
    //        theFocusAnimation.toValue = @(0);
    //        theFocusAnimation.duration = 2.0;
    //        theFocusAnimation.removedOnCompletion = YES;
    //        [self.camera addAnimation:theFocusAnimation forKey:@"focus"];

            let theAmbientLight = SCNLight()
            theAmbientLight.type = SCNLightTypeAmbient
            theAmbientLight.color = UIColor(white: 0.5, alpha: 1.0)
            self.ambientLightNode = SCNNode()
            self.ambientLightNode.light = theAmbientLight

 //below theGlobeGeometry classes are where the errors occur  .diffuse, .ambient, etc.... 

            self.globeNode = SCNNode()
            let theGlobeGeometry = SCNSphere(radius: 0.5)
            theGlobeGeometry.firstMaterial.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
            theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
    //      theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient.jpg")
            theGlobeGeometry.firstMaterial.specular.contents = UIImage(named:"earth_specular.jpg")
            theGlobeGeometry.firstMaterial.emission.contents = nil
            theGlobeGeometry.firstMaterial.transparent.contents = nil
            theGlobeGeometry.firstMaterial.reflective.contents = nil
            theGlobeGeometry.firstMaterial.multiply.contents = nil
            theGlobeGeometry.firstMaterial.normal.contents = UIImage(named:"earth_normal.jpg")

            let theGlobeModelNode = SCNNode(geometry: theGlobeGeometry)
            self.globeNode.addChildNode(theGlobeModelNode)

            let theCloudGeometry = SCNSphere(radius:0.501)
            theCloudGeometry.firstMaterial.diffuse.contents = nil
            theCloudGeometry.firstMaterial.ambient.contents = nil
            theCloudGeometry.firstMaterial.specular.contents = nil
            theCloudGeometry.firstMaterial.emission.contents = nil
            theCloudGeometry.firstMaterial.transparent.contents = UIImage(named:"earth_clouds.png")
            theCloudGeometry.firstMaterial.reflective.contents = nil
            theCloudGeometry.firstMaterial.multiply.contents = nil
            theCloudGeometry.firstMaterial.normal.contents = nil

            let theCloudModelNode = SCNNode(geometry: theCloudGeometry)
            self.globeNode.addChildNode(theCloudModelNode)

            // animate the 3d object
            let animation: CABasicAnimation = CABasicAnimation(keyPath: "rotation")
            animation.toValue = NSValue(SCNVector4: SCNVector4(x: 1, y: 1, z: 0, w: Float(M_PI)*2))
            animation.duration = 5
            animation.repeatCount = MAXFLOAT //repeat forever
            globeNode.addAnimation(animation, forKey: nil)

            super.init()

            self.rootNode.addChildNode(self.cameraNode)
            self.rootNode.addChildNode(self.ambientLightNode)
            self.rootNode.addChildNode(self.globeNode)
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-15 08:06:41

您在GitHub上看到的示例是旧的,并且没有更新,因为框架已经开始适应Swift。您所看到的大多数错误都是因为情景Kit已经更新,以便在可能返回nil的情况下返回选项。

例如

代码语言:javascript
复制
lightNode.light.type = SCNLightTypeOmni

应改为

代码语言:javascript
复制
lightNode.light?.type = SCNLightTypeOmni

代码语言:javascript
复制
if let light = lightNode.light {
    light.type = SCNLightTypeOmni
}

还有其他非常类似的情况,API已经更新为返回选项,例如:

代码语言:javascript
复制
theGlobeGeometry.firstMaterial.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
theGlobeGeometry.firstMaterial.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
theGlobeGeometry.firstMaterial.specular.contents = UIImage(named:"earth_specular.jpg")
// etc...

应改为

代码语言:javascript
复制
theGlobeGeometry.firstMaterial?.diffuse.contents = UIImage(named:"earth_diffuse.jpg")
theGlobeGeometry.firstMaterial?.ambient.contents = UIImage(named:"earth_ambient2.jpeg")
theGlobeGeometry.firstMaterial?.specular.contents = UIImage(named:"earth_specular.jpg")
// etc...

请注意,在?之后添加了firstMaterial,因为它不能保证一个几何对象有一个材料。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26372950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档