【Bakinでアクションゲーム開発】プレイヤーの攻撃と敵の攻撃のダメージ処理を実装する

Bakin

前回までの流れ

私は個人でゲーム開発をしており、Bakinを使って作成したゲームはふりーむ様でも公開しています。

実際に遊んでみてもらえると嬉しいですが、具体的にどんなゲームなのかは以下の動画を見ていただくだけでも分かると思います。
前回の記事(以下参照)ではアクションゲームを作成する際において、敵キャラクター(モンスター)を作成し、その攻撃モーションを作り込むところまで行いました。

今回の記事ではこれまでに作成したプレイヤーの剣を振るアクションに合わせた敵のダメージ処理と、逆に敵から攻撃を受けたときのダメージ処理について実装していきます。

Bakinでプレイヤーの攻撃に合わせたダメージ処理を実装する

それでは前回の記事で実装した「ゴブリンA」にプレイヤーの攻撃を受けたときのイベント処理を追加していきたいと思います。

「データベース」「キャスト」にある「ゴブリンA」「キャストイベント設定」を押して、「キャストイベント」の画面を開いてください。
「キャストイベント」が開いたら左側にある「シートリスト」の左から2つ目の「|+」のボタンを押して、並列して動作するイベントシートを作成して下さい。

このとき「+」ボタンの方で作成するイベントシートでは攻撃処理とダメージ処理を並列で動かせないので、必ず「|+」ボタンの方で作成して下さい。

作成されると「シートリスト」に先頭文字「P:」で始まるシートが新しく出来ると思いますので、それぞれのシート名を次のように「移動と攻撃処理」「ダメージ処理」としておきます。
新しく作成した「ダメージ処理」のシート内容は次のようにしています。

ここまで複雑にしなくてもプレイヤーの「近接攻撃アクション」と接触していたら、イベントのHPを減らすという処理だけでもダメージ処理は実現出来ます。

しかし、そのような簡素なダメージ処理ではアクションゲームとしての臨場感が皆無のため、このシートのように攻撃が当たった際のサウンドやエフェクト、ダメージモーション等の処理を組み込む必要があります。
ダメージ処理の基本的な流れとしては、前々回の記事で実装したプレイヤーの攻撃判定と接触したかどうかを最初にチェックします。

プレイヤーの攻撃判定と接触したかどうかの判定は次のように「このイベント」「近接攻撃アクション」「キャスト」が接触したかどうか、そして「消滅途中のイベントを無視する」にチェックを入れて判定します。
次にプレイヤーの攻撃と接触していた場合に先ず「のけぞりフラグ」に1を代入します(スイッチ等でも別に良いです)。

この「のけぞりフラグ」というのは自分でローカル変数を作成したものです。Bakinではこのように様々な用途で使いまわしたい変数を自分で作る事が出来ます(変数のローカルタブで追加ボタンを押すと作成出来ます)。

「のけぞりフラグ」は攻撃を受けて敵キャラがのけぞった状態になった時を1として、のけぞり状態が解除されたら0に戻します。

このフラグはもう一つのシートの方で活用しますので、今回はフラグの作成と攻撃を受けたら1にして、攻撃を受けた処理の最後では0に戻すということを覚えておいてください。
それ以外の指定した時間待つ処理やサウンド、エフェクト等はこれまでのアクションでも実装した通り、ゲームとしての雰囲気を出すために追加しているものです。

流れの後半の処理でイベントのHPを10ポイント減らしていますが、これが実際に敵キャラクターが受けるダメージとなります。

今回は固定で10ポイント減らしていますが、これも変数を活用すればプレイヤーの攻撃力分減らしたり、敵キャラクターの防御力と計算したうえで減らすことも出来ます。

次に「移動と攻撃処理」のイベントシートの中身については、前回の記事から次のように変更しました。
簡単に言うと処理の要所で「のけぞりフラグ」の値をチェックし、それぞれの処理は「のけぞりフラグ」が0、すなわちのけぞり状態では無い時にのみ処理が進むようにしました。

このチェック処理を入れないで動かしてみると分かりますが、プレイヤーが攻撃して敵がのけぞっている状態にも関わらず、突然敵からの攻撃を受けるということが起きます。

これは「移動と攻撃処理」「ダメージ処理」という2つのイベントシートが並行して動いているため、片方でダメージを受ける処理をしていても、移動と攻撃を行うための処理が裏で動作してしまうためです。

そういった問題を防ぐためには2つのイベントシートで共通する変数を持たせておき、片方のイベントシートの処理をしている間はフラグを立てておき、終わったらフラグを解除するといった対応で解決できます。

もちろん他の実装方法もあるとは思いますが、これが一番シンプルな解決方法だと私は考えています。

ちなみに「移動と攻撃処理」の先頭部分で一度「のけぞりフラグ」をチェックすれば、それ以降のチェックは不要ではないかと思う人もいるかと思います(特にプログラミング畑の人達は)。

しかし、先述したように並行してイベントシートが動くため、最初にチェックを入れるだけでは、移動後にダメージを受けた場合や、攻撃モーション中にダメージを受けた場合に対応できないのです。

例えば、先頭部分だけにチェックを入れた状態で動かすと、攻撃モーションがダメージを受けて中断しているのにも関わらず、いきなり攻撃を受けるといった珍自体が起きます。

強敵にはあえてそういった「ハイパーアーマー」のような仕様を組み込むのは良いですが、雑魚敵も全て「ハイパーアーマー」状態だとプレイヤーはゲームを楽しめません。

ここまで「キャストスクリプト」を作り込めば、プレイヤーの攻撃に合わせて「ゴブリンA」がダメージを受けて、のけぞるといった良くあるアクションゲームを再現することが出来ます。

Bakinで敵の攻撃に合わせたダメージ処理を実装する

続いて、敵の攻撃をプレイヤーが受けた場合のダメージ処理を実装していきます。

「ゴブリンA」のダメージ処理時と同じように、プレイヤーである「hero」のキャストイベントに同じ処理を実装すれば良いように思えますが、なぜかプレイヤーのキャストイベントでは上手く動きません。

恐らくBakinの内部処理的に「プレイヤー」は「イベント」とは異なる扱いになっていると考えられ、プレイヤーのキャストに対してキャストイベントを設定するのはあまり良くないようです。

そのため、プレイヤーが受けるダメージ処理は「コモンイベント」で設定します。

Bakinのマスターメニューから「コモンイベント」をクリックし、「共通イベント」の中に「プレイヤーのダメージ判定」というフォルダを作り、そこに「ゴブリンの攻撃」というイベントを作成します。

今回私が作成したイベントの内容は次のような内容です。
流れとしては基本的に「ゴブリンA」がプレイヤーの攻撃を受けたときと同じで、「ゴブリンの攻撃」キャストとプレイヤーが接触したかどうかでダメージ判定を行います。

細かい違いとして「Pダメージ」というローカル変数を作り、そこに固定値で10を設定しています。

HPを減らす対象は「パーティの1番目」を指定していますが、これはデフォルト状態のプレイヤーがパーティーの1番目に来ることを利用しています。

アクションゲームは基本的にプレイヤーが一人だけで進めていくものが多いので、基本的にはこれで問題ないと思います。

プレイヤーはイベントと違ってHPを減らした分を画面に表示するという機能が何故か無いため、受けたダメージを画面に文字として自分で表示してあげる必要があります(そうしないと受けたダメージ量が分からない)。

そのため、「Pダメージ」というローカル変数を「イメージとして画面に文字を表示する」スクリプトを使って100番のイメージ管理番号を割り振って表示しています。

また、プレイヤーにも敵キャラと同じようにダメージモーションを付けても良いのですが、いちいち敵の攻撃で止められると操作性が悪いため、代わりに画面を揺らして無敵時間を付与しています。

最後に文字として表示したダメージのイメージを消します。イメージを消すときには管理番号を指定する必要があるので、先に割り振った100番のイメージを消すという指定の仕方をしています。

これでプレイヤー側のダメージ処理も出来たので、テストプレイをしてみて下さい。
敵キャラクターの攻撃がプレイヤーに当たるときと当たらないときが起きていると思います。

原因としては「ゴブリンの攻撃」が早すぎて、プレイヤーに当たった時に慣性で後ろに弾かれてしまい、更にプレイヤーに当たったことでキャストの消滅条件を満たしてしまい、ダメージ発生判定前にキャストが消えてしまっているケースが出ているためです。

これは結構難しい問題で、ゴブリンの攻撃が「味方と衝突」しても消滅しないようにすれば一定回避は出来ます。
他にもデフォルトでは地上での慣性が明らかに強過ぎるので、「ゲーム定義」の慣性の設定欄で、「地上での減衰量」を元の0.8から下げることで、慣性を抑えることが出来ます。
この2つを調整すれば、高い確率でちゃんとダメージが発生することを確認できると思います。

他にもプレイヤーの攻撃が敵キャラクターに当たった瞬間にプレイヤーの攻撃モーションがキャンセルされる問題も起きていると思いますが、これも原因は同じで敵に攻撃が当たった瞬間にキャストが消滅しているため、その後のキャストイベントが実行されていないことに起因しています。

せっかくなので、自分でその問題を直せるかどうか挑戦してみて下さい。直し方としては消滅条件を弄るか、現状のキャストをモーション用のイベントと攻撃判定用のイベントの2つに分割する等の方法が考えられますね。

後は敵が最後の一撃を与えた際にダメージモーション等をせずに突然消えてしまう点もバグではないですが、ゲームとして遊んでいる人には違和感を与える事象です。

今後もこのような問題(潜在的なバグ)はゲーム制作をするうえで頻繁に発生しますので、その都度自分なりに調べて、仮説を立て、修正をして、検証を行うことで丁寧につぶしていく必要があります。

そういった行動を適切に取れるかどうかがゲーム制作やプログラミングに適性がある人とそうでない人との明確な差になりますので、本気でゲームを作りたいと考えているならば積極的に挑戦していってもらえると良いかと思います。

まとめ

今回はBakinでプレイヤーと敵キャラクターがそれぞれ攻撃を受けた際のダメージ処理について解説しました。

前回の記事までと合わせて、これでゴブリンを複数マップに配置すれば最低限アクションゲームとして成り立つレベルになっていると思います。

もちろん、このままではゲームとしては遊んでくれる人はほぼ居ないので、更に追加のアクションやゲーム設定、様々な敵等を追加する必要があります。

今後もそういった追加する要素について解説していきたいと思いますので、興味があれば閲覧ください。

Canvaで簡単にマンガを作る方法 AIイラストで誰でもマンガ家になれる時代! – センコの活動記録 (senkohome.com)

コメント

タイトルとURLをコピーしました