iPhoneボールシャワー

上からボールをシャワーのようにふらせるiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController, SCNSceneRendererDelegate {

    

    

    var scene : SCNScene = SCNScene()

    var sceneView : SCNView?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        sceneView = SCNView(frame: self.view.bounds)

        sceneView?.delegate = self

        sceneView?.scene = scene

        sceneView?.backgroundColor = UIColor.orangeColor()

        self.view.addSubview(sceneView!)

        

        self.createBall()

        

        var base = SCNBox(width: 20, height: 5, length: 20, chamferRadius: 0)

        var baseNode = SCNNode(geometry: base)

        baseNode.position = SCNVector3(x: 0, y: 20, z: 0)

        baseNode.physicsBody = SCNPhysicsBody.staticBody()

        scene.rootNode.addChildNode(baseNode)

        

        

        var camera = SCNCamera()

        camera.xFov = 40

        camera.yFov = 40

        var cameraNode = SCNNode();

        cameraNode.camera = camera;

        cameraNode.position = SCNVector3Make(0, 20, 100);

        scene.rootNode.addChildNode(cameraNode);

        scene.physicsWorld.speed = 5.0

    }

    

    var count : Int = 0

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

        ++count

        if count > 5 {

            count = 0

            self.createBall()

        }

        

        for n in scene.rootNode.childNodes as [SCNNode] {

            let h = Float(CGRectGetMidY(self.view.frame))

            if n.name == “ball” && n.presentationNode().position.y < -h {

                n.removeFromParentNode()

            }

        }

    }

    var ballX : Float = 0.0

    func createBall() {

        var ball = SCNNode();

        ball.name = “ball”

        var sphere = SCNSphere(radius: 4)

        

        var z = Float(arc4random() % 15) * 4.0

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

        ball.geometry = sphere;

        ball.geometry?.firstMaterial?.diffuse.wrapS = .Repeat

        ball.geometry?.firstMaterial?.diffuse.contents = “ballimage.jpg”;

        ball.geometry?.firstMaterial?.fresnelExponent = 1.0

        ball.physicsBody = SCNPhysicsBody.dynamicBody()

        scene.rootNode.addChildNode(ball)

        

        ballX = ((ballX + 17.0) % 30.0)

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

}