GDevelopで簡単なゲームを作ろう・13 ~敵の作成(3・敵の攻撃イベントを関数にする)~

アイキャッチ GDevelop


こんばんは。
ピクセルアニメクリエイターのおかか容疑者でございます。


GDevelopで簡単なゲームを作る企画。
前回「GDevelopで簡単なゲームを作ろう・12 ~敵の作成(2・カボチャの回転移動)」では、敵であるカボチャの移動を少々難易度の高い「回転移動」として作成してみました。
併せて「デバッガー」や「変数の種類」といった重要な情報も語っておりますので、回転移動に興味のない場合でも必見の内容となってしまいました。


今回はカボチャの攻撃処理を作っていきましょう。
これで敵の作成に関する部分が終わりとなるはず。張り切っていきましょう!


※GDevelopのバージョンは5.3.198です。





関数を使おう

関数とは

カボチャの攻撃方法ですが、スケルトンと同様に「タイマーが一定時間になったらプレイヤーに向けてショットを放つ」というものにしております。
ですので、スケルトンのショット発射イベントをコピペして、スケルトンの部分をカボチャに、包丁の部分を木箱に変えていけば完成です。
変数も敵・ショットともに共通の名前で作っているので問題ありません。今回は短くてイイですね!



しかし、考えてみていただきたいのです。



これから敵をいっぱい増やしたいとき、一個一個全部こうやって作っていくの…?




敵を全部で100体作るとしましょう。
このように最初の攻撃イベントを作り、コピペを99回繰り返して値を全て変更していけば100体分の攻撃イベントが作れますね。

作るだけならまだしも、もし後から



あ、ここの処理を変えないとゲームに支障が出るな……

という部分が見つかったとしたら。
また100体分のイベントを変更する羽目になりますね。
文字を変えるくらいなら置換という方法がございますが、新しく条件やアクションを追加する場合はコピペであれ一個一個の手直しが必要です。



普通にイヤでしょ?



そのような地獄を防いでくれるために、プログラミングには優秀な機能が備わっております。
それが今回お話ししたい「関数」なのです。





語弊があるかと思いますが、あえて言わせていただくと関数は「変数の「イベント」バージョン」だと考えてみてください。


今回の場合でお話ししましょう。
敵は2種類で、それぞれ撃ってくるショットが異なります。
ですが先ほども申しましたように、「タイマーが一定時間になったらプレイヤーに向けてショットを放つ」という部分は共通しているわけです。
この「共通している部分」をパッケージングできたら楽だと思いませんか?
そのパッケージングを担ってくれるのが関数、というイメージです。


この共通している部分内であれば、たとえ敵を100体作ろうが1000体作ろうが、その関数内のイベントを変更してやれば全員分の仕様を一括で変更することができます。
また、全員同じ関数に基づいて動いているのでヌケモレも発生しません。
このあたりの話は「変数」と通ずるので、ワタシは「変数の「イベント」バージョン」みたいな認識を持っているわけです。


ということで、今回はスケルトンとカボチャの攻撃イベントを関数にして2体の攻撃イベントを実装していきます。




関数の作成

まずは下準備から。
カボチャもスケルトンと同様、ショットを撃つまでの時間となる「shot_time」の変数を作っておきましょう。
値は少し大きめの「2.5」にしました。





そして、以前作ったシーン開始時のイベントがスケルトンのみの指定になっているので、コチラを「Enemygroup」のタイマーにしてカボチャも対象になるようにします。


これで下準備は完了。
では、関数を作成していきましょうか。
画面左上にある「プロジェクトマネージャー」(四角が3つ並んでるアイコン)を押してください。




関数は「拡張機能」というものに分類されます。

右にある+ボタンを押すと新しい拡張機能を追加できます。





拡張機能追加のウインドウが出てきました。

ここにある機能をプロジェクトに追加していくとゲーム開発の手助けになること間違いなし!
たとえばこの「With Three JS」という拡張機能はゲームを3D化することができましてね…!




……違うわ。
関数の解説でしたね。(拡張機能の話もどこかでしたいな)

新しく関数を作るときは、下にある「新しい拡張機能を作る」を選びましょう。




新しい拡張機能が追加されます。(関数はこの中に作られます。)
名前もつけられますので、今回は「EnemyShot_action」としておきますね。

では、この拡張機能をダブルクリックしてみましょう。




関数(拡張機能)を作成する画面が新しく開かれます。
左に「ビヘイビア」と「関数」の2つの列が並んでおりますね。ようやく関数の文字が出てきました。

では、「関数」の右にある+ボタンを押してください。






ウインドウが開き、「どの関数を作るか?」を聞かれます。
イベント編集画面で「条件」と「アクション」はさんざん使ってきておりますので、意味合いはアナタもよくおわかりだと思います。作った関数を条件の欄につけられるようにするかアクションの欄につけられるようにするか、という質問ですね。
(「式」も作れるとのことですが、ワタシは作ったことがないので割愛します)

今回は「条件」を選びましょう。
関数の名前も決められますので、「shot_zyouken」としました。




実は「条件」で作成して、その関数の中でアクションまで作成することが可能です。(アクションから条件を決めるのも可能)
今回は条件とアクションを一体にした方がわかりやすそうなので、この「条件」の中でアクションも含め完結するようにしますね。

分けた方が都合がいい場合もあるでしょうから、そのあたりは適宜使い分けましょう。




右側に新たなウインドウが出てきました。

下の「条件を追加」の部分を見てみます。
まずはここに元のショット発射イベントをコピーして貼り付けましょう。
そして、最初に作られている「条件の戻り値を~~」というイベントは不要なので、イベントごと削除します。



波線が引かれてエラーになっておりますが、とりあえず気にしないでください。


では関数の作成に取り掛かっていきましょうか。
作る場合、まず最初に「パラメーター」を設定しておくとわかりやすいです。
「パラメーター」というのは「関数の中で使える、いろんな要素を入れられる箱みたいなもの」だと思ってください。

……どこかで聞いたことがありますね?

そう、つまり「パラメーター」は「この関数だけで使える変数」だと考えてもらえればよいでしょう。
パラメーターの「名前」や「何を入れるか?の型」を指定してあげると、イベント作成した際にパラメーターの部分にその都度適した物を入れて使うことができます。

話だけだと分かりづらいので、とりあえず先に進めましょう。




では、この貼り付けたイベントで波線が引かれている部分をチェックして、必要な要素を挙げていってみます。
これを見ていくと、今回必要な要素は


・敵(スプライト)
・shot_time(数値)
・ショット(スプライト)
・敵のX座標(数値)
・敵のY座標(数値)
・敵とPlayerとの角度(数値)



以上となりそうです。これらをパラメーターで作っていきましょう。

「パラメーター」のタブを押してみてください。





パラメーター作成画面に移りました。
最初は何もないので、新しく作るため「パラメーターを追加」を押します。




新たにパラメーターが追加されます。
ここで「名前」と「タイプ(物によっては「オブジェクトタイプ」のような追加の要素も決める)」、「ラベル」を入力していきます。


「名前」はこの後でイベントを修正する際に実際に入力することになります。わかりやすい名前にしましょうね。


「タイプ」は実は先ほど要素を挙げた際、後ろにカッコ書きで書いておきました。
今回使用するのは「スプライト(オブジェクト)」と「数値」だけですね。
変数を使用するものもございますが、関数ではオブジェクト変数を指定することができません(シーン変数とかはできます)。
なのでここでは「数値」を選びましょう。




「オブジェクトタイプ」は「任意のオブジェクト」でも機能しますが、自由度の高いプログラムはバグを生み出す元になりやすいので、厳密にタイプを指定しておくことをお勧めします。




必要な要素をパラメーターとして作成してみました。
(パラメーター#4~6の名前は元のイベントから該当する部分をコピペして、Skeletonの部分をEnemyに変えただけです。
名前にドットやカッコなどが使えないため、アンダーバーに置き換えられております。)





「ラベル」に書いた文章は実際にイベント編集をする際、書き込む欄に表示される文となります(青四角の部分)。
書かなくても使えますが、書いてないと何を入れたらいいのかわからなくなる可能性が高いので、わかりやすい文を添えておきましょう。



パラメーターが作れたら、先ほど貼り付けたスケルトンのショット発射条件に少し手を加えましょう。

・「Skeleton」の部分を「Enemy」に
・「Skeleton.shot_time」の部分を「shot_time」に
・「Cleaver」の部分を「Shot」に
・「Skeleton.CenterX()」の部分を「Enemy_CenterX__」に
・「Skeleton.CenterY()」の部分を「Enemy_CenterY__」に
・「Skeleton.AngleToObject(Player)」の部分を「Enemy_AngleToObject_Player_」に



変更してみてください。




エラー表示が消えました!


このように、関数の場合はここで作成したパラメーターを使って条件やアクションを書く必要がございます。
先ほども申しましたように残念ながらオブジェクト変数をパラメーターに指定することはできませんが、今回の変数「kakudo」のように直接名前を書いて指定するということは可能です。
柔軟性は欠けますがそこは割り切って使っていきましょう。


それでは「設定」タブを押し、設定画面へ戻ります。




設定画面では、これら3つの部分を書いていく必要がございます。
欄をクリックすると例文が表示されますので、それを元に書いていきましょう。
(ワタシは上の2つは同じ文章にしています)


最後の「イベントシート内の文章」というものが、実際にイベント編集画面で表示される文章となります。
これは「_PARAM◯_」という書き方をすることで、編集画面で簡単に要素だけ変更できるようになります。
常に同じものを参照するパラメーターは一度作った関数のイベントをコピペすればよいだけなので、よく変更するパラメーターについては書いておくのがお勧めです。
(今回の場合は例えば「_PARAM1_」は「パラメーター#1」である「Enemy」、「_PARAM2_」は「パラメーター#2」である「shot_time」になりますね。)





ワタシはこう書きました。
イベントシート内の文章はとりあえず全部「_PARAM◯_」表記でパラメーターを入れてみました。





「_PARAM◯_」表記を入れないとこういうメッセージが出てきますが、別に入れなくても問題なく動いてくれます。この辺はお好みで。

これで関数を作成することができました!




このあたりは使ったことがないのですが、実際のイベントから直接関数を作成することもできるので、一応お話ししておきますね。




実際に作成したいイベントを選択し、右クリックで「置換」→「イベントから関数を作成する」を選びます。




するとこういったウインドウが出てきますので、必要事項を書いていくと関数が作れるようです。


かなり便利そうなのですが、イベントで使ったオブジェクトによってパラメーターの設定が固定化されており、パラメーターの名前を変えたりできなくて正直よくわからなかったので、紹介だけに留めておきますね。




関数をイベントで使う

それでは、完成した関数をさっそく使ってみましょう。
まずはスケルトンのショット発射イベントを関数で作ってみます。



まずはイベント編集画面に移り、新しいイベントを作ります。

どこに入っているかと言うと、作った関数は「条件」のため、「条件を追加」を選びます。
そしてスケルトンを選びますと、一番上の項目に「敵がショットを発射する」という項目が追加されています。
これは「エディターに表示される名前」と同じ文章ですね。このように関数を選択することができるのです。



で。
何やら入力する項目がいっぱい出てきております。
ちょっとビックリしますが、これも該当する値を設定していけばいいだけです。
関数のパラメーター作成のとき、名前とラベルは元イベントのものをコピペして作っております。
ですので何を入れればよいのかは比較的わかりやすいのではないかと。





実際に入力してみるとこうなります。
「Shot」の部分だけは実際に発射するオブジェクトを選び、他の項目は「Skeleton.◯◯(ラベルを元に判断)」となりますね。


※以前使ってたときと仕様が若干異なっているようですが、最初にスケルトンを選んだ時点でパラメーター#1の部分はスケルトンに勝手に設定されてくれるようです。
(以前はこのようにオブジェクトから選ぶ形でなく、「その他の条件」に関数があって、全てのパラメーターを指定していました)
試しに他のオブジェクトでこの関数を選んでみると、その選んだオブジェクトがパラメーター#1に使われるのを確認しました。




今回のスケルトンのショット発射イベントはこのように表示されます。
「条件」の欄しか表示がありませんが、しっかりアクションまでなされるようになっておりますのでご安心を。

以前作ったスケルトンのイベントは不要となるので削除していただいて大丈夫です。




そしてこれをコピペし、カボチャの方も作ってみます。
「Skeleton」「JackOLantern2」に、「Cleaver」「Crate」に変えるだけです。カンタン!

これでプレビューしてみましょう。





ちゃんと2体ともショットを放つようになりました!


いやあ、これで以前定義した、


・敵は全て一定時間ごとにショットを撃ってPlayerを攻撃する。
・スケルトン … Playerに向かってゆっくり近づいてくる。体力は低い。
・カボチャ … 同じ場所でグルグルと回っている。スケルトンより体力が高い。



は全て実装できましたn………



………体力……?





………待て次回!!!





まとめ

・同じような処理は「関数」で使い回そう!

今回は関数特化の内容となりましたね。まとめではこれ以外に言うことがないな。
このゲームでの話ではあまり便利さが伝わらなかったかもしれませんが、これも変数と同じくゲームの規模が大きくなるにつれてどんどん有難みが増えていくモノです。

関数を別の関数で使ったりもできるようですので、似た要素が複数作られたらそれを関数にしてしまって修正をカンタンにできる作り方がベストなのかなぁとは思います。
とはいえそれなりに複雑な機能ではありますので、最初は使わなくとも良いでしょう。
必要を感じたら関数のこと、時々でいいから、思い出してあげてください。


次記事→GDevelopで簡単なゲームを作ろう・14 ~ショットのヒット処理を作る~

GDevelopで簡単なゲームを作ろう企画まとめへ




さて…そろそろお時間です。
またのご面会、心よりお待ちしております。

この記事がお気に召したなら、

ギャラリーからワタシの作品を見ていただいたり、

Misskeyアカウント(@daidaimyou)
Caraアカウント
X(旧Twitter)アカウント(低浮上)(@daidaimyou)

をフォローいただけますと脱獄の励みになります。よろしくお願いいたします。

ドット絵(一枚絵・アニメーション)制作のお仕事も承っております。
お仕事依頼ページよりご連絡くださいませ。(現在受付停止中)

コメント

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