iPhone波ブロック

波模様にみえるパネルを敷き詰めるiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SpriteKit

class ViewController: UIViewController {

    weak var scene : SKScene?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createWall()

    }

    

    func createWall() {

        [(10, 700, 5, CGRectGetMidY(view.bounds)),

            (400, 10, CGRectGetMidX(view.bounds), 5),

            (10, 700, –5 + CGRectGetMaxX(view.bounds), CGRectGetMidY(view.bounds)),

            ].foreach { (w : CGFloat, h : CGFloat, x : CGFloat, y : CGFloat) in

            

            let l = SKSpriteNode(color: UIColor.brownColor(), size: CGSizeMake(w, h))

            l.position = CGPointMake(x, y)

            self.scene?.addChild(l)

        }

    }

    

    func setupScene() {

        scene = {

            let sv = SKView(frame: self.view.bounds)

            let s = SKScene(size: sv.frame.size)

            sv.presentScene(s)

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

            self.view.addSubview(sv)

            return s

        }()

    }

    func createBlock(position : CGPoint, colorA : UIColor, colorB : UIColor) -> SKNode {

        let bk = SKSpriteNode(color: UIColor(hue: 0, saturation: 0.7, brightness: 0.8, alpha: 1), size: CGSizeMake(40, 40))

        bk.position = position;

        self.scene?.addChild(bk)

        

        let path1 = UIBezierPath(arcCenter: CGPoint(x: –20, y: –20), radius: 20, startAngle: 0, endAngle: CGFloat(M_PI) * 0.5, clockwise: true)

        path1.addLineToPoint(CGPointMake(-20, –20))

        path1.closePath()

        let c1 = SKShapeNode(path: path1.CGPath)

        c1.strokeColor = UIColor.clearColor()

        c1.fillColor = colorA;

        bk.addChild(c1)

        

        let path2 = UIBezierPath(arcCenter: CGPoint(x: 20, y: 20), radius: 20, startAngle: CGFloat(M_PI), endAngle: 1.5 * CGFloat(M_PI), clockwise: true)

        path2.addLineToPoint(CGPointMake(20, 20))

        path2.closePath()

        let c2 = SKShapeNode(path: path2.CGPath)

        c2.fillColor = colorB

        bk.addChild(c2)

        

        return bk

    }

    

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

        for i in 048 {

            

            let x = (i % 7) * 40 + 70

            let y = (i / 7) * 40 + 50

            let colorA = (i % 2) == 0

                ? UIColor(hue: 0.2, saturation: 1, brightness: 1, alpha: 1)

                : UIColor(hue: 0.2, saturation: 0.6, brightness: 1, alpha: 1)

            let colorB = (i % 2) == 0

                ? UIColor(hue: 0.2, saturation: 0.8, brightness: 1, alpha: 1)

                : UIColor(hue: 0.2, saturation: 0.4, brightness: 1, alpha: 1)

            

            let node = createBlock(CGPoint(x: CGFloat(x), y: CGFloat(y)), colorA: colorA, colorB: colorB)

            node.alpha = 0

            node.runAction(

                SKAction.sequence([

                    SKAction.waitForDuration(Double(i) * 0.1),

                    SKAction.fadeInWithDuration(0.2),

                    SKAction.waitForDuration(Double(48 – i) * 0.2),

                    SKAction.rotateByAngle(CGFloat(M_PI) * 0.5, duration: 0.3)

            ]))

        }

    }

}

extension Array {

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

}