GDevelopで簡単なゲームを作ろう・19 ~敵のランダム出現と数の表示~

アイキャッチ GDevelop


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


GDevelopで簡単なゲームを作ろう企画。
前回「GDevelopで簡単なゲームを作ろう・18 ~Timedeltaの話と攻撃前の予兆について~ 」では、端末ごとに動きに差が出るトラブルを防ぐために使えるTimedeltaのお話と、敵の攻撃に追加要素をつけるお話をいたしました。
スプライトの色合いを変える話なども併せてしておりますね。


今回は敵の数に関してのお話をしてまいりましょう。


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





前とバージョンは同じはずなんですが、なんかシーン編集画面でホイールで拡大縮小をしているとどんどんゲーム画面の枠の位置がズレていくんですよね…?
一時的なバグなのか。(プレビューは特に異常なく使えるので、とりあえずこれで進めます)





ゲーム開始時に敵を複数作る

ゲーム部分を一通り作り上げてゲームが遊べるわけですが。
現状は敵をそれぞれ自分で画面に設置して遊んでおりますよね。
この方法でたくさん敵を置いていってもよいのですが、これだと敵の配置が毎回まったく同じとなります。
いわゆるスクロール型シューティングゲームなどでパターンを作って遊ぶ形式のゲームならこれでもよいと思いますが、今回のようなタイプのゲームであれば敵はあらゆる所から襲ってきた方がゲーム性がスリリングになるのではないかなと。

というわけで、今回はゲーム開始時に複数の敵をフィールド上にランダムに置くように開発してみます。





まずはいつもの前準備。
シーン変数に新しく「enemy_first_appear」という変数を追加します。
今回は敵をスケルトンとカボチャの2種類作りました。これらをそれぞれ最初に何体出すか?を決める変数としております。
今回は「5」で進めますね。




そしてこれは必須ではありませんが、Playerの位置が左上だと遊びづらいなと感じますので、Playerをフィールドの真ん中に移動しておきました。


前準備はこの程度でよいでしょう。





では、ここからイベントを作っていきます。

今回は敵に関するイベントですので、イベントグループ「敵」の一番下に新規イベントを作成していきます。
まずはゲームシーンがスタートした直後に敵を配置してほしいので、条件を「シーンが始まった」で付けておきましょうか。




そして右クリックして「指定回数繰り返しを追加」で回数指定できるイベントを作ります。
これをサブイベントとしてくっつけ、回数は先の変数「enemy_first_appear」としましょう。
先ほどこれを「5」としましたので、アクション部分にスケルトンとカボチャを生成するイベントを入れてやれば、スケルトンとカボチャが5体ずつ登場するようになります。




さて、先に必要な画像のサイズを再確認しておきましょう。


・Grass4(フィールドの画像です) … 2560 x 1440
・スケルトン … 120 x 180
・カボチャ … 160 x 170



となっております。



そしてスケルトンとカボチャのポイント・Originはどちらも何も変更していないため、X位置・Y位置ともに初期値の「0,0」となっております(絵の左上の方にある赤い点ですね)。
オブジェクト生成をしたとき、このOriginを基準にオブジェクトが出てまいりますので、併せて確認をしておきました。




それでは敵の生成アクションを作るのですが、敵がどの座標に出てくればよいのか?を指定するためにちょいとだけ計算をしておきましょう。
スケルトン・カボチャともにOriginが0,0ですので、Xの最小値・Yの最小値は0としておけば、敵がスタート時に画面左端と上端からはみ出すことはなくなります。

そしてまず右端ですが、最大値をフィールド横サイズの「2560」としてしまうと、最大値付近になった場合に絵が右側にはみ出してしまいます。
ですので、

・右端はフィールドの横サイズ「2560」から絵のサイズ(スケルトンは120、カボチャは160)を引く。
・下端は同じように縦サイズ「1440」からスケルトンは180、カボチャは170を引く。


としてやれば、フィールド内に敵が収まるようになりますね。


(厳密に言えばカボチャの場合は回転移動しているので、移動も含めてフィールド内に収めたい場合は円の半径とかも盛り込んで考える必要があるわけですが、その辺は考えたくないのでざっくりやっていきますね)




アクションにてスケルトンを選択し、「オブジェクトを生成」を選びます。
ここの座標指定にて、数式ツールで「数学的ツール」の中にある「指定範囲内でランダムな整数」を選びましょう。
これを選ぶと新たに最小値と最大値を入力するウインドウが開きます。
今選んでいるのはスケルトンのX座標ですので、ここで最小値は「0」、最大値は(2560から120を引いた)「2440」を入れました。

Y座標も同じように設定し、カボチャの分も同じように作りましょう。





完成するとこのようになりますね。



だが。



書いてから気づいたのですが、




こう書いた方が明らかにいいですね。


以前もご紹介した覚えがございますが(過去記事「GDevelopで簡単なゲームを作ろう・10 ~カメラの視点変更とプレイヤーの移動制限~ 」)、Widthでオブジェクトの幅、Heightでオブジェクトの高さを指定できます。
これでGrass4からオブジェクトの幅(高さ)を引いた数として計算してもらいましょう。
こうすれば仮に後にオブジェクトのサイズを変更しても問題ございません。
思った以上にこれまでちゃんと話してるんだねワタシね。



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





敵の位置がPlayerに被っちゃったりしてますが、目的通りちゃんと敵が複数バラバラに登場しております!



……というのはよいのですが。
ご覧になってお気づきかと思われますが、ショットを撃つ敵があまりにも少ないです。
正しく言うとスケルトンとカボチャ、それぞれ一体ずつしかショットを撃っておりません。ガッデム!!
ここはどうにか修正せねばなりません。


先の動画を見るに、ショットの発射イベントが一体にしか適用されていないように見えますね。
しかしここは問題の部分を確定させるため、しっかりデバッカーで確認していくのがよいでしょう。
デバッカーはプレビューの右側にあるプルダウンから「プレビューとデバッカーを開始」でスタートできますね。(詳しくは過去記事「GDevelopで簡単なゲームを作ろう・12 ~敵の作成(2・カボチャの回転移動)~」を参照)


インスペクターにオブジェクトの一覧がズラッと揃っております。
ここから敵のショットについて確認していきましょう。
スケルトンのショットはCleaverという包丁ですが、確認しますとこのオブジェクトには(5)という数字がついております。
つまり、ショットはちゃんと5個出ているのです。


では、Cleaverをクリックして一つ一つの詳細を確認してみましょう。




コチラが#25、一つめのショット。



コチラは#26、2つめのショットです。



全部同じじゃないですか!?




そうなのです。
ショットはちゃんとスケルトンの数だけ発射されているのですが、そのショットは全て同じスケルトンから発射されているのですね。
全てピッタリ重なっているので1つしか出ていないように見えてしまうのです。





こういった事実からおかしい部分を推測してまいりましょう。
(わかりやすいように敵のショット発射の関数を貼っておきます。)


・ショットは問題なく発射されているので、大元のショット発射イベントに大きな問題はなさそう。
・問題になっているのはショットの位置の部分。
・ここで「Enemy」として指定してあるが、これだけだとGDevelopの側がどのEnemyなのかわからないのではないか?



という推測が成り立ちますね。
では、「それぞれの敵の場所から」と指定するにはどうすればよいか?
こういう場合に使えるのは「インスタンスごとに繰り返し」です。カボチャが回転軸を作る際に触れておりますね。(詳しくはこれまた過去記事「GDevelopで簡単なゲームを作ろう・12 ~敵の作成(2・カボチャの回転移動)~」を参照)





イベント編集画面にて右クリックから「追加」→「インスタンスごとに繰り返しを追加」。
それぞれの敵オブジェクトを選んだ上で、その子としてショット発射イベントをぶら下げてやりましょう。
(ショット発射の関数「EnemyShot_action」の中で同じように「インスタンスごとに繰り返し」を使ってみたのですが変化がありませんでしたので、イベント編集画面でやってみてください。)





これで全ての敵がショットを発射してくるようになりました!



…なのですが。
敵のショット発射間隔はタイマーで管理しておりますが、発射する秒数は常に変数で定めた一定の値です。
ですので同じ種類の敵は全部同じタイミングで一斉にショットを発射してくるんですよね。
敢えてこういう仕様にするのもよいのですが、少しタイミングがズレている方が面白いんでないかなとワタシは感じました。


ので。





敵を生成するイベントの下に、全ての敵の変数shot_timeをランダムに増減させるイベントを追加してみました。

先ほどは敵の位置を決める際に「指定範囲内でランダムな整数」というものを使いましたが、コチラでは「指定範囲内でランダムな浮動小数点数」というものを使い、範囲は「-1から1の間」としました。
「ランダムな整数」だとこの範囲だと「-1」「0」「1」の3パターンしか変化ができない(はず)ですが、コチラであれば小数点以下の数も含めて細かい変化を与えてやることができます。






こうしてやることで、敵のショットタイミングにそれぞれ変化をつけることができました!
この方法だと「ショット間隔の早い個体」「遅い個体」が分かれてしまうのであまり良い方法ではないかもしれませんが、それを見極めるのもゲーム性!と割り切るのもアリだということにしておきましょう。
ゲーム開発は  自由だ!!!

(この仕様がイヤな場合は、たとえば敵がショットを発射した瞬間にshot_timeを範囲内のランダムな数に毎回変更する、などもよいかもしれません。)





敵の残り数を表示

というわけで敵がわんさか出てくるゲームにできたのですが。
ここでひとつ考えておきましょう。

我々は出てくる敵の数を知っておりますが、ユーザーの方は最初にどれだけ敵が出てきているのか?そして今現在の敵はどれだけいるのか?がわからないため、先が見えなくて大変ですよね。
このゲームの場合は「全ての敵を倒す」ことがクリアの条件ですので、非常に大切な要素です。


ですので画面に「残りの敵の数」はしっかり表示しておいた方がよいでしょう。




まずは敵の数を表示するためのテキストを用意しましょう。
「EnemyCount」という名前のテキストを作成し、サイズを60にしました。
今回もイベントでテキストを変更するのでここは何も変えなくて大丈夫です。




そしてUIレイヤーにこのEnemyCountを置いておきましょう。
左上にずっと表示されるようにします。




そしてイベント編集画面で新規イベントを作成。敵に関する部分ですのでコチラもイベントグループ「敵」の一番下に追加しました。
敵の数は常に表示してほしいので条件は何もなし。アクションに「EnemyCount」の「テキスト」を選びます。


ここでどういうテキストにするかなのですが、今回はちょっとしたテクニックを使いましょう。
普通のテキスト(文字列)と数式ツールから選んだ式は、普通に並べてもエラーが出て併用できません。
しかしこの2つを”+”で繋げてやることで、「状況によって変化するテキスト」と「変化しないテキスト」を1つのテキストオブジェクトで表現することができるのです。


したがって、今回は「”Enemy “」という文字列と、「シーン上のEnemygroupの数」という文字列をくっつけて書いてみましょう。






こうなりました。
ではプレビューしましょう。





左上の表示値は初期値がスケルトンとカボチャが5体ずつなので10。
スケルトンを一体倒した瞬間に9になっており、ちゃんと実装できていますね!





まとめ

・ランダム要素を適度に取り入れてゲームに変化を与えよう!

・デバッカーでデータを集めて問題を特定していこう!

今回は敵の登場についての要素を増やして、よりゲームっぽくするお話をいたしました。
キッチリとした詰め将棋のようなゲームをお考えでしたら極力ランダム要素というものは排除した方がよいでしょう。
しかし基本的にはゲームを遊ぶたびにちょっとした変化を与えるためにランダム要素を適度に取り入れると、よりゲームがスパイシーとなること請け合いです。
ランダム要素があまりにも強すぎるといわゆる「じゃんけん」のような、運要素が強くてスキルを磨く必要性を感じなくなるゲームになってしまう可能性があるので、このあたりの塩梅はテストプレイで確かめてまいりましょうね。


そして今回の例のように、デバッカーは目に見えない要素も教えてくれる心の友。
困ったときはとりあえず関連する部分をコイツでチェックしてみましょう。

次記事→GDevelopで簡単なゲームを作ろう・20 ~当たり判定の変更とライフ表示~

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




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

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

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

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

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

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

コメント

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