
ボールを八方向にコロコロうごかす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 0…3 {
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 0…4 {
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 0…8 {
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)
}
}
}