iPhone的あて

的を倒してABCをゲットするiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SceneKit

class ViewController: UIViewController {

    weak var sceneView : SCNView?

    weak var slider : UISlider?

    

    override func viewDidLoad() {

        super.viewDidLoad()

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

        self.setupScene()

        self.createPaper()

        self.createShooter()

        self.createCamera()

        self.createSlider()

        self.createLight()

    }

    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.7, saturation: 0.1, brightness: 1, alpha: 1)

        sv.scene = SCNScene()

        self.view.addSubview(sv)

        

        self.sceneView = sv

    }

    func createPaper() {

        let board = SCNBox(width: 40, height: 0.5, length: 20, chamferRadius: 0)

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

        let boardNode = SCNNode(geometry: board)

        boardNode.physicsBody = SCNPhysicsBody.staticBody()

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

        

        for i in 0..<3 {

            let paper = SCNBox(width: 8, height: 8, length: 1, chamferRadius: 0)

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

            let paperNode = SCNNode(geometry: paper)

            paperNode.position = SCNVector3(x: –12 + 12 * Float(i), y: 5, z: 4.5)

            paperNode.physicsBody = SCNPhysicsBody.dynamicBody()

            paperNode.physicsBody?.angularVelocityFactor = SCNVector3(x: 1, y: 0, z: 0)

            paperNode.physicsBody?.velocityFactor = SCNVector3(x: 0, y: 1, z: 0)

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

            

            let word = SCNText(string: [“A”,”B”,“C”][i], extrusionDepth: 1)

            word.font = UIFont.systemFontOfSize(6)

            word.firstMaterial?.diffuse.contents = UIColor(hue: 0.5 + CGFloat(i) * 0.1, saturation: 0.9, brightness: 1, alpha: 1)

            let wordNode = SCNNode(geometry: word)

            wordNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: Float(M_PI)/2.0)

            wordNode.position = SCNVector3(x: –2, y: –3, z: 2)

            paperNode.addChildNode(wordNode)

        }

    }

    

    func createShooter() {

        let shooter = SCNCylinder(radius: 0.2, height: 2)

        shooter.firstMaterial?.diffuse.contents = UIColor(hue: 0.25, saturation: 0.6, brightness: 1, alpha: 1)

        let shooterNode = SCNNode(geometry: shooter)

        shooterNode.name = “shooter”

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

        self.shooterRotate(0)

    }

    

    func shooterRotate(angle :Float) {

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

            shooterNode.transform = SCNMatrix4Identity

            shooterNode.pivot = SCNMatrix4MakeTranslation(0, –0.5, 0)

            shooterNode.transform = SCNMatrix4Rotate(shooterNode.transform, –0.8, 1, 0, 0)

            shooterNode.transform = SCNMatrix4Rotate(shooterNode.transform, angle, 0, 1, 0)

            shooterNode.transform = SCNMatrix4Translate(shooterNode.transform, 0, 0, 40)

        }

    }

    func createCamera() {

        let camera = SCNNode()

        camera.camera = SCNCamera()

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

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

    }

    

    func createLight() {

        let light = SCNLight()

        light.type = SCNLightTypeOmni

        let lightNode = SCNNode()

        lightNode.light = light

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

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

    }

    

    func createSlider() {

        let s = UISlider()

        s.center = CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds) + 50)

        s.minimumValue = –Float(M_PI)/2.0;

        s.maximumValue = Float(M_PI)/2.0;

        self.view.addSubview(s)

        s.addTarget(self, action: Selector(“slide:”), forControlEvents: .ValueChanged)

        

        self.slider = s

    }

    

    func slide(slider : UISlider) {

        self.shooterRotate(slider.value)

    }

    

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

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

            let ball = SCNSphere(radius: 0.3)

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

            let ballNode = SCNNode(geometry: ball)

            ballNode.position = shooterNode.position

            ballNode.physicsBody = SCNPhysicsBody.dynamicBody()

            let a = Float(self.slider!.value) + Float(M_PI)/2.0

            let x = 20 * cos(a)

            let z = –20 * sin(a)

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

            

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

        }

        

    }

}