iPhone紙吹雪

上からバサバサーっと紙吹雪を落とすiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController, SCNSceneRendererDelegate {

    weak var sceneView : SCNView?

    var start = false

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createCamera()

    }

    func setupScene() {

        let sv = SCNView(frame:view.bounds)

        sv.scene = SCNScene()

        sv.backgroundColor = UIColor(white: 0.2, alpha: 1)

        sv.delegate = self

        sv.autoenablesDefaultLighting = true

        self.view.addSubview(sv)

        self.sceneView = sv

    }

    

    func createCamera() {

        let camera = SCNNode()

        camera.camera = SCNCamera()

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

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

    }

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

        

        if !self.start { return }

        

        let papaer = SCNBox(width: 1, height: 1.618, length: 0.01, chamferRadius: 0)

        let hue = CGFloat(arc4random() % 20) / 20.0

        papaer.firstMaterial?.diffuse.contents = UIColor(hue: hue, saturation: 0.4, brightness: 1, alpha: 1)

        let paperNode = SCNNode(geometry: papaer)

        

        let x = 10Float(arc4random() % 20)

        let z = 5Float(arc4random() % 10)

        paperNode.position = SCNVector3(x: x, y: 20, z: z);

        paperNode.physicsBody = SCNPhysicsBody.dynamicBody()

        

        let w = Float(arc4random() % 100)

        paperNode.physicsBody?.applyTorque(SCNVector4Make(0.1, 1, 0, w), impulse: false)

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

        

        paperNode.runAction(SCNAction.waitForDuration(3.0), completionHandler: { () -> Void in

            paperNode.removeFromParentNode()

        })

    }

    

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

        self.start = true

        self.sceneView?.playing = true

    }

}