iPhone紙コップ飛ばし

紙コップを飛ばすiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit;

class ViewController: UIViewController {

    weak var sceneView : SCNView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createGround()

        createPaperRocket()

        createCamera()

    }

    func setupScene() {

        let sv = SCNView(frame: view.bounds)

        sv.scene = SCNScene()

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

        view.addSubview(sv)

        sceneView = sv

    }

    

    func createGround() {

        let ground = SCNBox(width: 20, height: 1, length: 10, chamferRadius: 0)

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

        let groundNode = SCNNode(geometry: ground)

        groundNode.physicsBody = SCNPhysicsBody.staticBody()

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

    }

    func createPaperRocket() {

        let cup = SCNNode()

        cup.name = “cup”

        cup.position = SCNVector3(x: –8, y: 1, z: 0)

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

        

        [Int](0100).each {j in

            let body = SCNTorus(ringRadius: 1 CGFloat(j) * 0.004, pipeRadius: 0.02)

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

            body.firstMaterial?.lightingModelName = SCNLightingModelLambert

            let bodyNode = SCNNode(geometry: body)

            bodyNode.position = SCNVector3(x: 0, y: Float(j) * 0.02, z: 0)

            cup.addChildNode(bodyNode)

        }

        

        cup.physicsBody = SCNPhysicsBody.dynamicBody()

    }

    

    func createCamera() {

        let camera = SCNNode()

        camera.camera = SCNCamera()

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

        camera.rotation = SCNVector4Make(1, 0, 0, –0.3)

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

    }

    

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

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

        cup?.physicsBody?.applyForce(SCNVector3(x: 6, y: 10, z: 0), atPosition: SCNVector3(x: –0.2, y: 0, z: 0), impulse: true)

    }

}

extension Array {

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

}