前編、後編 と続けて、スプライト機能を生かしたシューティングゲームのサンプルを作成してきました。わりとシンプルな一画面プログラムなので、自由に改変して遊んでいただけたら嬉しいです。
というわけで、今回はオマケ編として、私自身がサンプルを改変して遊んでみたいと思います。一画面におさめるため機能を削ったとこを拡張したり、うっかり忘れていたコードを追加したり、あとゲームとしてもう少し複雑になるよう改善してみたり。今回はより自由にコードを書いてみたいな、と思います。
今回のコード、ほんと参考程度に、こんな書き方もあるんだなぁ程度で、生温く眺めていただけると嬉しいです。
今回のサンプル動画
まずは一画面のまま改善
ざっとサンプルを眺めてみて、いくつか改善してみましたので、最初にご紹介しておきます。コードはこちら。
(1) は敵機が破壊された時に音が設定していなかったので、爆発音を設定しています。同様に (2) では自機がやられた時により派手目な爆発音を設定してみました。これら音の追加で、よりシューティングゲームらしさが出てきた気がします。
(3) については、ちょっと説明が必要です。もともとプチコン4で用意されている爆発パターンは4種類の画像によるアニメーションなのですが、これまでのサンプルではそのうち3つしか利用していませんでした。利用しなかった理由は、以下を見ていただければわかると思います。
赤枠が最初から用意されている爆発のパターンなのですが、いちばん右にある4つ目のパターンだけ、画像サイズが異なることがわかります。しかも上の部分に違うパターンが格納されています。4つを同じ設定でアニメーション表示させると、この違うパターンまで表示されてしまいます。
対応方法は幾つかあるのですが、ちょっと面倒だし、コードが長くなるのでパターン3つ目までで我慢していた、という状況でした。
今回、ここをちゃんと対応しています。つまり、(3) の爆発用アニメーション定義において、4つ目のパターンも追記したのです。
そして余計なパターンを表示させないため、6行目に (4) のコードを追加しています。スプライトの機能って、結局は「グラフィック画面にある任意の小さな領域を、好きな位置に表示する」という機能ですから、元になるグラフィック画面を書き換えちゃえばいいよね、という発想です。具体的には、表示したくない余計なパターン部分を黒で塗りつぶしています。
以上4ヶ所の修正で、敵機や自機の爆発に音がつき、またその爆発パターンも本来の4種類の画像切り替えによる表現にすることができました。
さて、サンプルとしてはこれで完成、あとは私の好みで拡張していきます。
敵の種類を増やしてみる
私はわりと突進系の敵が好きなので、追加してみましょう。ちょっと小さくて、脆いけれど、スピードが速いので、撃つか避けるか判断を要求するような敵です。弾は撃ちません。こんな感じです。
コードのメイン部分では、以下のように、敵を生成している部分を拡張してみました。
まず (1) の部分ですが、ET
という変数を追加し、これがどんな敵を生成するかを示しています。その次で場合分けをしていますが WHEN 1:
の部分は以前からいる敵機の生成なので、中身はほぼ同じです。
それに対して OTHERWISE:
の部分が、新しい敵機を生成している部分になります。元からある敵機と比べると、違いが判り易いでしょう。まずスプライトのサイズを 16x16 と小さく指定し、アニメーションを同時に2つ定義し、また衝突判定のマップに 10 という値を指定しているのがわかります。
今回の敵機は回転しながら飛行するよう、(2) のように2つのアニメーションを定義し、同時に指定してあります。10行目は移動のためのアニメーション、11行目は回転(キャラの画像切り替え)のためのアニメーションの定義です。
衝突判定に関しては、ちょっと複雑になってきたので表にしてみました。縦に見て、同じ列に X があれば、その対象同士には衝突判定があります。今回、敵同士の衝突を避けるため、8 という新しいマスク値を導入しています。
1 | 2 | 4 | 8 | |
---|---|---|---|---|
自機 | X | X | X | |
自弾 | X | X | X | |
敵弾 | X | |||
敵機1 | X | X | ||
敵機2 | X | X |
この表を見ながら、(3)~(4) のマスク値が変更されていることを確認してみてください。
※ (4) は SPCOL 0,,11
が正しいですね
また、敵機の種類が増えたので、SPFUNC
に格納する値を増やしてあります。これまでは耐久度を示す "HP"
だけ定義していましたが、スコア値を示す "S"
と、敵機の種類を示す "T"
を追加しました。
さて、後半の SPFUNC
用のロジック定義は、以下のように修正しています。
まず (1) では、敵機の種類を示すスプライト内の "T"
の値を ET
という変数に格納し、この後の処理で敵機の種類による場合分けをしています。
敵機2 は弾を撃たないので、(2) のように敵機1の場合だけ弾を撃つよう条件を追加しています。
また敵機2は他より小さく、爆発のパターンも小さくしないと不自然に見えますので、(3) の部分で爆発用スプライトのサイズ調整をしています。
とまあ、こんな感じで敵機の種類を増やしてみました。
更に敵の種類を増やしてみる
骨組みができたので、敵機の種類を増やしていくのは容易です。でもキリがないので、もう1種類だけ増やしてみましょう。未使用の赤い機体の画像を使ってみます。
赤だとやはりエース機のイメージでしょうか。
※ 4行目の最後は SPCOL 0,,11
が正しいですね
(1) の WHEN 2:
の部分が、今回追加した赤い敵機の生成部分です。今回のちょっとした試みとしては、(2) のように移動のアニメーションを2種類用意し、そのどちらかをランダムにセットしていることです。
後半の SPFUNC
用のロジック定義は、以下のように修正しています。
これらの修正は赤い敵機の追加とは直接の関係はなく、全体的な調整です。まず (1) は敵機どうしの接触による破壊に対応するものです。敵機の動きが複雑になってくると、接触も増えます。マスクだけだと敵機同士の当たり判定が発生し、勝手にダメージを与えあってしまうので、接触先をみてダメージを与えるように修正しました。
同様に (2)~(3) では、自機の弾に目印を付けておき、敵弾との相殺の際にその目印をチェックするよう修正しました。これにより敵弾同士の接触による消滅がなくなりました。
さて、実際にプレイしてみましょう。
うん、だいぶゲーム性が増し、良い感じになってきました。
簡単なタイトルを追加しておく
最後は簡単なタイトルを追加して終わりにしましょう。
全体のソースファイルをもういちど掲載しておきますね。
というわけで!
前回 で終わりのつもりが、ちょっと物足りなくて続けてしまいました。とりあえずゲームとして遊べる感じになったので、いったんここで終わりにします。
皆さんも自分の好きなように改造して、遊んでみてください。
それではまた!