縦スクロールシューティング14

サンプルの解説:弾の発射イベント2

前回からの続き

プレイヤーが撃つ弾(ショット)は何種類かあって、参考にした「魔城伝説」だと5種類くらいあります。弓矢、ダブル弓矢、ファイヤーアロー?、ブーメラン・・あと忘れました
ちなみに忠実にパクらなかったので、サンプルはほぼオリジナルな武器仕様となってます。

サンプルも複数の武器を用意する予定だったのですが、紆余曲折した結果特性の異なる二種類しか武器が付いてません。一つは通常弾と呼ばれる普通の弾で、標準装備の武器です。パワーアップアイテムを取ることでこの装備も他の装備も3段階までパワーアップします。特に標準装備は最初に作ったのでパワーアップ内容も見た目でわかりやすいです。その代わりこちらは貫通しません。
サンプルでは武器選択アイテムを取ると標準装備以外に貫通弾を選択することができます。こちらは敵を貫通してダメージを与えること自体が結構凶悪な武器だったので、武器の性能を落とすために最初は射程有効範囲を狭く、弾の発射速度も遅くしました。パワーアップアイテムを取ることで有効射程距離や弾の速度、敵に与えるダメージなどがドンガドンガ上がって行きます。
武器選択とパワーアップ

武器選択とパワーアップ


標準装備のパワーアップ

標準装備のパワーアップ

とりあえず武器(弾?)のアクティブオブジェクトのプロパティから変数の使われ方を見てみましょう。

各種弾と変数比較

各種弾と変数比較


変数一覧から見たショットのプロパティは共通部分がほとんどで、弾の種類によって追加要素がある場合は変数にも追加があるって具合になっています。「xpos」「ypos」「xmov」「ymov」とかは、このブログで過去に出してきたサンプルがこんなんばっかだったはずなので詳しい説明は省きます。ただし弾の速度を具体的に決定しているのが「xmov」か「ymov」なのでこれだけ注意してください。弾の遅い、速いはこの変数と高速ループの回数でコントロールしてます。あとはあえてプレイヤーが発射する弾にだけは高速ループ使っています。プレイヤーの発射する弾は的に当たり易く、敵の発射する弾はプレイヤーに当たり難くが基本設計となっています。つまり敵が発射する弾には高速ループ使ってません。嘘避けが発生する可能性もありますが「嘘避け」についてはプレイヤー的には「俺スゲー」で済ませられるレベルまでなら嘘でもいい加減でも良いんじゃないでしょうかって考えて作っています。

変数「damage」はショットが敵に当たった時に与えるダメージを定義してます。ちなみに敵にも体力に相当する変数が付属してますから、「敵体力-ショット与ダメージ=体力ゼロ以下だったら敵死亡」というフラグが立ちます。つまりこの数値が高ければ高いほど与ダメージは大きい。でも大体の敵は一撃で倒せるように敵体力も加減して設定してあります。

変数「str」は貫通弾用の値です。貫通弾を作る場合、発射される弾にも体力的な要素=耐久力を盛り込みます。例えば的に当たった場合、敵を破壊するのが第一の処理、そこから貫通弾の場合ショットを破壊せずに「str」から一定の値を減算して計算結果が「0以上」の場合、移動量に基づいた移動を継続、そしてもう一回敵に当たったらもう一度計算して「str」が「0以下」にならないかを求めます。「0以下」になったらその時点で弾も用済みとして消去するようにイベントを組みます。アイディア的にはもうちょっと違う貫通弾もあるかと思うのですが、今回実装した貫通弾はこんな感じ。ちなみにこの仕様だと敵の耐久力および体力が弾の耐久力や与ダメージ値を上回る場合、そんな敵に当たったら弾は破壊されますが敵はまだ体力が残っているので破壊されず当然貫通弾も貫通しません。

貫通弾の仕様

貫通弾の仕様

あとは変数「life」、これは変数名が変、本当はRange(範囲)って書こうとしたのではないかと思われますが、作った本人もなんでこの変数名なのかもう忘れちゃいましたね。「弾が発射されて何秒(何フレーム)後に弾を消す」という処理のためにこの変数が追加されています。つまり普通の弾は発射されたら画面外まで自動で進んで行くのですが、この変数が追加されている弾はタイマー付きで発射されているため進んだ距離あるいは一定の時間が経過したら的に当たろうが当たらなかろうがその場から消去されます。つまり弾の届く範囲(レンジ)が決定されている、具体的には発射された弾が発射された場所から一定の距離以上の場所には届かないように制限されています。前述の通り、強すぎる武器を弱くするためには制限を加える必要があったため追加された変数です。

こんな感じで普段何気なく発射してる弾なのですが、このように変数を使って各ショットの性格というか特徴みたいなものを定義してあります。

これとは別に弾を発射する間隔とかコリジョンの有無を評価するためにグローバル変数や他オブジェクトの可変変数、内部フラグなどを使っています。今回触れなかったそのその他の変数と役割については次回に説明をします。