iPhone木登り

木を登ってくるくる降りてくるiPhoneアプリのサンプルコード

import UIKit

import SceneKit;

class ViewController: UIViewController, SCNSceneRendererDelegate {

    

    weak var sceneView : SCNView?

    var up = false

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createTree()

        createMonkey()

    }

    func setupScene() {

        let sv = SCNView(frame: view.bounds)

        sv.delegate = self

        sv.scene = SCNScene()

        sv.backgroundColor = UIColor(hue: 0.2, saturation: 0.3, brightness: 1, alpha: 1)

        view.addSubview(sv)

        sceneView = sv

    }

    

    func createTree() {

        let ground = SCNCylinder(radius: 5, height: 0.2)

        ground.firstMaterial?.diffuse.contents = UIColor.brownColor()

        let groundNode = SCNNode(geometry: ground)

        groundNode.position = SCNVector3(x: 0, y: –10, z: 0)

        sceneView?.scene?.rootNode.addChildNode(groundNode)

        groundNode.physicsBody = SCNPhysicsBody.staticBody()

        

        let trunk = SCNCylinder(radius: 0.5, height: 20)

        trunk.firstMaterial?.diffuse.contents = UIColor.brownColor()

        let trunkNode = SCNNode(geometry: trunk)

        sceneView?.scene?.rootNode.addChildNode(trunkNode)

        

        let green = SCNSphere(radius: 5)

        green.firstMaterial?.diffuse.contents = UIColor.greenColor()

        let greenNode = SCNNode(geometry: green)

        greenNode.position = SCNVector3(x: 0, y: 10, z: 0)

        greenNode.transform = SCNMatrix4Scale(greenNode.transform, 1, 0.8, 1)

        self.sceneView?.scene?.rootNode.addChildNode(greenNode)

    }

    

    func createMonkey() {

        let monkey = SCNNode()

        monkey.name = “monkey”

        sceneView?.scene?.rootNode.addChildNode(monkey)

        

        let color = UIColor(hue: 0.1, saturation: 0.4, brightness: 0.7, alpha: 1)

        

        let head = SCNSphere(radius: 1)

        head.firstMaterial?.diffuse.contents = color

        let headNode = SCNNode(geometry: head)

        headNode.position = SCNVector3(x: 0, y: 2, z: 0)

        monkey.addChildNode(headNode)

        

        let body = SCNCylinder(radius: 0.8, height: 2)

        body.firstMaterial?.diffuse.contents = color

        let bodyNode = SCNNode(geometry: body)

        monkey.addChildNode(bodyNode)

        

        [Int](01).each {i in

            let bar = SCNBox(width: 2, height: 0.3, length: 0.3, chamferRadius: 0.05)

            bar.firstMaterial?.diffuse.contents = color

            let barNode = SCNNode(geometry: bar)

            barNode.position = SCNVector3(x: 1, y: 12 * Float(i), z: 0)

            monkey.addChildNode(barNode)

        }

        monkey.physicsBody = SCNPhysicsBody.dynamicBody()

        monkey.physicsBody?.velocityFactor = SCNVector3(x: 0, y: 1, z: 0)

        monkey.physicsBody?.angularVelocityFactor = SCNVector3(x: 0, y: 1, z: 0)

        

        monkey.pivot = SCNMatrix4MakeTranslation(2, 0, 0)

        monkey.position = SCNVector3Make(2, 0, 0)

    }

    

    func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {

        if up {

            let monkey = sceneView?.scene?.rootNode.childNodeWithName(“monkey”, recursively: false)

            monkey?.physicsBody?.applyForce(SCNVector3(x: 0, y: 20, z: 0), impulse: false)

        }

    }

    

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

        up = true

    }

    

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {

        up = false

        let monkey = sceneView?.scene?.rootNode.childNodeWithName(“monkey”, recursively: false)

        monkey?.physicsBody?.applyTorque(SCNVector4Make(0, 1, 0, 5), impulse: true)

    }

}

extension Array {

    func each(doit:T -> Void) { for i in self { doit(i) } }

}