
床の穴をくぐってどんどんしたに進んでいく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 0…3 {
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.0 – 10.0
let z = Float(j / 5) * 5.0 – 10.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)
}
}
}
}