STG‐制作後記‐
プログラム的な話その1
突然ですが連想配列って超便利ですよ?
という話から。まずは下のコードをご覧ください。
switch(i){
 case 0:f0();break;
 case 1:f1();break;
 case 2:f2();break;
}
これを連想配列を使うと
var t={0:f0,1:f1,2:f2};
if(t[i]) t[i]();
実際はちょっと違う感じで使いましたが、これはステージを作るのにすごく役に立ちます。
tはあらかじめ定義しておいたほうがいいです。
プログラム的な話その2
メニュー画面かなり頑張りました(悪い意味で)。
私は頭が悪かったので、メニュー画面全てを管理する関数を作ってしまいました。
これは悪いことではないのですが、本当に全てをその関数でやっていたのです。
場合分けの嵐。柔軟性の欠如。最悪です。
「メニュー」というクラスを作れば良かったのですが、なんかよくわからなかったのです。
その3
functionの入れ子はめっちゃすごい。というお話。
論ずるよりも見るが早し(嘘。以下は実際に使ったコード(を少し編集したもの)です。
var f=function(s,w){
 var e=CrtElm('img');
 e.src=s+'.gif';
 return function(){
  var t=CrtElm('img');
  t.src=e.src;
  var s=t.style;
  s.position='absolute';
  s.width=s.height=w+'px';
  return t
 };
};
var ImageCol={
 weeky:f('weeky',60),
 gulf:f('gulf',60),
 anty:f('anty',60),
 skala:f('skala',60),
 epsy:f('epsy',60),
/*中略*/
 peshiwoka:f('peshiwoka',60)
};
//画像を呼び出すときはImageCol.weeky()などとします。
CrtElmというのはdocument.createElementと同じです。
最も注目すべきは、関数fの中でreturnされている無名関数の中で、eとwが使えるということです。
つまり関数の中には変数を保存できる(嘘かも)。
この事実は有用すぎてやばいです。使いまくりです。
No.15について1
総制作時間の6分の1ほどを占める時間でつくったのがNo.15「STG+」です。
ここではそのシステムを簡単に(長々と)。
・HPではなくLifeが両者にあります。初期値は3(最大値)です。
・APがやっぱりあります。このゲームらしく。
・チャージがあります。本編のEXPと同じタイミングで増えます。
 これが満タンのときにボムが撃てます。
・ボムがあります。ボムを撃つと、自分の画面の敵・弾が全て消えます。
 また、Lifeが1回復、APが全回復し、チャージが0になります。
・ボムLvがあります。ボムを撃ったとき、相手の画面にこれに応じたボスが出ます。
 ダメージを受けると1減り、ボムを撃つとLifeに応じて上昇します。
 最小値は0、最大値は5です。
・似非喰らいボムがあります。
 ゲームオーバーの判定は、ボム発動よりも後に行われます。
 従って、Lifeが0になったフレーム(カットイン終了時)にもボムが撃てます。
・自然発生弾の出る範囲、速さ、弾の大きさは変化します。
 範囲と大きさは後述、速さは時間とLifeで決定します。
・弾送りがあります。チャージが満タンのときに敵を倒すと相手画面に弾を送ります。
 このときに相手の自然発生弾の出現範囲が少し広くなります。
 これが限界に達すると弾が大きくなります(主にこれで奴を倒す)。
・Lv0のボムを撃つと、相手の自然発生弾が割と強くなります(序盤は多用)。
・ダメージを受けると、チャージが大きく回復し、APも全回復、また、
 自分の自然発生弾の大きさもリセットされ、範囲はわずかに縮まります。
No.15について2
毎回恒例の、例外処理なしで別ゲームを実装する酔狂です。
個人的には本編よりもシステムがいい感じになっている気がする…
CAUTION!とかDAMAGE!とか動きを止めて表示するのは気持ちが良いですね。
あれはステージを運用する関数の中で画面管理、敵や弾の動きを実行してるわけです。
ゲームオーバーのときとクリアのとき、自機の動きくらいしか基本システムを使ってないのです。
しかしあれですね、相手のAI(人工無能)を作るのは面白い。
適当なAIで実装していますが、本当はもっと凝ったものも作っていました。
とはいえ、あくまでNo.15であって対戦ゲームではないので、
奴を倒すためのシステムが出来上がってしまいました。
それはそれで問題なのかも。きっと対人戦は楽しいんだろうな。
難易度について考察
難易度って何なのかと問うてみます。
あまり簡単だとつまらない。難しすぎても微妙。
だから中くらいがちょうどいい。
そんなことを考えるのなら難易度に意味などありません。
つまるところ、そのゲームをどうしたいか、に尽きると思います。
ここは不条理であるべき、とか、つまらないのは仕様、とか。
ゲームデザインから出発する必要があるのです。
ただ、私は個人的に「激しくて避けれる弾幕」は素敵だと思います。
エンディングとか、デモプレイとか、リプレイ機能とか、余計ですよ、ね?
戻る top