
ドットで四角を分割するiPhoneアプリのサンプルコードを描いてみます。
import UIKit
import SpriteKit
class ViewController: UIViewController {
var p1 = CGPointZero
var p2 = CGPointZero
var lineangle = 0.0
weak var scene : SKScene?
override func viewDidLoad() {
super.viewDidLoad()
setupScene()
createRect()
createDotLine()
}
func setupScene() {
let sv = SKView(frame: self.view.bounds)
let s = SKScene(size: sv.bounds.size)
s.backgroundColor = UIColor(white: 0.2, alpha: 1)
sv.presentScene(s)
view.addSubview(sv)
scene = s
}
func createDotLine() {
self.updateDotLine(0)
}
func updateDotLine(angle : Double) {
self.scene?.children
.filter { $0.name == “dot” }
.map { $0.removeFromParent() }
let pointAt = {(angle : Double) -> CGPoint in
let r = CGRectGetMaxX(self.view.bounds) * 0.3
let x = r * CGFloat(cos(angle)) + CGRectGetMidX(self.view.bounds)
let y = r * CGFloat(sin(angle)) + CGRectGetMidY(self.view.bounds)
return CGPoint(x: x, y: y)
}
p1 = pointAt(lineangle)
p2 = pointAt(lineangle + M_PI)
let count = 10
let d = [p1.x – p2.x, p1.y – p2.y].map { $0 / CGFloat(count – 1) }
var point = p2
for _ in 0..<count {
let dot = SKShapeNode(circleOfRadius: 5)
dot.name = “dot”
dot.position = point
dot.fillColor = UIColor(white: 0.9, alpha: 1)
self.scene?.addChild(dot)
point = point + d
}
let dots = self.scene?.children.filter { $0.name == “dot” } as [SKNode]
let blocks = self.scene?.children.filter { $0.name == “block” } as [SKNode]
for b in blocks {
for dot in dots {
if CGRectIntersectsRect(dot.frame, b.frame) {
b.alpha = 0.0
break
} else {
b.alpha = 1.0
}
}
}
}
func createRect() {
let s = CGRectGetMaxX(self.view.bounds) * 0.4 / 10.0
let o = CGPoint(x: CGRectGetMidX(self.view.bounds), y: CGRectGetMidY(self.view.bounds))
for i in 0..<40 {
var p = (x: CGFloat(0.0), y: CGFloat(0.0));
switch(i) {
case 0…9:
p = (x: o.x + s * 5, y: CGFloat(i – 5) * s + o.y)
case 10…19:
p = (x: CGFloat(i – 15) * s + o.x, y: o.y + s * 5)
case 20…29:
p = (x: o.x – s * 5, y: CGFloat(i – 25) * s + o.y)
default:
p = (x: CGFloat(i – 35) * s + o.x, y: o.y – s * 5)
}
let n = SKShapeNode(rectOfSize: CGSize(width: 20, height: 20))
n.name = “block”
n.position = CGPoint(x:p.x, y:p.y)
n.fillColor = UIColor(white: 0.4, alpha: 1)
n.strokeColor = UIColor.clearColor()
self.scene?.addChild(n)
}
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
lineangle = (lineangle + 0.1) % (2.0 * M_PI)
updateDotLine(lineangle)
}
}
func + (p: CGPoint, t:[CGFloat]) -> CGPoint {
return CGPoint(x : p.x + t[0], y: p.y + t[1])
}