iPhone ドットと四角

ドットで四角を分割する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 09:

                p = (x: o.x + s * 5, y: CGFloat(i – 5) * s + o.y)

            case 1019:

                p = (x: CGFloat(i – 15) * s + o.x, y: o.y + s * 5)

            case 2029:

                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])

}