こんにちは、のっくんです。
プレイヤーのライフポイントを設定して、ライフが無くなったらゲームオーバーにする実装をしました。
新たにコーディングしたのは以下の通り。
- 左上のライフポイント
- 死んだときのアニメーション
- リスタートボタンの表示
- リスタートボタンが押されたときの処理
ライフポイントの実装
カメラに追従して常に表示されるようにHUD(Head Up Display)として実装しました。
赤いハートと空のハートを2枚用意して、ライフポイントに応じて切り替えることに。
func updateHeartDisplay(life:Int){ for index in 0 ..< heartNodes.count{ if index <= life-1{ heartNodes[index].Fill() }else{ heartNodes[index].Empty() } } }
ライフポイント以下であったら赤色のハート、以上であったら空のハートにします。
次に考えなければいけないのが、
- いつ状態を更新するか?
ということ。
Spritekitにはupdateというフレームが描画されるたびに呼ばれる関数があるのでここで呼ぶのも1つの手です。
しかし、ライフが変化していないのに毎回描画させるのは処理の無駄だなと考えました。
そこで、ライフが変化する箇所=敵からダメージを食らった時に、上記の関数を呼んで表示を変えるようにしました。
case PhysicsCategory.enemy.rawValue: print("player -> enemy") self.nokman.Hurt() hud.updateHeartDisplay(life: nokman.life)
リスタートボタン
リスタートボタンはプレイヤーが死んだタイミングで表示します。
func Die(){ removeAllActions() run(dieAnimation) if let gameScene = self.parent as? GameScene{ gameScene.hud.showRestartButton() } }
ポイントはSKSceneをasでキャストして呼び出しているところ。
ボタンを表示する処理はSpriteNodeではできないため、親のSKScene経由で実行しています。
リスタートボタンが押されたら
ボタンが押されたら初めからやり直すようにしました。
// ゲームシーンを呼び出して初めからスタート。 self.view?.presentScene(GameScene(size: self.size), transition: .crossFade(withDuration: 0.6))
presentSceneでSKSceneを指定します。