iPhone床穴

床の穴をくぐってどんどんしたに進んでいくiPhoneアプリのサンプルコード







import UIKit

import SceneKit

class ViewController: UIViewController, SCNSceneRendererDelegate {

    weak var scene : SCNScene?

    weak var marker : UIView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.setupScene()

        self.view.backgroundColor = UIColor(hue: 0.8, saturation: 0.8, brightness: 0.7, alpha: 1)

        self.createCamera()

        self.createPlate()

        self.createBall()

        self.createMarker()

    }

    

    func setupScene() {

        let w = CGRectGetMaxX(self.view.bounds)

        let sv = SCNView(frame: CGRect(x: 0, y: 0, width: w, height: w))

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

        sv.scene = SCNScene()

        sv.delegate = self

        self.view.addSubview(sv)

        self.scene = sv.scene

    }

    

    func createCamera() {

        let camera = SCNNode()

        camera.name = “camera”

        camera.camera = SCNCamera()

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

        self.scene?.rootNode.addChildNode(camera)

    }

    func createPlate() {

        for i in 03 {

            let plate = SCNNode()

            let holeRow = arc4random() % 2

            let holeCol = arc4random() % 2

            let hole = 5 * (holeRow + 1) + (holeCol + 1)

            for j in 0..<25 {

                

                if j == Int(hole) {

                    continue

                }

                let x = Float(j % 5) * 5.010.0

                let z = Float(j / 5) * 5.010.0

                let box = SCNBox(width: 5, height: 1, length: 5, chamferRadius: 0)

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

                let boxNode = SCNNode(geometry: box)

                boxNode.position = SCNVector3(x: x, y: Float(i) * 10, z: z)

                boxNode.physicsBody = SCNPhysicsBody.staticBody()

                

                self.scene?.rootNode.addChildNode(boxNode)

            }

        }

    }

    

    func createBall() {

        let ball = SCNSphere(radius: 1)

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

        let ballNode = SCNNode(geometry: ball)

        ballNode.name = “ball”

        ballNode.physicsBody = SCNPhysicsBody.dynamicBody()

        ballNode.physicsBody?.physicsShape = SCNPhysicsShape(geometry: ball, options: nil)

        ballNode.physicsBody?.allowsResting = false

        ballNode.position = SCNVector3(x: 0, y: 50, z: 0)

        self.scene?.rootNode.addChildNode(ballNode)

        

    }

    

    func createMarker() {

        let marker = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))

        marker.layer.cornerRadius = 4

        marker.transform = CGAffineTransformMakeRotation(CGFloat(M_PI)/4.0)

        marker.center = CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds) * 1.5)

        marker.backgroundColor = UIColor.blackColor()

        self.view.addSubview(marker)

        

        self.marker = marker

    }

    

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

        var p = touches.anyObject()!.locationInView(self.view)

        self.marker?.center = p

        

        p = CGPoint(x: p.x CGRectGetMidX(self.view.bounds), y: p.y CGRectGetMaxY(self.view.bounds) * 3.0 / 4.0)

        self.scene?.physicsWorld.gravity = SCNVector3(x: Float(p.x)/40, y: –9, z: Float(p.y)/40)

    }

    

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

        if let ball = self.scene?.rootNode.childNodeWithName(“ball”, recursively: false) {

            if let camera = self.scene?.rootNode.childNodeWithName(“camera”, recursively: false) {

                let y = ball.presentationNode().position.y + 10

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

            }

        }

    }

}