iPhone順番に点灯

球を順番に点灯させるiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController {

    weak var sceneView : SCNView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createCord()

        createCamera()

    }

    func setupScene() {

        let sv = SCNView(frame: view.bounds)

        sv.scene = SCNScene()

        sv.autoenablesDefaultLighting = true

        sv.allowsCameraControl = true

        sv.backgroundColor = UIColor.blackColor()

        view.addSubview(sv)

        sceneView = sv

    }

    

    func createCord() {

        let count = 35

        let angle = 2.0 * M_PI / Double(count)

        let r = 10.0

        [Int](0…count).each { i in

            let l = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.5)

            l.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 0.2, alpha: 1)

            let lnode = SCNNode(geometry: l)

            

            let x = r * cos(angle * Double(i))

            let z = r * sin(angle * Double(i))

            lnode.position = SCNVector3(x: Float(x), y: 20, z: Float(z))

            lnode.name = “light \(i)

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

            

            if i % 6 == 0 {

                // vertical

                let cnt = 4 + i / 6;

                [Int](0…cnt).each { j in

                    let vl = SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0.5)

                    vl.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 0.2, alpha: 1)

                    let vlnode = SCNNode(geometry: vl)

                    vlnode.name = “light \(i + j + 1)

                    vlnode.position = SCNVector3(x: Float(x), y: 18Float(j) * 3, z: Float(z))

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

                }

            }

        }

    }

    

    func createCamera() {

        let camera = SCNNode()

        camera.camera = SCNCamera()

        camera.position = SCNVector3(x: 0, y: 0, z: 60)

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

    }

    

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

        self.sceneView?.scene?.rootNode.childNodes

            .filter { ($0 as SCNNode).name?.rangeOfString(“light”) != nil }

            .map {light -> Void in

                if let num = light.name!.componentsSeparatedByString(” “)[1].toInt() {

                    light.runAction(SCNAction.sequence([

                        SCNAction.waitForDuration(NSTimeInterval(num) * 0.1),

                        SCNAction.runBlock { n -> Void in

                            let nn = SCNNode() // dummy for compile error

                            n.geometry?.firstMaterial?.diffuse.contents = UIColor(hue: 0.2, saturation: 0.5, brightness: 1, alpha: 1)

                        }

                        ]))

                }

            }

    }

    

}

extension Array {

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

}