iPhoneボールルーム

ボールを八方向にコロコロうごかすiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController {

    weak var scene : SCNScene?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.view.backgroundColor = UIColor(hue: 0.4, saturation: 0.5, brightness: 1, alpha: 1)

        self.setupScene()

        self.createCamera()

        self.createBox()

        self.createBall()

        self.createButton()

    }

    

    func setupScene() {

        var w = CGRectGetMaxX(self.view.bounds)

        var sceneView = SCNView(frame: CGRectMake(0, 0, w, w))

        sceneView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))

        sceneView.scene = SCNScene()

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

        self.view.addSubview(sceneView)

        

        self.scene = sceneView.scene

    }

    

    func createCamera() {

        var camera = SCNNode()

        camera.camera = SCNCamera()

        camera.camera?.zFar = 200

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

        

        self.scene?.rootNode.addChildNode(camera)

    }

    

    func createBox() {

        var box = SCNBox(width: 100, height: 2, length: 100, chamferRadius: false)

        box.firstMaterial?.diffuse.contents = UIColor.lightGrayColor()

        var boxNode = SCNNode(geometry: box)

        self.scene?.rootNode.addChildNode(boxNode)

        

        boxNode.physicsBody = SCNPhysicsBody.staticBody()

        

        for i in 03 {

            var wall = SCNBox(width: 100, height: 15, length: 1, chamferRadius: false)

            wall.firstMaterial?.diffuse.contents = UIColor.lightGrayColor().colorWithAlphaComponent(0.3)

            var wallNode = SCNNode(geometry: wall)

            

            wallNode.transform = SCNMatrix4Translate(wallNode.transform, 0, 5, 50)

            wallNode.transform = SCNMatrix4Rotate(wallNode.transform, Float(M_PI) / 2.0 * Float(i), 0, 1, 0)

            self.scene?.rootNode.addChildNode(wallNode)

            

            wallNode.physicsBody = SCNPhysicsBody.staticBody()

        }

    }

    

    func createBall () {

        var ball = SCNSphere(radius: 4)

        ball.firstMaterial?.diffuse.contents = { () -> CALayer in

            var layer = CALayer()

            layer.backgroundColor = UIColor.greenColor().CGColor

            layer.frame = CGRectMake(0, 0, 100, 100)

            for i in 04 {

                var black = CALayer()

                black.frame = CGRectMake(CGFloat(i) * 20, 0, 10, 100)

                black.backgroundColor = UIColor.blackColor().CGColor

                layer.addSublayer(black)

            }

            return layer

        }()

        

        var ballNode = SCNNode(geometry: ball)

        ballNode.name = “ball”

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

        self.scene?.rootNode.addChildNode(ballNode)

        

        ballNode.physicsBody = SCNPhysicsBody.dynamicBody()

        ballNode.physicsBody?.applyForce(SCNVector3(x: 10, y: 0, z: 10), impulse: true)

    }

    func createButton() {

        var o = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMaxY(self.view.bounds) 90)

        for i in 08 {

            var btn = UIButton(frame: CGRectMake(0, 0, 20, 20))

            btn .setTitle(\(i), forState: .Normal)

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

            btn.setTitleColor(UIColor.clearColor(), forState: .Normal)

            var x = 40.0 * cos(Double(M_PI/4.0) * Double(i))

            var y = 40.0 * sin(Double(M_PI/4.0) * Double(i))

            btn.center = CGPointMake(CGFloat(x) + o.x, CGFloat(y) + o.y)

            self.view.addSubview(btn)

            

            btn.addTarget(self, action:“tapButton:”, forControlEvents: .TouchUpInside)

        }

    }

    func tapButton(sender : UIButton) {

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

        if let number : NSString = sender.titleLabel?.text? {

            let vx = 10.0 * cos(Float(M_PI/4.0) * number.floatValue)

            let vz = 10.0 * sin(Float(M_PI/4.0) * number.floatValue)

            ball?.physicsBody?.applyForce(SCNVector3(x: vx, y: 5, z: vz), impulse: true)

        }

    }

    

}