近頃,かずが毎週熱心にMindStormsをしているのでこうしろうの影が薄いのだが,彼のFlash MXによるシューティングゲーム作成もゆっくりと完成に向かって進んでいる。2週に1回,1時間だけのプログラム作成なので,前回の問題点を思い出すのに時間が掛かって「三歩進んで二歩下がる」という感じなのだが,それでも徐々にFlashの開発環境に慣れてきている。

 前回までの作りかけのゲーム(第116話)を試していただくと一目瞭然なのだが,ゲーム開始後しばらくの間,ミサイルを発射すると当たってもいないのにUFOが消えるというバグがある。

 バグを解決するには,まず現象をよく見ることだと,「何発目までが消えるのか数えてごらん。」と言う。指折りミサイルを数えるこうしろう。10発目までだ。それからコードを見直し,「深度が一緒の時に消えるのか!」とバグの原因にたどり着いた。だいぶわかってきたようである。



function makeshot() {
 if(depth == 10) {
  depth = 0;
 }
 depth++;
 newName = "myshot"+depth;
 if (_root[newName] == null) {
  _root.attachMovie("shot", newName, depth);
  this[newName]._x = pen_btn._x;
  this[newName]._y = pen_btn._y;
 }
}



 上記がミサイルを発射するコードである。attachMovieメソッドがミサイルを出現させる。引数として指定しているdepth(深度)は10になったら,0に戻すようにしているので,ミサイルは常に1から10の深度で発生する。

UFOを出現させるコード


フレーム1のコード
-----------------
hukasa = 1;
kaisu = 0;

-----------------
フレーム2のコード
-----------------
newName = "ufo"+hukasa;
_root.attachMovie("ufo",newName,hukasa);
this[newName]._x = Math.floor(Math.random()*500);
this[newName]._y = -10;
hukasa++;

-----------------
フレーム23のコード
-----------------
gotoAndPlay(_currentFrame - 20);


 こちらのコードでは深度をhukasaという名前の変数で指定している。ミサイルの方では英語のdepthだったのに,UFOの側ではローマ字である。悪い書き方だ。depth_ufoなどにした方が良い。途切れ途切れに長い期間を掛けて,1つのプログラムを作っているとこんなことも起きてしまう。

 さて,深度(hukasa)である。フレーム1でhukasaに初期値として1を与え,フレーム2の_root.attachMovie("ufo",newName,hukasa);でUFOを発生させた後,hukasa++;で1を加算している。フレーム23まで時間が流れたら(3フレームから22フレームまでには何も記述していない。この間がUFOの出現間隔である),gotoAndPlayでフレーム2に戻る。だから,UFOの深度は1,2,3,…とずーっと,加算されていく。

 最初の10までの深度がミサイルの深度とかぶっているのでUFOが消えたのである。初期値として11を与えるようにフレーム1のコードを書き直し,この問題は解決した。

 次の問題点は,116話にある(表示にはMacromedia Flash Player6が必要です。ロケットをマウスで一回クリックしてから,スペースキーでUFOに向けてミサイルを発射してみて下さい。)という但し書きである。表示にMacromedia Flash Player6が必要なことはいかんともしがたいが,Flashのムービーにフォーカスを移すために,「ロケットをマウスで一回クリックしてから」と毎度お願いするわけにはいかない。CLICK STARTというボタンを作成し,自然にフォーカスを得られるように改良した。

shot06.html
(表示にはMacromedia Flash Player6が必要です。CLICK STARTをクリックしてゲームを開始してください。スペースキーでミサイルが発射します。左右の矢印キーでロケットが移動します。UFOにミサイルが当たると音がして,UFOの向きが変わります。)

 今のところ,これだけである。