数字が書いてある紙をパラパラやって狙った数字で止めるiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SceneKit
class ViewController: UIViewController, SCNSceneRendererDelegate {
weak var sceneView : SCNView?
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createNumberPages()
createCamera()
}
func setupScene() {
let sv = SCNView(frame: view.bounds)
sv.scene = SCNScene()
sv.backgroundColor = UIColor(hue: 0.5, saturation: 0.1, brightness: 1, alpha: 1)
sv.playing = false
sv.delegate = self
view.addSubview(sv)
sceneView = sv
}
func createNumberPages() {
[Int](0…20).each { i in
let l = CATextLayer();
l.string = “\(i+1)“
l.alignmentMode = kCAAlignmentCenter;
l.foregroundColor = UIColor.blackColor().CGColor;
l.fontSize = 160;
l.frame = CGRectMake(0, 0, 400, 200);
l.backgroundColor = UIColor(hue: 0.5, saturation: 0.2, brightness: 0.9, alpha: 1).CGColor
let page = SCNBox(width: 10, height: 5, length: 0.001, chamferRadius: 1)
page.firstMaterial?.diffuse.contents = l
let m = SCNMaterial()
m.diffuse.contents = l.backgroundColor
page.materials = [page.firstMaterial!, m, m, m, m, m]
let pageNode = SCNNode(geometry: page)
pageNode.name = “page \(i)“
pageNode.position = SCNVector3Make(0, 0, –0.01 * Float(i))
self.sceneView?.scene?.rootNode.addChildNode(pageNode)
}
}
func createCamera() {
let camera = SCNNode()
camera.camera = SCNCamera()
camera.position = SCNVector3Make(0, 0, 20)
sceneView?.scene?.rootNode.addChildNode(camera)
}
var count = 0
func flip() {
if let page = sceneView?.scene?.rootNode.childNodeWithName(“page \(count)“, recursively: false) {
page.physicsBody = SCNPhysicsBody.dynamicBody()
page.physicsBody?.collisionBitMask = 0x0
page.physicsBody?.angularDamping = 0.99
page.physicsBody?.restitution = 0
let joint = SCNPhysicsHingeJoint(body: page.physicsBody!, axis: SCNVector3Make(1, 0, 0), anchor: SCNVector3Make(0, –2.5, 0))
sceneView?.scene?.physicsWorld.addBehavior(joint)
page.physicsBody?.applyTorque(SCNVector4Make(1, 0, 0, 150.4), impulse: true)
}
count++;
}
var lasttime : NSTimeInterval = 0
func renderer(aRenderer: SCNSceneRenderer, updateAtTime time: NSTimeInterval) {
if (state > 0) {
if lasttime == 0 || (time – lasttime) > 0.1 {
flip()
lasttime = time
}
}
}
var state = 0
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
if state == 0 {
self.sceneView?.playing = true
state++;
return;
}
self.sceneView?.scene?.physicsWorld.speed = 0
func delay(delay:Double, doit:() -> Void) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), doit)
}
delay(2) {
self.sceneView?.scene?.physicsWorld.speed = 0
self.lasttime = 0
self.state = 0
self.count = 0
self.sceneView?.scene?.rootNode.childNodes.each { i in
i.removeFromParentNode()
}
self.createNumberPages()
self.sceneView?.scene?.physicsWorld.speed = 1
}
}
}
extension Array {
func each(doit:T -> Void) { for i in self { doit(i) }}
}