こんばんは。
ピクセルアニメクリエイターのおかか容疑者でございます。
GDevelopで簡単なゲームを作ろう企画。
前回「GDevelopで簡単なゲームを作ろう・7 ~ショットの作成(4・ショットBを作成)~」では、先に完成したShotAを利用してShotBを作る方法をお話ししました。
オブジェクトグループや検索・置換機能を利用すると効率的にイベントを作っていくことができますね。
今回は前回の続き、ShotBを完成させるにあたり残る目的2つをクリアしていきましょう。
※GDevelopのバージョンは5.3.195になりました。
前回のあらすじ
ShotBが飛ばせるようにはなりました。
ですが、まだ完成には至っておりません。
・一度に3つ同時に発射する。1つはShotAと同じく進行方向に真っ直ぐ。残り2つはそれぞれ左右のナナメ30度方向に真っ直ぐ飛んでいく。
・速度は最初は速いが、徐々に速度が下がっていく。
この2つを実装して、ShotAとの差別化を図っていきます。
では、やっていきましょう。
3WAYショットの作成
では、最初に
・一度に3つ同時に発射する。1つはShotAと同じく進行方向に真っ直ぐ。残り2つはそれぞれ左右のナナメ30度方向に真っ直ぐ飛んでいく。
から着手してまいりましょう。
進む角度の違うショットを同時に3つ発射するものをよく3WAY(スリーウェイ)ショットと呼びます。
広範囲に攻撃できて見た目もカッコイイですね。
GDevelopでワタシが3WAYショットを作る場合。まずは必要な変数を準備しておきます。
Playerのオブジェクト変数にまた2つほど新たな変数を追加しますね。
「shotB_count」と「shotB_kakudo」という2つを追加します。
「shotB_count」は「ShotBを何回発射したか?」をカウントする変数。
「shotB_kakudo」は「どの角度にショットを発射するか?」を決める変数としております。
カウントは「0」のままにしておきましょう。
角度については、
・一度に3つ同時に発射する。1つはShotAと同じく進行方向に真っ直ぐ。残り2つはそれぞれ左右のナナメ30度方向に真っ直ぐ飛んでいく。
としましたので、これは「30(度)」でOKです。
では、イベント編集画面に移ります。
この辺はワタシの個人的なやり方ですが、イベントの条件がいろいろと複雑になってきている場合は、その都度「子イベント(GDevelopではサブイベントって言ってるみたいです)」を追加して段階的に管理する方がラクですので、この方法でやっていきますね。
まずはShotBの発射イベントに子イベントを追加します。
発射イベントをクリックして選択し、右クリック→「追加」→「サブイベントを追加」を選びましょう。
(ワタシは「環境設定」のショートカットでXキーに割り当てました。)
次に、同じように子イベントをクリックして選択したあと、右クリック→「追加」→「条件が真のあいだ繰り返しを追加」を選びます。
こういうイベントが追加されました。
ご覧いただければ何となくおわかりかと思いますが、これは「1つめの条件が達成されるまでずっと2つめのイベントが繰り返される」というイベントとなっております。
プログラミングだと「for文」って言われるやつですね。カッコイイねこういうの言えるとね。
これを使うと、今回の例で言えば「ShotBが3発出るまでShotBの発射を繰り返す」という処理ができるようになります。
ではまず「以下の条件が真のあいだ」部分の条件を指定しましょう。
ここで先ほど作ったカウント用の変数が役立ちます。
条件にPlayerの「数値の変数」を選び、変数を「shotB_count」に、記号は「<(より小さい)」、値を「3」にします。
ショットを3回撃つ、つまりshotB_countが「0、1、2」のときにイベントが発生してほしいので、この変数が「3より小さいとき」という条件にしております。3のときはイベントが起きません。
こうなりますね。
次に「これらを繰り返す」部分のイベントの作成です。
ここにも条件を追加できますが、繰り返しのイベントでここの条件を入れることはあまりないんじゃないかなと。
とりあえず今回はアクションだけで十分です。
アクションなのですが、ここでショットの発射を行うため、先に作ったShotBの発射アクションを全部コチラに移動してしまいます。
アクションをドラッグすればそのまま移動できますので、全部下に移してしまってください。
そして、Playerの変数を変更するアクションを追加します。
先ほど作った変数「shotB_count」の変数に1を足すアクションです。
これにより、ShotBを一回作るごとにカウントが1プラスされます。このカウントが3になるまでShotBを作り続けるよ、というわけですね。
ここはめちゃめちゃ大事な部分です。
このアクションを作っておかないと、ショットを発射したが最後、延々とショットを作り続けるイベントを繰り返し続けて画面がフリーズします。「無限ループ」ってやつですね。
(まあフリーズといっても文字通りゲーム画面が固まるだけで、PCが壊れるとかそういうアレではないので大丈夫です。)
「無限ループって怖くね?」とはよく言われますが、そりゃ怖いよ。ゲーム止まるんだもん。
で。
このままですと3発ショットは出ますが、全部同じ軌道ですので当然ながら3発全部重なって発射されます。
ショットが作られる場所はプレイヤーの位置でOKですので、進む方向(houkouの変数)をそれぞれ変えないといけないわけですね。
それで、どのように変えるかですが………
Player.houkou – Player.shotB_kakudo + (Player.shotB_kakudo * Player.shotB_count)
となります。
ああ大丈夫!ちゃんと解説しますからね!!!待って!!!
英語(変数)がいっぱい並んでてなかなか圧倒されますが、それぞれをちゃんと言葉に置き換えていけば意味がわかるかと思います。
まず、この式はこういう意味になっています。
これをもっとわかりやすくするため、実際に数字に置き換えてみましょう。
プレイヤーが右を向いている状態(0度)としますね。
「プレイヤーの方向」は上の条件から「0」。
「ショットの飛ぶ角度」はshotB_kakudoの数値になりますので「30」。
「ショットの発射カウント」は発射のたびに変わりますので「0~2」のいずれか。
となります。
これでだいぶわかるのではないかなと。
上の画像で解説しましょう。
今回の場合、まず一発目のショットを「上側のショット」にしています。
プレイヤーの向きからショットの角度分だけ減らしておりますので、ショットの角度は「-30」になります。
二発目のショットは「真ん中のショット」となります。
ショットの角度分を減らした後、同じ値をプラスしているので、結果的にプレイヤーの向きと同じ角度になります。
そのためショットの角度は「0」。
三発目のショットは「下側のショット」です。
ショットの角度分を減らした後にその2倍の値がプラスされます。つまりトータルとしてショットの角度の値一回分が多くなるわけです。
というわけでショットの角度は「30」になると。
プレイヤーの向きが変わっても、その向きの値を基準として使っているのでどの向きでも対応できる式となっております。
このように、ショットの回数をカウントする変数を作っておくと、その変数を組み合わせてオブジェクトごとに変化をつけることができるよ。というお話でした。
これもまたCF2.5で学んだ知識となります。ありがとうクリックチーム………!
この例で角度の値がマイナスになったりしていますが、GDevelopは角度を0~360度の中で指定しないといけない、というルールは無いようです。
要は「0度」でも「360度」でも「-360度」でも「720度」でも全部同じ「右」として認識してくれるみたいですね。
(何か不都合がある場合があるかもしれませんが、それはそのとき考えましょう!)
というわけで、このようなイベントが出来上がりました。
プレビューしてみましょう。
ちゃんと3WAYショットになっていますね!
どの角度でも問題なく発射されています。
ショットの速度を徐々に下げる
ではもう一つ。
・速度は最初は速いが、徐々に速度が下がっていく。
をクリアしていきましょう。
まず最初の速度を速くする必要がございます。
これはカンタンですね。ShotBの変数「speed」の値を増やすだけです。
試しに4000にしてみましょうか。
清々しいほどにショットがカッ飛んでいきますね。
で、何となくご想像どおりだと思いますが、この変数「speed」をイベントによって少しずつ減らしていけばいいわけです。
というわけで、ShotBに変数を追加します。
「どれくらいspeedを減らしていくか」という値ですね。
コチラを「speed_minus」として、値をとりあえず「400」にしておきます。
加えて、イベントも作っておきましょう。
今回の処理はShotBが画面に出ている時は常に速度が下がっていってほしいので、条件が書かれていないイベント(Shotgroupが移動や回転をするイベントがありましたね)のアクション欄に追加します。
ShotBの変数「speed」の数値を変更を選び、「speed_minus」の値を「-(引く)」ように作ります。
できました。カンタンですね。
ではプレビューです。
はい。速度が下がっt
あれぇ!?
なんかショットが逆走して反対側に飛んでいってますね。
考えれば当然なのですが、「speed」はどんどん「speed_minus」の分だけ減り続けるわけで、そのうち「speed」の値はマイナスになるんですよね。
ですのでこんな動きになります。
※ちなみにブーメランのように、発射したあとプレイヤーの元に戻ってくるタイプのショットを作りたい場合は、この方法が使えますね。
今回はショットは戻ってきてほしくないため、何かしら手を打つ必要がございますな。
対策はいろいろとありますのでお好きな方法でやりましょう。
・「speed」と「speed_minus」の値を変更しながらテストして、いい感じの動きで収まる値を見つける。
・「hakai」の値を減らして、戻って来る前にショットが削除されるようにする。
・「speed」の値が正の数のときだけ速度がマイナスされるようにイベントを組む。
など。
今回は3つめの方法を取ることにしましょう。
新しいイベントを作ります。
条件を「ShotBの「speed」が0より大きいとき」で指定しましょう。
そして、この新しいイベントに先の「speed」を減らすアクションを移動します。
これで、speedが正の数のときだけ減っていくように組めました。
ついでなのですが、もしも最後にspeedの値をマイナスしたときにspeedの値が負の数になってしまうと結局逆走してしまうので、それを防ぐためのイベントも追加しました。
条件に「speedが0より小さいとき」、アクションに「speedを0にする」というイベントです。
これがあれば後にspeedの値を修正したいとき、変な動き(逆走)になる可能性をほぼゼロにすることができます。セットで付けておくと安心です。
これでプレビューしてみるとこんな感じに。
これだけだと少々ぎこちないですが、だいたい理想通りの動きになりましたね。
気になる場合は使用している値を変えながらいい感じに仕上げていきましょう。ワタシはめんどいので今回はそこまでやりません!
まとめ
・繰り返し処理でより効率的にイベントを作ろう!
・無限ループにはご注意を!
・加速や減速で動き方に変化をつけよう!
今回はShotAから変化をつけたShotBの完成まで漕ぎ着けることができました。
長かったですがこれにてショット編・完結です。お疲れ様でした!
今回はやや難しい話になったかもしれませんが、意味合いさえわかればきっと今後の開発でもいろんな部分で役立つかと思います。
2種類のショットを撃てるようになってかなりゲームらしくなってきたのでは無いでしょうか。
しかしまだまだ作るものはたくさんございます。引き続き少しずつ作っていきましょうか。
次記事→「GDevelopで簡単なゲームを作ろう・9 ~背景の作成~」
さて…そろそろお時間です。
またのご面会、心よりお待ちしております。
この記事がお気に召したなら、
◎ギャラリーからワタシの作品を見ていただいたり、
☆Misskeyアカウント(@daidaimyou)
☆Caraアカウント
☆X(旧Twitter)アカウント(低浮上)(@daidaimyou)
をフォローいただけますと脱獄の励みになります。よろしくお願いいたします。
ドット絵(一枚絵・アニメーション)制作のお仕事も承っております。
お仕事依頼ページよりご連絡くださいませ。(現在受付停止中)
コメント