iPhoneこっちでハロー

家アイコンの近くに行くとHelloって表示されるiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SpriteKit

class ViewController: UIViewController, SKSceneDelegate {

    weak var scene : SKScene?

    weak var near : SKNode?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        setupScene()

        createHouse()

        createWalker()

    }

    

    func setupScene() {

        let sv = SKView(frame: view.bounds)

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

        s.delegate = self

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

        sv.presentScene(s)

        view.addSubview(sv)

        

        scene = s

    }

    func createHouse() {

        let r = CGRectGetMaxX(view.bounds) * 0.35

        let dw = Double(M_PI) / 2.5

        for i in 05 {

            let w = dw * Double(i)

            let x = Double(r) * cos(w) + Double(CGRectGetMidX(view.bounds))

            let y = Double(r) * sin(w) + Double(CGRectGetMidY(view.bounds))

            let house = SKSpriteNode(color: UIColor.blackColor(), size: CGSize(width: 50, height: 50))

            house.name = “house”

            house.position = CGPoint(x: x, y: y)

            

            var pts = UnsafeMutablePointer<CGPoint>.alloc(3)

            pts[0] = CGPoint(x: –40, y: 0)

            pts[1] = CGPoint(x: 40, y: 0)

            pts[2] = CGPoint(x: 0, y: 30)

            let roof = SKShapeNode(points: pts, count: 3)

            roof.position = CGPointMake(0, 15)

            roof.lineWidth = 0

            roof.fillColor = UIColor.blackColor()

            house.addChild(roof)

            

            let door = SKSpriteNode(color: UIColor.yellowColor(), size: CGSize(width: 20, height: 25))

            door.position = CGPoint(x: 0, y: –15)

            house.addChild(door)

            

            self.scene?.addChild(house);

        }

    }

    

    func createWalker() {

        let walker = SKShapeNode(circleOfRadius: 20)

        walker.name = “walker”

        walker.position = CGPoint(x: CGRectGetMidX(view.bounds), y: CGRectGetMidY(view.bounds))

        walker.fillColor = UIColor.blueColor()

        for i in 01 {

            let eye = SKSpriteNode(color: UIColor.whiteColor(), size: CGSize(width: 6, height: 4))

            eye.position = CGPoint(x: i == 0 ? 10 : –10, y: 0)

            walker.addChild(eye)

        }

        scene?.addChild(walker)

    }

    

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

        let walker = scene?.childNodeWithName(“walker”)

        if let touch = touches.first as? UITouch {

            let p = touch.locationInNode(scene)

            walker?.runAction(SKAction.moveTo(p, duration: 1.0))

        }

    }

    

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

        let walker = scene.childNodeWithName(“walker”)

        scene.children

            .filter {($0 as! SKNode).name == “house”}

            .map { n -> Void in

                if let n = n as? SKNode {

                    let d = hypotf(Float(n.position.x – walker!.position.x), Float(n.position.y – walker!.position.y));

                    if fabs(d) < 50 && self.near == nil {

                        let hello = SKLabelNode(text: “hello”)

                        hello.name = “hello”

                        hello.fontSize = 50

                        hello.position = n.position

                        self.scene?.addChild(hello)

                        hello.runAction(SKAction.moveByX(0, y: 30, duration: 0.5))

                        

                        self.near = n

                    }

                    else if fabs(d) > 70 && self.near == n {

                        let hello = self.scene?.childNodeWithName(“hello”)

                        hello?.removeFromParent()

                        self.near = nil

                    }

                }

            }

    }

}