【SpriteKit】チャージショットを実装してみた

チャージショットを実装してみました。

実装方法としては、以下の通り。

  1. ボタンが押されたらチャージアニメーションを開始、時間を保存。
  2. ボタンが離されたら、時間に応じてショットを撃つ。長押しの場合は、チャージ弾を撃つようにする。

コードは以下のようにしました。

ボタンが押された時、

            } else if ( node.name == "Fire"){
                if touchStarted == nil{
                    touchStarted = touch.timestamp
                }
                hud.onAButton(on: true)
                self.nokman.Charge(on: true)
            }

時間を計測し、ボタンを押した状態にし、チャージアニメーションを開始します。

次にボタンが離された時、

            } else if node.name == "Fire" && touchStarted != nil{
                let timeEnded = touch.timestamp
                if timeEnded! - touchStarted! >= longTapTime {
                    self.nokman.Fire(charged: true)
                } else {
                    self.nokman.Fire(charged: false)
                }
                touchStarted = nil
                hud.onAButton(on: false)
                self.nokman.Charge(on: false)
            }

ボタンの開始時間を引いて、押下時間を求めます。

押下時間が基準値よりも大きければ、チャージショット、そうでなければ通常のショットを撃ちます。

最後にチャージアニメーションを終了しています。

通常のショットよりも大きくするのは、弾のインスタンスを生成する時に、サイズとダメージを大きくしています。

チャージのアニメーションは以下の通りです。

        // チャージが始まるまで少しバッファを持たせることで通常弾時に青くならない。
        let wait = SKAction.wait(forDuration: 0.2)
        
        let colarChange = SKAction.sequence([
            SKAction.colorize(with: .blue, colorBlendFactor: 0.5, duration: 0.2),
            SKAction.colorize(with: .blue, colorBlendFactor: 0.0, duration: 0.2)
            ])
        
        let charge = SKAction.repeatForever(colarChange)
        
        chargeAnimation = SKAction.sequence([wait,charge])

colorBlendFactorはデフォルトが0.0で、最大が1.0です。

colorizeで色を指定しても、colorBlendFactorが0.0だと色は変わりません。

上記のコードでは、

  • 0.5にして青色にする
  • 0.0にして元の色に戻す

を高速で繰り返すことで、チャージしているアニメーションを作っています。

またチャージアニメーションが始まる前に、少しバッファを持たせることで通常の弾が発射される時には青くならないように工夫しています。