制作記録も第5回!
前回は移動AIの実装まででしたが、いよいよ敵キャラとバトルできるようになります!
今回制作したもの
今回はバトル自体の実装に加え、「戦闘エフェクト」や「メッセージウィンドウの表示」など、関連機能の制作も行なっていました!
カード画像作成
まずはバトル用のカード画像を用意!
オレンジ色のカードが攻撃カードです。
ついでに移動カード画像も陰影つけたりして修正。
そこそこの数量産しましたが、まだ一部しか使ってません笑
それと、ポスト(ツイート)時とは少し攻撃用カードの形式に変更を加えてます。
具体的には、1枚の画像として持つのではなく、上記のように「マス目画像」と「武器画像」を別々に保持する形式に変えました。
実際に表示する際には、これらの2枚を重ね合わせて表示します。
将来的に武器種を増やしていく予定なのですが、その武器種1種ごとにマス目画像を用意していくと、すごい数になるので……。
現在マス目画像は47枚で、1種ごとにマス目画像を用意すると「47×武器種」枚の画像が必要なのに対し、別々に保持する形式だと「47+武器種」枚で済みます。
なので、攻撃カードはこの形式でいくことにしました。
戦闘エフェクトの表示(プレイヤーからの攻撃)
次は戦闘エフェクトの表示です!
攻撃カードを押すと、対応したマス目にエフェクトが発生するようにしました。
エフェクトのアニメーションは、Asepriteというドット絵制作ツールを使うと比較的簡単に作れるので、そちらを使用しています。(カード画像作成にも使用)
この画像を数フレームごとに切り替えて表示することで、エフェクトを表現しています。
今は素手で攻撃した時用の打撃エフェクトのみですが、いずれは斬撃エフェクトとか魔法エフェクトとかも用意していく予定です。
ダメージ処理(プレイヤーからの攻撃)
エフェクトの表示ができたら、いよいよダメージ処理です!
「攻撃位置」から「ダメージを受ける敵キャラ」を特定し、その敵にのみダメージを与えます。
元々プレイヤーや敵キャラのステータスは設定してあったので、前に考えておいたダメージ計算式に従ってダメージを算出し、その分HPを減らしています。
ダメージを受けた敵キャラの点滅処理は、カードを押した時の点滅処理を流用。
攻撃終了時に、HPが0になった敵が居ればまとめて削除。
この流れで、ダメージ処理を実装しました。
現在はスライムを倒すのに2発、ゴブリンを倒すのに3発必要って感じですね!
武器とかレベルアップとか実装していくんで、そのうちワンパンになるはず。
戦闘メッセージの表示
さて、ダメージを与えられるようにはなりましたが、具体的に何ダメージ与えたのかなどの情報は画面上に表示されていませんでした。
そこで、戦闘メッセージを実装!
戦闘メッセージの実装
結構複雑なことをしてるんですが、簡単に言うと「メッセージリストに登録されたメッセージを自動で表示していく」処理を行なってます。
メッセージリストへの登録用にShowMessageという関数を作り、攻撃した時やダメージを与えた時、敵を倒した時などにこの関数を呼ぶとメッセージを表示できるようにしました。
ShowMessageの引数には、表示したいメッセージを渡します。
メッセージリストにメッセージがある時だけメッセージウィンドウが表示され、一定時間(150フレーム)が経過すると消える仕様です。
メッセージウィンドウには「2行用」「3行用」「4行用」の3つを用意し、メッセージの行数によって使用する枠画像を変えてます。
それぞれウィンドウの高さが違い、2行用は2行分のメッセージがぴったり入る高さ、4行用は4行分のメッセージがぴったり入る高さです。
5行以上の場合は1回で収まらないので、2回以上に分けて表示。
これまた一定時間経過(90フレーム)で次のメッセージに切り替わるようにしてます。
ローカライズの準備
また、メッセージの言語を簡単に切り替えられる仕組みを導入してました。
といっても単純なもので、各メッセージを下記のように配列で管理することで実現しています。
呼び出す時はこんな感じ。
AttackText[LangSetting]とすることで、言語設定に対応したメッセージが選ばれます。
ShowMessage(fmt.Sprintf(AttackText[LangSetting], PlayerNameList[LangSetting][SelectedPlayer]))
敵キャラからの攻撃
最後に、敵キャラからの攻撃です!
プレイヤーの攻撃と似ている部分もありますが、複数体の攻撃が連続して行われる点やエフェクトなどに違いがあります。
具体的には、以下のように処理が行われます。
- 最初の敵の攻撃時に、プレイヤーターンのメッセージが残っていれば消えるまで待機
- プレイヤーにダメージを与え、メッセージを表示
- 攻撃方向に向けて、敵キャラを少し移動させて戻す(敵キャラの攻撃モーション)
- ダメージを受けたプレイヤーを点滅
- メッセージが終わるまで待機してから次の敵キャラへ
- 2.〜5.を、全ての敵キャラの攻撃が完了するまで繰り返す
以上がアタックフェイズでの敵の攻撃の流れです。
3.の攻撃モーションは、プレイヤーのように戦闘エフェクトを使うのではなく、敵を素早く動かすことで攻撃の様子を表現しました。
また、複数の敵キャラの攻撃をテンポよく進めていくために、1.と5.でのメッセージ終了待ちが重要な役割を果たしています。
そもそも、なぜメッセージが消えるまで待機しているかというと、表示されないメッセージが発生しないようにするためです。
戦闘メッセージでは自動メッセージ送りを採用しているので、1回で表示しきれなかったメッセージは一定時間後に表示されます。
ただ、この一定時間が経過する前に次のメッセージで上書きされてしまうと、本来表示されるはずの2回目以降のメッセージが表示されないのです。
ですので、しっかりと全てのメッセージが表示されるよう待機処理を設けています。
ただ、通常だと2回目以降のメッセージに切り替わるのに90フレーム(1.5秒)、最後のメッセージが消えるまでに150フレーム(2.5秒)かかります。
それだと時間が長すぎてテンポが悪いので、アタックフェイズ中はより早く次のメッセージに切り替わるようにすることで、戦闘中のテンポの良さを確保しています。
次のメッセージに切り替わるまでの具体的な時間は、1.の場合は60フレーム、5.の場合は45フレームです。
メッセージの文量などから、プレイヤーターンのメッセージの方を少し長く表示しています。
このあたりの調整・実装が結構大変でしたが、最終的にはいい感じでバトルできるようになりました!
おわりに
今回は敵キャラとのバトルを実装しました!
今回一番大変だったのは、戦闘メッセージ関連の処理ですかね。
メッセージの読みやすさとテンポの両立になかなか苦労しました。(ダンジョン自動生成や移動AIよりはマシだったけども)
さて、前回が移動AI、今回がバトルと来たので、次回は……
……まだ決まってません!!!笑
何作ろうかな〜って感じですが、気の向くままに制作していきます。
また実装したものが溜まった頃に更新予定!
しばし待たれよ!
コメント