iPhoneパラパラ数字

数字が書いてある紙をパラパラやって狙った数字で止めるiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController, SCNSceneRendererDelegate {

    weak var sceneView : SCNView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createNumberPages()

        createCamera()

    }

    func setupScene() {

        let sv = SCNView(frame: view.bounds)

        sv.scene = SCNScene()

        sv.backgroundColor = UIColor(hue: 0.5, saturation: 0.1, brightness: 1, alpha: 1)

        sv.playing = false

        sv.delegate = self

        view.addSubview(sv)

        

        sceneView = sv

    }

    

    func createNumberPages() {

        [Int](020).each { i in

            let l = CATextLayer();

            l.string = \(i+1)

            l.alignmentMode = kCAAlignmentCenter;

            l.foregroundColor = UIColor.blackColor().CGColor;

            l.fontSize = 160;

            l.frame = CGRectMake(0, 0, 400, 200);

            l.backgroundColor = UIColor(hue: 0.5, saturation: 0.2, brightness: 0.9, alpha: 1).CGColor

            let page = SCNBox(width: 10, height: 5, length: 0.001, chamferRadius: 1)

            page.firstMaterial?.diffuse.contents = l

            let m = SCNMaterial()

            m.diffuse.contents = l.backgroundColor

            page.materials = [page.firstMaterial!, m, m, m, m, m]

            let pageNode = SCNNode(geometry: page)

            pageNode.name = “page \(i)

            pageNode.position = SCNVector3Make(0, 0, –0.01 * Float(i))

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

        }

    }

    

    func createCamera() {

        let camera = SCNNode()

        camera.camera = SCNCamera()

        camera.position = SCNVector3Make(0, 0, 20)

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

    }

    

    var count = 0

    func flip() {

        if let page = sceneView?.scene?.rootNode.childNodeWithName(“page \(count), recursively: false) {

            

            page.physicsBody = SCNPhysicsBody.dynamicBody()

            page.physicsBody?.collisionBitMask = 0x0

            page.physicsBody?.angularDamping = 0.99

            page.physicsBody?.restitution = 0

            let joint = SCNPhysicsHingeJoint(body: page.physicsBody!, axis: SCNVector3Make(1, 0, 0), anchor: SCNVector3Make(0, –2.5, 0))

            sceneView?.scene?.physicsWorld.addBehavior(joint)

            page.physicsBody?.applyTorque(SCNVector4Make(1, 0, 0, 150.4), impulse: true)

        }

        count++;

    }

    

    var lasttime : NSTimeInterval = 0

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

        if (state > 0) {

            if lasttime == 0 || (time – lasttime) > 0.1 {

                flip()

                lasttime = time

            }

        }

    }

    

    var state = 0

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

        if state == 0 {

            self.sceneView?.playing = true

            state++;

            return;

        }

        

        self.sceneView?.scene?.physicsWorld.speed = 0

        

        func delay(delay:Double, doit:() -> Void) {

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), doit)

        }

        delay(2) {

            self.sceneView?.scene?.physicsWorld.speed = 0

            self.lasttime = 0

            self.state = 0

            self.count = 0

            self.sceneView?.scene?.rootNode.childNodes.each { i in

                i.removeFromParentNode()

            }

            self.createNumberPages()

            self.sceneView?.scene?.physicsWorld.speed = 1

        }

    }

}

extension Array {

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

}