PR
↑ここからAmazonで買い物してくれると更新頑張れますww
CF2.5 1章5節・敵の弾の発射・プレイヤーとの当たり判定
さて、プレイヤーから敵への弾と当たり判定は出来るようになりました。
続いて敵が弾を出すようにして、それをプレイヤーが当たるようにしていきましょう。
出し方やプレイヤーと弾との当たり判定自体は前節とほぼ同じような感じで作ればOKですが、
敵の弾の発射において、プレイヤーと違う点はボタンを押して発射ではなく
何かのタイミングで勝手に発射される、という部分です。
弾は続いて同じのを使えばいいと思います。見た目が同じだと混乱するーという方は色を変えた画像を
用意してもいいでしょう。
例によって前回までのプロジェクトを開き、アクティブオブジェクトとしてこの弾を適当な場所に配置しましょう。
透明色の設定まで一気に済ませてしまいましょう。
味方の弾と全部同じ設定でOKです。ついでに敵画像のアクティブオブジェクトの名前をそれぞれ
"エネミー1,2,3"に敵弾の名前を"敵弾"とそれぞれ付け直しておくと便利です。
では敵が弾を出す処理を作りましょう。
エネミー1のオブジェクトイベントを新規で作成します。エネミー1をクリックして、イベントの「新規作成」ボタンを
押します。新しいイベント名はわかりやすく「発射」とでも付ければOKです。(自分でわかればOKです)
名前をつけたら、右の空欄部分をクリックすると編集ボタンが出るのでそれを押します。
図1
エネミー1のイベントリストが開いたら、まず敵弾を参照できるようにしてから
(覚えてますか?オブジェクトが並んでる一番右のボタンをクリックして、敵弾をインポートです)
新しい条件から「タイマー」を選び「一定間隔」を選択します。
そこでエネミー1が弾を発射したい基本間隔を選びます。
「タイマー」イベントの「一定間隔」の設定項目は以下の通りです。
図2
・時間…◯◯時間ごとに
・分…◯◯分ごとに
・秒…◯◯秒ごとに
・1/100…◯◯/100秒ごとに
それぞれの合計の時間の間隔でイベントを発生させます。
「計算を使う」を使うと「計算結果/1000秒」ごとにイベントが発生します。
好きな間隔を設定したら、エネミー1に「オブジェクトを発射」イベントを設定し、前節と同じような感じで
敵弾を設定、発射方向を下にします。
そこまで出来たら、一度実行してみましょう。
・実行結果
エネミー1全部から等間隔で発射されてる(゚д゚)!
ええ、そうですね、一定間隔でしか設定してないですから当然そうなっちゃいますね。
ではこれから少しランダム性を持たせましょう。
そして、ここからが特に今までゲーム作りに触れたことのない人にとっての大きな鬼門となる。
変数、通し番号、高速ループという非常に言葉だけで吐き気を
覚えるような訳わからん単語を使うことになります。
でも大丈夫、1個ずつ分解して見ていきましょう。
・変数
変数ってのはなんじゃらほい?っていう人。難しく考えないで下さい。
プログラムやCF2.5における製作ツール系において変数というのは、
「数をしまっておける箱」という風に覚えていましょう。
2とか3とかいう数を入れておいて、それを何時でも見ることが出来る、という物です。
例えば3という数字を入れておき、プレイヤーが攻撃を受けると1減らす。
数字が0になったらプレイヤーが倒れる、といった使い方。
わかりますよね、「HP」の仕組みがまさにこれになります。
このように変数が使えるようになると色々出来る枠が広がりますので
色々と試してみてください(*`・ω・´)
ではエネミー1をクリックしてエネミー1に変数を作ります。
ここで作るのは攻撃の際のトリガーとなる「攻撃フラグ」
そしてどのエネミー1から弾が出るのかを判断する「通し番号」です。
図3
・通し番号
通し番号というのは、先ほど出てきた変数の中に、そのオブジェクトを独自の物だと
認識するための数字を入れることです。
インベーダーや、シューティング、アクションなどといったゲームだと
同じ形の敵を大量に出すことになります。
これに対して1個1個個別にイベントを組むと大変なので
クローンを作成して一括して~という手法をよく取るのですが、普通にイベントリストで変数を入れてしまうと
「同じやつがいっぱいいるけど、どいつの変数を変更していいのかわからないから、とりあえず全部変更するよ」
とCF2.5が勝手に判断し、全ての同一オブジェクトの変数が変更されます。
これを回避するには、CF2.5に「いっぱいある同一オブジェクトのどれを処理するのか」を
わからせる必要があります。
前節でやったプレイヤーとの弾との当たり判定の場合、接触した同士のオブジェクトをCF2.5が
理解しているから当たった1つの敵だけが破壊されましたが、この発生条件を単なる「マウスのクリック」とかに
するとマウスをクリックしてもどの敵を破壊してもいいのかわからないのでとりあえず全部破壊するぜ!となって
全てのエネミー1が消えたりします。
そこで通し番号という番号を振ってあげることで「1番目の君が弾を出してね」という命令を出来るようにします。
CF2.5には、「通し番号」という同一オブジェクトに通し番号を振るための命令がありますので
それを行ってやれば今あるクローン全てに別々の番号が振られます。まあ、学校でいうところの
出席番号や学籍番号、職場でいう出勤IDみたいなものだと理解してくれればOKです。
・高速ループ
ただ通し番号を降っても、1個1個イベントを作成していては見た目が長くなりすぎて
管理がとても大変になります。
そこで「同じ処理を行う」場合はループ、つまり複数回一気にイベントを行うことで1回に済ませてしまおうというのが高速ループです。
高速ループは、まずループの名前とループする回数を決め、ループ実行中に付随条件を加えて色々な処理をしていきます。
弾の設定、発射なら名前を「弾設定1」とでもしてループ回数をループさせたいオブジェクトの数にし、
ループ実行中に、「現在何回目のループなのか」と「オブジェクトの通し番号」を比較して処理を行うことで
「個別のオブジェクトにそれぞれ同じような処理をさせる」ことを実現します。
変数はともかくとして、通し番号と高速ループを1度に全て覚えようとするとかなりきついと思うので
徐々に色々な方法を試して覚えていくといいでしょう。
それでもダメなら通し番号や高速ループを使わずに実装する方法を考えても全然構いません。
ゲーム制作、及びツール製作などに必要なのは、「可能な命令を組み合わせて、自分の希望の実行結果を出す方法を何通りも考えられる柔軟な思考」です。
これをアルゴリズムと言いますが、まあそれは頭の片隅に置く程度で。
さあ、一通りのざっくりとした説明を終えたところで実装です。
まずはエネミー1の発射イベントリストを開き、全て消します。
そして新しい条件に「フレームが開始」を設定し、エネミー1から変数→通し番号を選びます。
通し番号を入れる変数には先ほど作った「通し番号」を選びましょう。
入れる番号は0からでOKです。
これで作った最後のクローンから最初に作ったオリジナルまでに0~オブジェクトの個数分の数字が割り当てられます。(入れる番号を変えるとその数字から割り当てられます)
次に高速ループを設定します。
新しい条件に特別から「常に実行」を選びます。
読んで字のごとく、毎フレーム何があろうと常に実行されます。
そして、一番左の2つ歯車の形「高速ループ」→「ループを開始」選びます。
出てきたダイアログで最初にループの名前を設定します。
""ダブルクォーテーションの中にわかりやすい名前を付けてOKを押し、次にループ回数を設定します。
ここにエネミー1の数の総数を入れます。エネミー1は11体出てるはずなので11と入れればOKです。
ちなみにここも変数にすると拡張性が高くなりますが、とりあえず今は数値打ち込みで問題ありません。
これでループを開始する設定が出来ました。
続いてループ中の処理を作っていきます。
新しい条件に「特別」から「ループを実行中」を選び、ループ名に先ほど設定した名前を入れます。
続いて右クリックをして挿入を選び「フレームが開始」を選び、更に右クリックをして
「エネミー1」から「変数」→「変数の1つと比較」を選びます。
変数の値には「通し番号」を選びます。ここで通し番号のチェックを行うので、現在のループ回数が何番目かを
取得します。その方法は、「現在のオブジェクト」から「特別」→「高速ループ」→「ループインデックスを取得」を選びます。すると式が代入されるので、そこの「>ループ名を入力<」のところにループ名を入れます。
ループ名はダブルクォーテーション""で囲むのを忘れないようにしましょう。
条件部分はこうなるはずです。
必ず「”◯◯”がループ実行中」が一番上にくるようにしてください。
そういう決まりですので(*`・ω・´)
この条件だと、「フレームが開始した時かつループを実行中にループの回数とエネミー1の通し番号が合っていれば」イベントを実行します。
このイベントでエネミー1の変数「攻撃フラグ」を初期化します。
エネミー1の部分で右クリック→「変数」から「変更」です。
全て同じ値にしてしまうと、また同じタイミングで出るようになってしまうので、入れる数値をバラつかせます。
「範囲指定乱数」クリックして、入れたい数字の最小の数(まあ5くらい?)と最大の数(10くらいかな?)うを入れます。するとこの命令が実行された時に変数「攻撃フラグ」の中に5~10の数がランダムで入ります。
初期設定のイベントは終わったので、また新しい条件から
・ループ実行中
・エネミー1変数「通し番号」とループインデックスを比較
を条件にします。
更にこのイベントでそれぞれの間隔で弾を出したいので
・右クリック→「挿入」→「タイマー」→「一定間隔」でダイアログを出した後に「計算を使う」をクリックします。
そして「現在のオブジェクト」から「エネミー1」を選んで「値」から「変数AからM」を選びそこから
「攻撃フラグ」を選びます。A~Zは単純に作った変数順に並んでいるのでご参考までに。
そしてそれに500を掛けます。
こんな感じです。
さて、なぜ500を掛けたでしょうか?
計算式で間隔を図ると、1/1000秒単位で判定を行います。
攻撃フラグに設定した数を5と仮定すると5*500で2500が入ります。
感覚的には2.5秒になります。これを攻撃フラグのままだと5/1000秒で弾を発射してしまい
激鬼難易度のインベーダーになります。
そこで500を掛けてあげることによって、0.5秒単位での間隔管理を可能としています。
この500を1000にしてやれば1秒単位になりますし、200に設定すると0.2秒単位での管理が可能です。
これで条件は整いました。
あとはここに先ほどやった弾の発射処理(オブジェクトの発射)をしてやることで弾を発射するようになります。
また、ここでもう一度攻撃フラグの値にランダム数値を入れてあげることで、発射間隔も毎回少し変えることができます。
実行結果
あとは、同じことをエネミー2と3にもしてあげて、前節のような感じで敵の弾とプレイヤーが当たったときの
イベントを作ってあげれば完成です。
その部分はみなさんへの宿題ということで事細かには書きませんし、もう出来るはずです。
どうしても出来なかったら下のリンクから今回のプロジェクトを落としてどこが間違ってるのかを
見比べてみてください。ヒントとして、敵ごとにループの名前は変えてあげましょう。ということだけは
伝えておきます。
ではまた次回に!