ホーリーのプログラミング日記

ホーリーのプログラミング日記

エキセントリック・スーパーアプリクリエイター / アプリ総DL数 約180万 / 全然分からない 俺は雰囲気でアプリを作ってる / iOS : apple.co/3m3HxSm / Android : bit.ly/3ma0liZ

SpriteKitで画面遷移するときに、ボタンを押した感じにする方法

 

初めてSpriteKitでゲームを作ったときに困ったのが、画面遷移です。

ようは画面を移動するときに困ったんですが、それがあれ。

 

ボタンが押した感じにならないこと

 

SpriteKitを使わずに、普通にxcodeでアプリを作れば、ボタンだったりラベルが選択された感じになるんですよ。その瞬間に色が薄くなるっていうか。まあWEBのそれと同じですね。

でも、これSpriteKitだとそうならない。なので悩みました。

 

【追記2016.06.08】

正しい方法が今さらながら分かりました。completionっていうのを使えば、SKActionが終わってから、任意の処理を実行出来るんですね。

 

if touchNode == startLabel{

    

    let action1 = SKAction.scaleTo(0.8, duration: 0.1)

    let action2 = SKAction.scaleTo(1.0, duration: 0.1)

    let actionS = SKAction.sequence([action1,action2])

    

    startLabel.runAction(actionS, completion: {

    

        let skView = self.view! as SKView

        let scene = GameScene(size: self.size)

        scene.scaleMode = SKSceneScaleMode.AspectFill

        skView.presentScene(scene)

    

    })

    

}

 

これでOKです。これより下に書いてる時間差でどうのこうのって処理は、まあそんなのもあるんだなって感じで読んでください。亜流丸出しの処理でした。。

 

☆☆☆

 

この本の最後にボタンを押した感じになる方法が書いてるんですが、画面遷移する場合だと、その押した感じが出る前に遷移しちゃうんですよね。

てか遷移の処理が発動するんで、ボタンを押したのかが分かりにくくなります。実際にプレイしてもらった人たちも、ボタンが押されたのがよく分からずに、連打しちゃってました。これはマズイ。

(初めて作ったゲームも、この本を参考にしました)

 

iPhoneのゲームアプリをつくろう!

iPhoneのゲームアプリをつくろう!

 

 

if touchNode == startLabel{

                let action1 = SKAction.scaleTo(0.8, duration: 0.1)

                let action2 = SKAction.scaleTo(1.0, duration: 0.1)

                let actionS = SKAction.sequence([action1,action2])

                startLabel.runAction(actionS)

}

 

startLabelを定義して、こう書けば、それが押された感じになります。

一度0.8倍に縮小されて、それがまた戻るんで、押した感が出るんですよ。

 

でも画面遷移と組み合わせると出ない。それで悩みました。

んで、自分が考えた答えはこれ。

 

画面遷移の発動を遅くすること

 

いつものことながらヘッポコなんで、本当はもっといい答えがあるのかもしれませんが、これを選びました。

 

ググってたら、こんないいのがあったんですよ。

Swiftで遅延処理 - Qiita

 

これを書けば、その処理が遅くなります。

 

if touchNode == startLabel{

                let action1 = SKAction.scaleTo(0.8, duration: 0.1)

                let action2 = SKAction.scaleTo(1.0, duration: 0.1)

                let actionS = SKAction.sequence([action1,action2])

                startLabel.runAction(actionS)

                

                let sound = SKAction.playSoundFileNamed("button.mp3", waitForCompletion: false)

                self.runAction(sound)

                

                let scene = StageScene(size: self.size)

                let skView = self.view! as SKView

                scene.scaleMode = SKSceneScaleMode.AspectFill

                

                let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC)))

                dispatch_after(delayTime, dispatch_get_main_queue()) {

                    skView.presentScene(scene)

                }

}

 

赤い字のところが、その画面遷移のところですね。これは発動するまで、0.5秒かかるようにしました。

(青い字のところは、ボタンを押したときの効果音です)

 

0.5秒遅れてskView.presentScene(scene)が発動する。

こう書いたら、とっても調子良かったですよ。

 

ボタンの押した感に悩むヘッポコ同志の参考になれば幸いです。

 

iPhoneのゲームアプリをつくろう!

iPhoneのゲームアプリをつくろう!