iPhoneバネ目

ジャンプすると箱につけた目が動くiPhoneアプリのサンプルコードを描いてみます。

import UIKit

import SpriteKit

class ViewController: UIViewController {

    weak var scene : SKScene?

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.setupScene()

        self.createScore()

        self.createGround()

        self.createPlayer()

    }

    func setupScene() {

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

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

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

        sv.presentScene(s)

        

        self.view.addSubview(sv)

        self.scene = s;

    }

    

    var score = 0

    func createScore() {

        let str = NSString(format: “%05d”, score)

        let scoreboard = SKLabelNode(text: str)

        scoreboard.name = “scoreboard”

        scoreboard.fontColor = UIColor.blackColor()

        let size = scoreboard.frame.size

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

        self.scene?.addChild(scoreboard)

    }

    

    func createGround() {

        let ground = SKSpriteNode(color: UIColor(hue: 0.4, saturation: 0.4, brightness: 1, alpha: 1), size: CGSize(width: CGRectGetMaxX(self.view.bounds), height: 20))

        ground.position = CGPoint(x: CGRectGetMidX(self.view.bounds), y: 10)

        self.scene?.addChild(ground)

        

        ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size)

        ground.physicsBody?.dynamic = false

    }

    

    func createPlayer() {

        let player = SKSpriteNode(color: UIColor(hue: 0.4, saturation: 0.8, brightness: 1, alpha: 1), size: CGSizeMake(80, 80))

        player.name = “player”

        player.position = CGPoint(x: CGRectGetMidX(self.view.bounds), y: 320)

        player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size)

        player.physicsBody?.categoryBitMask = 0x01

        player.physicsBody?.collisionBitMask = 0x01

        self.scene?.addChild(player)

        

        let eyes = SKSpriteNode(color: UIColor.clearColor(), size: CGSizeMake(60, 20))

        eyes.name = “eyes”

        eyes.position = player.position

        eyes.physicsBody = SKPhysicsBody(rectangleOfSize: eyes.size)

        eyes.physicsBody?.categoryBitMask = 0x10

        eyes.physicsBody?.collisionBitMask = 0x10

        eyes.physicsBody?.allowsRotation = false

        self.scene?.addChild(eyes)

        

        for i in 0..<2 {

            let eye = SKShapeNode(circleOfRadius: 8)

            eye.position = CGPoint(x: CGFloat(i) * 40 20 , y: 0)

            eye.fillColor = UIColor.whiteColor()

            eyes.addChild(eye)

        }

        

        

        for i in 0..<2 {

            let sp = SKPhysicsJointSpring.jointWithBodyA(player.physicsBody, bodyB: eyes.physicsBody, anchorA: CGPoint(x: player.position.x, y: player.position.y + 40 CGFloat(i) * 80), anchorB: eyes.position)

            sp.frequency = 2.0

            sp.damping = 3.0

            self.scene?.physicsWorld.addJoint(sp)

        }

        

        let sl = SKPhysicsJointSliding.jointWithBodyA(player.physicsBody, bodyB: eyes.physicsBody, anchor: eyes.position, axis: CGVector(dx: 0, dy: 1))

        self.scene?.physicsWorld.addJoint(sl)

    }

    

    func updateScore() {

        ++score

        let str = NSString(format: “%05d”, score)

        let scoreBoard = self.scene?.childNodeWithName(“scoreboard”) as SKLabelNode

        scoreBoard.text = str

    }

    

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

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

            player.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 230))

            updateScore()

        }

    }

}