波模様にみえるパネルを敷き詰める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 0…48 {
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)}}
}