• WEB

Swiftとバグバグ 〜 SpriteKit 〜

  • エイチ
    エイチ システムちーむ
  • このエントリーをはてなブックマークに追加

SpriteKit

SpriteKitはAppleから提供されている2Dゲーム開発用のフレームワークです。

今回はSpriteKitを用いた簡単なiPhoneアプリを
日々大量のバグを生み出し続けるWebプログラマー「エイチ」と
バグが大好物なエイチのペット「バグバグ」とともに実装してみます。

はじまり

バグバグ 「zzz zzz zzz」

エイチ  「バグバグ ねぇ バグバグ 起きなよ
      SpriteKitを使ってiPhoneアプリを作るよ
      バグバグがバグバグするアプリだよ  」

バグバグ 「!!」

エイチ  「XCodeからプロジェクトを作ろっと
      テンプレートはGameでー
      ゲームエンジンはSpriteKitでー  」

カチャカチャッ タンッ!

エイチ  「プロジェクト出来たから 
      いらないコードとか ゴミ箱ポイして
      ちょいと修正しとこっと      」

カチャカチャッ タンッ!

GameViewController.swift

override func viewDidLoad() {
    super.viewDidLoad()

    let scene = GameScene()

    let skView = self.view as! SKView
    skView.showsFPS = true
    skView.showsNodeCount = true
    skView.ignoresSiblingOrder = true

    scene.scaleMode = .AspectFill
    scene.size = skView.frame.size

    skView.presentScene(scene)
}

GameScene.swift

override func didMoveToView(view: SKView) {
    self.backgroundColor = UIColor.blackColor()
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {

    }
}

エイチ  「よしっ 準備できたぞ
      じゃあまずは 背景画像を設置しようかな
      スプライトノードを画面いっぱいに配置してっと」

カチャカチャッ タンッ!

override func didMoveToView(view: SKView) {

    // 省略

    let background = SKSpriteNode(imageNamed: "bugbug")
    background.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
    background.size = self.size
    self.addChild(background)
}

エイチ  「次は画面中央にスプライトノードを配置して
      アニメーションさせてみよっと
      回転と拡大/縮小を同時にさせるよ    」

カチャカチャッ タンッ!

override func didMoveToView(view: SKView) {

    // 省略

    let mouth = SKSpriteNode(imageNamed: "mouth")
    mouth.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
    let mouthRotateAction = SKAction.rotateByAngle(CGFloat(M_PI), duration: 20)
    let mouthRotateForeverAction = SKAction.repeatActionForever(mouthRotateAction)
    let mouthScaleLargeAction = SKAction.scaleTo(1.1, duration: 5.0)
    let mouthScaleSmallAction = SKAction.scaleTo(0.9, duration: 5.0)
    let mouthSequenceAction = SKAction.sequence([mouthScaleLargeAction, mouthScaleSmallAction])
    let mouthScaleForeverAction = SKAction.repeatActionForever(mouthSequenceAction)
    let mouthGroupAction = SKAction.group([mouthRotateForeverAction, mouthScaleForeverAction])
    mouth.runAction(mouthGroupAction)
    self.addChild(mouth)
}

エイチ  「今度は画面をタップした場所にラベルノードを作って
      画面中央に回転しながら移動して消えるようにしてみるよっ」

カチャカチャッ タンッ!

let stringList = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {
        let location = touch.locationInNode(self)

        let label = SKLabelNode(fontNamed: "Chalkduster")
        label.text = stringList[Int(arc4random_uniform(UInt32(stringList.count)))]
        label.fontSize = 50 + CGFloat(arc4random_uniform(100))
        label.position = location

        let randomFlag = Int(arc4random_uniform(100) % 2)
        let radians = randomFlag == 1 ? CGFloat(M_PI) : CGFloat(-M_PI)
        let durationRotate = 0.5
        let rotateAction = SKAction.rotateByAngle(radians, duration: durationRotate)
        let rotateRepeatAction = SKAction.repeatAction(rotateAction, count: 5)

        let durationScaleMove = 1.0
        let blackHolePoint = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
        let moveAction = SKAction.moveTo(blackHolePoint, duration: durationScaleMove)
        let scaleAction = SKAction.scaleTo(CGFloat(0), duration: durationScaleMove)

        let groupAction = SKAction.group([rotateRepeatAction, moveAction, scaleAction])

        label.runAction(groupAction) {
            label.removeFromParent()
        }

        self.addChild(label)
    }
}

エイチ  「よしっ これでおしまいっと」

エイチ  「簡単なゲームならSpriteKitで作れそうだね バグバグ」

エイチ  「さあ バグバグ ソースコード 全部お食べ」

バグバグ 「バグバグ バグバグ バグバグ」

エイチ  「美味しかったろう バグバグ」

bugbugeatbug

このエントリーをはてなブックマークに追加

エイチが最近書いた記事

WRITERS POSTS もっと見る

他にもこんな記事が読まれています!

  • WEB
  • マーケティング
  • サーバー・ネットワーク
  • ライフスタイル
  • お知らせ