近頃,かずが毎週熱心に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の向きが変わります。)
今のところ,これだけである。