iPhone鏡点繋ぎ

鏡みたいに左右反転させながら点繋ぎするiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SpriteKit

class ViewController: UIViewController, SKSceneDelegate {

    weak var scene : SKScene?

    var point = CGPointZero

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createDotDot()

        createMarker()

    }

    

    func setupScene() {

        let w = CGRectGetMaxX(view.bounds)

        let h = CGRectGetMaxY(view.bounds)

        

        let s = SKScene(size: CGSize(width: w, height: h))

        s.backgroundColor = UIColor(hue: 0.4, saturation: 0.6, brightness: 1, alpha: 1)

        s.delegate = self

        self.scene = s

        

        // left view

        let rv = SKView(frame: CGRect(x: 0.5 * w, y: 0, width: w, height: h))

        rv.presentScene(s)

        rv.transform = CGAffineTransformMakeScale(1.0, 1.0)

        view.addSubview(rv)

        

        // right view

        let lv = SKView(frame: CGRect(x: 0.5 * w, y: 0, width: w, height: h))

        lv.presentScene(s)

        lv.layer.opacity = 0.5

        view.addSubview(lv)

    }

    

    func createDotDot() {

        let r = CGRectGetMidY(view.bounds) * 0.8

        let small = r / 1.75

        let dAngle = M_PI / 2.5

        [Int](04).each { i in

            for var j=0; j<2; j++ {

                let w = dAngle * Double(i) + M_PI / 2.0 + Double(j) * M_PI / 5.0

                let x = (j==0 ? r : small) * CGFloat(cos(w))

                let y = (j==0 ? r : small) * CGFloat(sin(w)) + CGRectGetMidY(self.view.bounds)

                let dot = SKShapeNode(circleOfRadius: 10)

                dot.name = “dot \(2 * i + j)

                dot.position = CGPoint(x: x, y: y);

                dot.fillColor = UIColor.whiteColor()

                self.scene?.addChild(dot)

            }

        }

    }

    

    func createMarker() {

        let marker = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(30, 30))

        marker.name = “marker”

        self.scene?.addChild(marker)

        marker.runAction(SKAction.repeatActionForever(SKAction.rotateByAngle(CGFloat(M_PI), duration: 0.5)))

    }

    

    func update(currentTime: NSTimeInterval, forScene scene: SKScene) {

        if let marker = self.scene?.childNodeWithName(“marker”) {

            if !CGPointEqualToPoint(marker.position, self.point) {

                self.point = marker.position

                let line = SKSpriteNode(color: UIColor.orangeColor(), size: CGSizeMake(5, 5))

                line.position = marker.position

                self.scene?.addChild(line)

            }

        }

    }

    

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

        let p = touches.anyObject()!.locationInNode(self.scene)

        if let marker = self.scene?.childNodeWithName(“marker”) {

            marker.runAction(SKAction.moveTo(p, duration: 1.0))

        }

    }

}

extension Array {

    func each(doit:T -> Void) { for i in self {doit(i)} }

}