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 というプログラム開発環境はなかなか手強そうに感じられる。タイムライン(時間の流れ)とレイヤー(層)という独特の空間に慣れないといけない。