PR
ある夜のことであった。11時を過ぎ,眠くなってソファーに転がっていると,バチバチと強く,大急ぎでキーボードを叩く音がする。何事かと思いこうしろうの背中越しにディスプレイを覗き込もうとするのだが,こうしろうは肩を上げてブロックする。それでも,しつこく覗いていると,いかにも邪魔だと言いたげに「なに?」と振り返る。ホームページの作り方を説明するメールを打っているようなのだが,それにしては隠したがりすぎる。「おねえちゃんか?」,「うん。」質問が下品すぎたが,回答は素直だった。おねえちゃんではなく,クラスの女の子にページの作り方を聞かれて,説明していたのだ(そりゃ,力も入るわな)。トップページの写真(小6の頃)とは別人のようになった思春期の息子は自分専用のPCを欲しがるのだが,それは高校生になるまでお預けというのが我が家のルールだ。

12月7日 そんなこうしろうはFlashでシューティングゲームを作り出した。我が家には昔から,パソコンはあるがゲーム機は一台もない。小学生の頃,パソコンでゲームに没頭するこうしろうに「人の作ったもので遊ぶより,作るほうが面白いぞ」と声をかけ,MindStorms日記が始まったのであるが,ゲームを作りたいという気持ちはずっと持っていたようだ。参考書は『Flash ActionScript Handbook』大塚 勝三著 ソフトバンク パブリッシング発行である。

 まずはこの日できたところまでを見ていただこう。

shot.html
(表示にはMacromedia Flash Player6が必要です)
ペン先(ロケットらしい)のようなボタンをクリックすると,矢印(ミサイルらしい)が出る。


on (release) {
  _root.makeshot();
}



 マウスのボタンを押した後,はなしたら(on release),_root(ルートムービータイムライン)に定義した関数makeshotを実行せよと書いてある。しかし,当初,ミサイルは発射されなかった。スクリプトはサンプルプログラムを参考になんとか書けるのだが,ボタンの作成に失敗していた。やむを得ず,こうしろうは弟かずに教えをこうた。めずらしいパターンである。

 かず曰く「ボタンを作るには,まずアップにしたい絵を書いて,それをタイプ=ボタンのシンボルに変換して,アップ以外のキーフレームを挿入する。」

 フラッシュのボタンにはマウスの動きに対応した4つの状態がある。まず,かずの言うアップ(マウスポインタがボタンの上に載っていない時),オーバー(ボタンの上に載っている時),ダウン(マウスボタンが押された時),そしてヒット。ヒットはボタンの領域,つまりボタンが反応する範囲を示す。マウスでクリックされたら,ボタンのイメージを変えたい場合には,ダウンの絵を変更するのだと,かずが流暢に説明するのでいくそった(富山弁解説 いくそる:びっくりするの意)。

 ルートムービータイムラインに書いたmakeshot関数は参考書のコードを少しいじったものだ。


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



 概要を説明すると,depth(深度=レイヤー位置)を加算しながら,ムービークリップであるミサイル(shot)をattachMovieメソッドで発生させているのである。同じレイヤー位置に,同時に複数のミサイルは出せないので,depthの値を変更している。ムービークリップであるshotはオブジェクト指向のクラスのようなものでnewNameで定義される実際のミサイル(depthが12とするとmyshot12)がインスタンスということになる。this[newName]._x = 284.5とthis[newName]._y = 346はミサイルが出てくる座標である。

 ミサイルの方,つまりムービークリップshotには,タイムライン上のフレーム1とフレーム2にスクリプトを書いた。
(フレーム1)


_y -= 30;
if (_y < 0) {
  this.removeMovieClip();
}



_y-=30でY座標の位置を30減らす。Y座標の値が0より小さくなったらremoveMovieClip()でミサイルのインスタンスを消す。

 どうして,ミサイルがどんどん移動して,そのうち消えて行くかと言うと,フレーム2に
----------------------------------
gotoAndPlay(_currentFrame -1);
----------------------------------
と書いて,フレーム1に戻りPlay(実行)を繰り返すようにしているからだ。

 横から覗き込んでいると,Flash というプログラム開発環境はなかなか手強そうに感じられる。タイムライン(時間の流れ)とレイヤー(層)という独特の空間に慣れないといけない。