連載
» 2015年12月17日 05時00分 公開

iOS 9の最新機能で自動ルート検索を簡単にゲームに組み込むiOS SDKとSwiftで始めるゲーム作成入門(3)(2/3 ページ)

[杉本裕樹,マネーフォワード]

SKActionクラスで敵をルートに沿って行動させる

 道ができたので敵を道に沿って移動させます。

 前回までは移動をGameSceneクラスのupdateメソッド内で行っていました。しかし今回からは「SKAction」クラスを使うので、GameScene.swiftのupdateメソッドを削除します。

class GameScene: SKScene, SKPhysicsContactDelegate {
    // …省略
    
    /**
    // このメソッドを丸ごと削除
    override func update(currentTime: NSTimeInterval) {
        if state == .Playing {
            enemy.position.x += 1
            
            if frame.width < enemy.position.x {
                state = .GameOver
                
                let myLabel = SKLabelNode(fontNamed: "HiraginoSans-W6")
                myLabel.text = "ゲームオーバー"
                myLabel.fontSize = 45
                myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - 20)
                addChild(myLabel)
            }
        }
    }
    */
}

「SKAction」を使ったソースコード

 SKActionを使った移動処理を追加します。GameSceneクラスのdidMoveToViewメソッドの後半を以下のように書き換えます。

class GameScene: SKScene, SKPhysicsContactDelegate {
    // …略
    override func didMoveToView(view: SKView) {
        // …略
        /**
        // 今まであった処理
        enemy.position = CGPoint(x:50, y:300)
        enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
        addChild(enemy)
        */
        
        enemy.position = CGPoint(x: fieldImageLength * 2, y: view.frame.height)
        enemy.physicsBody = SKPhysicsBody(rectangleOfSize: enemy.size)
        let action1 = SKAction.moveTo(
            CGPoint(x: fieldImageLength *  2, y: view.frame.height - fieldImageLength * 12), duration: 10)
        let action2 = SKAction.moveTo(
            CGPoint(x: fieldImageLength *  6, y: view.frame.height - fieldImageLength * 12), duration: 10)
        let action3 = SKAction.moveTo(
            CGPoint(x: fieldImageLength *  6, y: view.frame.height - fieldImageLength *  9), duration: 10)
        let action4 = SKAction.moveTo(
            CGPoint(x: fieldImageLength * 13, y: view.frame.height - fieldImageLength *  9), duration: 10)
        enemy.runAction(SKAction.sequence([action1, action2, action3, action4])) {
            self.state = .GameOver
            
            let myLabel = SKLabelNode(fontNamed: "HiraginoSans-W6")
            myLabel.text = "ゲームオーバー"
            myLabel.fontSize = 45
            myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) - 20)
            self.addChild(myLabel)
        }
        addChild(enemy)
    }
}

 これで敵がルートに沿って移動するようになりました。

SKNodeに対していろいろなアクションを付ける「SKAction」

 今回から登場したSKActionはSpriteKitのクラスの一つで、SKNodeに対していろいろなアクションを付けることができます。

 今回は移動処理に使いましたが、回転させる「rotateToAngle」や拡大・縮小をする「scaleBy」といった、さまざまな機能を備えているので、一度リファレンスを眺めてみると楽しいかもしれません。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。