2014-10-03 4 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. Печать в touchhesBegan дает результат nil каждый раз, когда я нажимаю.

Любая помощь очень ценится. Благодарю.

ответ

2

Вы определяете новую локальную переменную в своем методе viewDidLoad с помощью let shipNode = .... Этот человек получает физическое тело и попадает на сцену.

Это отдельно от переменной экземпляра shipNode, которую вы определили как часть класса. Это никогда не получает никакой дополнительной конфигурации, поэтому, когда вы обращаетесь к нему в touchesBegan, у него нет физического тела, а необязательная цепочка вызывает полное выражение для запроса его скорости, чтобы вернуть нуль.

Предположительно, вы хотите избавиться от let s в viewDidLoad, чтобы вы настраивали переменные экземпляра вместо их затенения.

+0

Ничего себе. Не могу поверить, что я пропустил это. Благодарю. Это сработало! – Dman

 Смежные вопросы

  • Нет связанных вопросов^_^