中学2年のこうしろうは,とにかく忙しい。部活,生徒会,試験。そんな中学生らしいものに加え,ネットワーク上で知り合った人との活動など父の知らない世界にも進んで行っているようだ。やはりMindStormsができるほど,まとまった時間はない。しかし,身に付けたいという気持ちがあるのかFlash MXでのシューティングゲーム作成は行きつ戻りつしながらではあるが,少しずつ進んでいる。

2月9日 この日の課題はUFOとミサイルの衝突を検知することであるが,かなり間が空いたので,まずはおさらい。プログラムを開始するとUFOが空から降ってくる。UFOを降らすコードはコレ。
---------------------------------------------
newName = "ufodrop"+hukasa;
_root.ufodrop.duplicateMovieClip(newName, hukasa);
hukasa++;

---------------------------------------------
 ステージ上(Flashの画面上)に1個だけ配置したムービークリップUFOをduplicateMovieClipメソッドでduplicate(複写)することで次々とUFOを出現させている。

 ペン先のようなロケットをクリックすると矢印のようなミサイルを出すのは,
---------------------------------------------
on (keyPress "<Space>") {
 _root.makeshot();
}

---------------------------------------------
 スペースキーが押されたら(On keyPress),実行されるmakeshot関数だ。
---------------------------------------------
function makeshot() {
 if(depth == 10) {               …(1)
   depth = 0;
 }
 depth++;
 newName = "myshot"+depth;      …(2)
 if (_root[newName] == null) {
   _root.attachMovie("shot", newName, depth);
   this[newName]._x = pen_btn._x;
   this[newName]._y = pen_btn._y;
 }
}

---------------------------------------------
 makeshot関数では,attachMovieメソッドでミサイルを出現させている。attachMovieメソッドはduplicateMovieClipメソッドと違い,ステージ上にムービークリップを前もって配置しておく必要がない。

 今回,こうしろうが思案投げ首して書いたのはムービークリップUFOそれ自体のイベントに追加した,衝突を検知するコードである。実は前回から一月近く間が空いたので,こうしろうは記憶をたぐるのに苦しんでしまい,なかなかプログラミングを開始できなかった。「hitTestというそのものズバリのメソッドがあるよ」とだけ教え,後は「書いてみろ,間違えろ」と突き放した。コードをいじり出すまでに20分近くの沈黙が流れた。でも,何か書いてみれば,そのうち,なんとかなるのである。

 下記のコードの中に//traceとコメントアウトされている個所があるが,Flashの場合traceというコマンドでデバッグ用のウィンドウにかっこ内の変数や定数を出力させて,意図どおりに動いているかどうか検証できる。思うようにいかない場合,例えばtrace (this._name)のようにしてthis._nameが何を指しているのか確認する。決して効率的な方法ではないが,間違いをデバッグ出力で見つけながら手探りでプログラムを作っていくのである。何事も効率優先の今日この頃,こんな覚え方も良いなと思った。
---------------------------------------------
onClipEvent (enterFrame) {
  this._y += 2;
  for (i=1; i <= 10; i++) {          …(3)
    shotname = "myshot" + i;
    //trace(this._name);
    if (this.hitTest(_root[shotname])) {
      //trace("hit");
      this._rotation += 90;        …(4)
    }
  }
  if (this._y>300) {
    this.removeMovieClip();
  }
}

---------------------------------------------
 さて,プログラムの中身はと言うと,UFOはthis._y += 2でY軸の値を少しずつ増やしているので,ゆっくり落ちてくる。ミサイルの名前(newName)は"myshot"+depthで作られる(2)。depthは1から10の間で変化するので(1),forループの中で(3),1から10のミサイルに衝突していないか検知しているのである。ぶつかっている場合は,(4)でUFOの向きを90度変えている。

shot05.html
(表示にはMacromedia Flash Player6が必要です。ロケットをマウスで一回クリックしてから,スペースキーでUFOに向けてミサイルを発射してみて下さい。)

 ミサイルが当たるとUFOがクニャと曲がるので,なんとなく面白いのだが,突然UFOが消えたり,一つのUFOを曲げると,後から出てくるUFOも同じ向きで出てきたりと不可思議な動きをする。

 こうしろうの試行錯誤は続きそうだ。