2014-10-03 138 views
1

我剛開始嘗試使用SceneKit。嘗試一個非常簡單的代碼來創建一個對象,分配物理給它一個點擊速度。到目前爲止,我能夠創建它,應用物理學。我能夠給它速度,但不能用水龍頭實現。我究竟做錯了什麼?我使用的是我在SpriteKit中使用的相同技術,但它在SceneKit中不起作用。請幫忙。SceneKit基礎知識

class GameViewController: UIViewController, SCNSceneRendererDelegate, SCNPhysicsContactDelegate { 
let scene = SCNScene() 

let shipNode = SCNNode() 

let sceneView = SCNScene() 

var cameraNode = SCNNode() 
var floor = SCNFloor() 
var floornod = SCNNode() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let sceneView = self.view as SCNView 
    sceneView.scene = scene 
    sceneView.backgroundColor = SKColor.blueColor() 
    sceneView.showsStatistics = true 


    sceneView.scene?.physicsWorld.gravity = SCNVector3Make(0, -70, 0) 
    sceneView.scene?.physicsWorld.speed = 1.0 
    sceneView.delegate = self 
    sceneView.jitteringEnabled = true 
    sceneSetup() 
    sceneView.pointOfView = cameraNode 


    let ship = SCNScene(named: "art.scnassets/sphere.dae")! 

    let shipNode = ship.rootNode.childNodeWithName("Sphere", recursively: true)! 

    shipNode.position = SCNVector3Make(0, 50, 300) 
    shipNode.scale = SCNVector3Make(10, 10, 10) 
    shipNode.geometry?.firstMaterial?.diffuse.contents = UIImage(named: "ball.jpg") 
    shipNode.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Dynamic, shape: nil) 
    shipNode.physicsBody?.restitution = 0.9 
    shipNode.physicsBody?.velocity = SCNVector3Make(0, 100, 10) 
    scene.rootNode.addChildNode(shipNode) 
    println(shipNode.physicsBody?.velocity.y) 
} 
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    shipNode.physicsBody?.velocity = SCNVector3Make(0, 200, 20) // code not working 
    println(shipNode.physicsBody?.velocity.y) // prints nil instead of 200.00 
} 

    func sceneSetup() { 

    cameraNode.camera = SCNCamera() 
    cameraNode.camera?.zNear = 0.01 
    cameraNode.camera?.zFar = 800 
    cameraNode.camera?.xFov = 45 
    cameraNode.camera?.yFov = 75 


    cameraNode.rotation = SCNVector4Make(1, 0, 0, -25 * 0.017453293) 
    cameraNode.position = SCNVector3Make(0, 150, 500) 
    scene.rootNode.addChildNode(cameraNode) 

    floornod.geometry = floor 
    floornod.geometry?.firstMaterial?.diffuse.contents = "wood1.png" 
    floornod.geometry?.firstMaterial?.locksAmbientWithDiffuse = true 
    floornod.geometry?.firstMaterial?.diffuse.wrapS = SCNWrapMode.Repeat 
    floornod.geometry?.firstMaterial?.diffuse.wrapT = SCNWrapMode.Repeat 
    floornod.geometry?.firstMaterial?.diffuse.mipFilter = SCNFilterMode.Linear 
    floornod.physicsBody = SCNPhysicsBody(type: SCNPhysicsBodyType.Static, shape: nil) 
    floornod.position = SCNVector3Make(0, 0, 0) 

    scene.rootNode.addChildNode(floornod) 

} 

} 

第一個println給出了100.00的結果。 touchesBegan中的println每次點擊都會產生零結果。

任何幫助,非常感謝。謝謝。

回答

2

您使用let shipNode = ...viewDidLoad方法中定義了一個新的局部變量。這個人得到一個物理機構並投入現場。

這與您定義爲類的一部分的實例變量shipNode是分開的。那個人從來沒有得到任何進一步的配置,所以當你在touchesBegan中訪問它時,它沒有物理主體,並且可選的鏈接導致查詢其速度的整個表達式返回nil。

大概你想擺脫在viewDidLoad中的let s,這樣你就可以配置你的實例變量而不是對它們進行遮蔽。

+0

哇。我不能相信我錯過了這一點。謝謝。有效! – Dman 2014-10-03 01:22:47