■第1回 はじめに
■第2回 神の計画
■第3回 誰のどこに「いつ、だれの、何を、どうする」を書く
■第4回 変数を使いこなす
■第5回 Mathランダム徹底研究
■第6回 回転のメカニズム(番外編)
■第7回 正六面体の回転(番外編)

 第3回 誰のどこに「いつ、だれの、何を、どうする」を書く 2004.01.23 .
 モーショントゥイーンをアクションスクリプトで実行

301

前回まで「モーショントゥイーン」で行ったムービークリップインスタンス「tarou」と「hanako」のX座標プロパティの変更を、今回はアクションスクリプトを使って行ってみます。
■前回の「invader.fla」を開いて、とりあえず理屈ぬきで記載どおりに操作してください。
@「レイヤー1」「レイヤー2」のモーショントゥイーンの設定を「なし」にし、図のように2フレームだけ残して他のフレームを削除します。
※再生ヘッドを3フレームに移動してから、「Shift+F5キー」を何度も押していくと、全体にフレームが削除されていきます。
A「レイヤー3」の上に新しく「レイヤー4」を追加。
B「レイヤー4」の2フレームに空白キーフレームを挿入。
※この「レイヤー4」は、アクションスクリプト記載専用に用意しました。
アクションスクリプトは、どのレイヤーに記載しても動作しますが、バラバラに記載するとあとで自分がどこに何を記載したか分からなくなったり、同じフレームの別のレイヤーにバラバラにアクションスクリプトを記載すると思い通りの実行順序にならないこともありますので、このように専用のレイヤーを用意し、他のレイヤーには記載しないようにします。



※それぞれのレイヤーに配置されている中身は、右の赤字のとおりですが、レイヤーが増えてくると、編集の際に自分でもどこに何を置いているのか分からなくなりますので、「レイヤー名」を自分で分かる名称に変更しておいてください。
ただし、レイヤー名は編集上の都合だけであって、これからご説明するアクションスクリプトとは何の関係もありません。(下記”320”番後段※※参照)
※サンプルはこのあと、右「 」内の名称に変更しています。

302

C「アクション」レイヤーの1フレームをクリック選択、「アクションパネル」の「ツールボックスリスト」から「evaluate」をダブルクリック。
※「アクションパネル」が出ていないときは、1フレームを右クリック、右クリックメニューの「アクション」をクリック。
D「式」欄に、図のとおりにキーボードから打ち込む。



E続いて、「ツールボックスリスト」の「if」をダブルクリック。
F「条件」欄が表示されるので、そこに図のとおりにキーボードから打ち込む。



G続いて、「ツールボックスリスト」の「evaluate」 をダブルクリック。
H「式」欄に、図のとおりキーボードから打ち込む。



I次に、「hanako」について記載しますが、そのまま「evaluate」をダブルクリックすると、今反転している「tarou._x = 56;」の下の行「if{ }内」に記載されるので、一度、上図Cの部分をクリックしてから、「evaluate」をダブルクリックします。
J「式」欄に、下図のとおりキーボードから打ち込むと、行が変わって「if{ }の外」に改めて記載されます



K以降上記Eの「if」文からの記載方法に従って、「hanako」について次のように追加記載してください。

 hanako._x = hanako._x - 11;
 if (hanako._x < 56){
   hanako._x = 440;
 }

L次に「アクション」レイヤーの2フレームを右クリック、右クリックメニューの「空白キーフレームの挿入」をクリックして「空白キーフレーム」にしてから、「アクションパネル」の「ツールボックスリスト」の「goto」アクションをダブルクリック。
今回は初期の設定である「gotoAndPlay(1)」を使って、1〜2フレームのループを作りますのでそのまま活用します。



Mここで、メニューバー「制御」→「ムービープレビュー」で動作を確認してください。
スクリプトの記載に誤りがなければ、ボタン動作も含めて前回と同様の動き方をするはずです。

 プロパティの値を設定(変更)せよ!・・・「プロパティ=式(数値);」の代入式

303

ムービークリップインスタンスである「tarou」と「hanako」が水平移動するというのは、それぞれのもつ「X座標」というプロパティの値を時間経過とともに変更することです。
「X座標」というプロパティは「_x(アンダーバーと小文字のx)」であらわされます。
そして、具体のインスタンス名を指定して・・・

 tarou._x

と、「.(ドット)」で繋ぐことで、「tarouのX座標」の意味になります。
さらに・・・プロパティの「値」は、座標の場合、具体の座標数値(X=100など)ですから、

 tarou._x = 100;

と、「=」で具体の値を代入すると、「tarouのX座標」は「100」に設定され、アクションが実行されたときには、実際にその座標位置(基準点がX=100)に配置されます。
※「左辺=右辺」と書いて、算数では「左辺の内容と右辺の内容は等しい」の意味ですが・・・
アクションスクリプトでは、「右辺の内容を左辺に代入する(左辺←右辺)」という代入式になります。
この「=」を「代入演算子」と呼びます。
※「左辺の内容と右辺の内容が等しい」という場合は「左辺==右辺」と「==」を2つ並べて記載します。
これを「比較演算子」と呼び、他に「(左辺が大きい)」「>=(左辺が大きいか等しい)」「(左辺が小さい)」「<=(左辺が小さいか等しい)」「!=(等しくない)」があります。これは「if」などの条件式の中で使います。

304

最初の行のアクションスクリプトでは、右辺と左辺に同じインスタンスの「プロパティ」があります。

 tarou._x = tarou._x + 11;

右辺に「tarou._x」があるときは
「tarouのX座標」の「現在の値」そのものの意味になります。
いいかえれば「現在のプロパティの値を取得せよ!」という命令と同じです。
シーン編集画面で、「tarou」は、ステージの座標で「X=56」の位置に配置しました。
ムービーが再生され、最初このアクションスクリプトが実行されると、「tarou」の現在位置は当初「X=56」ですから、右辺の「tarou._x」は「56」という値をもちます。
したがって、右辺の「tarou._x + 11」の演算結果は、「67(56+11)」となり、その値が左辺の「tarou._x」に代入されます。
左辺の「tarouのX座標」の値が「67」に設定されることは、実際にその位置(X=67)に配置しなおされることですから、その瞬間右に11px移動します。
これが、移動の原理です。
※「+11」というのは、1回当りの移動量のことで、「第1回はじめに」の”116”番で設定したモーショントゥイーンでの計算上の1フレーム当りの移動量に対応させているだけのことです。
この値が大きいほど大きく移動し、小さいほど小さく移動します。

305

そして、 アクションスクリプトが実行されるには、「イベント(動作のきっかけ)」が必要ということでした。
しかも、1回の「イベント」で、1度しかアクションが実行されないので、連続して移動させようと思うときは、イベントを連続発生させることで、堂々巡りを作り出す必要があるということです。

 フレームに記載されたアクションが実行される「イベント」は、フレームの再生開始時

306

では、この場合の「イベント(動作のきっかけ)」は、何でしょうか?
「ボタン」では各マウス動作が「イベント」でしたが、このようにフレームにアクションスクリプトが記載されたものは、そのフレームが再生される瞬間が「イベント」です。
これを「フレームイベント」といいます。
1フレームに

 tarou._x = tarou._x + 11;

2フレームに

 gotoAndPlay(1);

とだけアクションスクリプトが記載さているとき・・・
1フレームが再生される瞬間、「tarouのX座標」の現在位置を右に11px移動して配置し、2フレームが再生される瞬間、フレームを1フレームに戻して、そのフレームを再生しなさい、の意味になります。
そして再び、1フレームが再生される瞬間、「tarouのX座標」の(移動後の)現在位置を(さらに)右に11px移動して配置し、2フレームが再生される瞬間、フレームを1フレームに戻して、そのフレームを再生・・・
という、永久にこれを繰り返す堂々巡りが出来上がります。
1〜2フレームをループしながら再生するので、フレームレート(通常1/12秒)ごとに次々と「フレームイベント」が発生し、そのたびに「tarou._x」の値が11pxづつ大きくなり、この場合はどこまでも右に移動し続けるという訳です。

307

「STOP」ボタンには、「クリックされたら、タイムラインを停止する」アクションスクリプトが記載されていましたので、それをクリックすると、その時点のフレームで停止します。
フレームの進行が停止すると、次のフレームの再生が始まりませんから「フレームイベント」が発生せず、フレームに書かれたアクションが実行されないため、横移動も停止します。
「PLAY」ボタンで再び、フレームの進行が始まって「フレームイベント」が発生し、横移動を開始します。

 条件文で軌道修正!

308

そして、上記のままではムービー(ドキュメント)の外に飛び出して永久に戻ってくることはありません。
そこで次の「条件文」を使って、軌道修正を行います。

 if ( tarou._x > 440 ){
   tarou._x = 56;
 }


モーショントゥイーンを設定する際、最終フレームに配置した「tarouのX座標」が「X=440」だったので、ここではそれに従って、「tarou._x」の値が「440」を超えたとき、最初のX座標値「56」に設定しなおすという作業を行っています。
フレームのループの中で、「tarou._x」の値が大きくなり(右に移動)、440を超えたとき、56に戻して(元の左の位置から)やり直すということです。

「if条件文」の一般的な書式は・・・

 if ( 条件式@ ){ ←条件式@を満たすとき
   処理@;     ←処理@を実行
 } else if ( 条件式A ){ ←条件式@を満たさないが、条件式Aを満たすとき
   処理A;     ←処理Aを実行
 } else {            ←条件式@も条件式Aも満たさないとき
   処理B;     ←処理Bを実行
 

サンプルのように・・・

 if ( 条件式 ){
    処理;
 }


とすると、条件式を満たしたときだけ{ }内の処理を実行し、そうでないときは何もしない、ということになります。

309

サンプルの1フレームのアクションスクリプトでは、続いてインスタンス「hanako」についても併記しています。

 tarou._x = tarou._x + 11; ←「tarouのX座標
」を(+)右に11px移動
 if ( tarou._x > 440 ){    ←(その結果)もし、「tarouのX座標値」が440を超えていたら
   tarou._x = 56;       ←「tarouのX座標」を56に設定(しなおして配置)
 }
 hanako._x = hanako._x - 11; ←「hanakoのX座標」を(−)左に11px移動(当初X=440にある)
 if ( hanako._x < 56 ){     ←(その結果)もし、「hanakoのX座標値」が56を下回っていたら
   hanako._x = 440;      ←「hanakoのX座標」を440に設定(しなおして配置)
 }

アクションスクリプトは、記載された順番に上から下に瞬時に演算処理がなされます。
FLASHの基本動作の単位は、フレームレート(通常1/12秒)ですが、相当な数だらだらとスクリプトを記載しても、フレームレートの時間とは比べものにならない速さで実行されますので、見た目には「tarou」も「hanako」も同時に移動しているように見えるのです。
※ただし「for」文などで数千回、数万回の繰り返し演算処理を実行した場合など、処理能力の低いマシンでは、演算が終了するまで次のフレームに進まないことがあります。
※FLASHの動作がギクシャクと重くなる原因に、読み込む画像などのデータ容量の問題のほか、このようなスクリプト演算にかかるマシンの負荷の問題もあります。

 同じアクションスクリプトを直接ムービークリップインスタンスに書くと・・・!

310

アクションスクリプトは、前回のように「ボタン」インスタンスに記載することも、上記のように「フレーム」に記載することも、これから行う「ムービークリップ」インスタンスに記載することもできます。
■上記”309”番のアクションスクリプトを、実際にムービークリップインスタンス「tarou」と「hanako」に記載してみます。
とりあえず理屈ぬきで以下の操作を行ってください。
@準備として、シーン編集画面で1フレームだけにし、「アクション」レイヤーのアクションをすべて削除します。



ここからが、ムービークリップインスタンスに直接アクションスクリプトを記載する方法です。
Aステージにある「tarou」インスタンスをクリック選択し、「アクションパネル」の「ツールボックスリスト」から
「evaluate」をダブルクリック。
図のような「onClipEvent (load)」という「イベントハンドラ」付きで{ }内に「;(セミコロン)」が記載されますので、「式」欄に「this._x = this._x + 11
」とキーボードから打ち込む。



B以降、上記”302”番のE〜H の手順で、下図赤○内のようにスクリプトを記載します。
Cさらに、「onClipEvent( load ){」の部分をクリック反転させ、図の上「イベント」欄の「EnterFrame」ラジオボタンをクリックしてチェックを入れます。



その結果、スクリプトエリアのアクションスクリプトは以下のようになります。

 onClipEvent (enterFrame) {
   this._x = this._x + 11;
   if ( this._x > 440 ){
     this._x = 56;
   }
 }

Dこの段階で、メニューバー「制御」→「ムービープレビュー」で動作を確認してください。
アクションスクリプトを記載した「tarou」だけが今までと同じ動き方をしているはずです。

311

それぞれの意味については順にご説明いたしますが、その前に「ムービープレビュー」で再生中に「STOP」ボタンをクリックしてください。
これまでのように、「tarou」の足の開閉は止まりますが、横移動は停止しません。 そして「PLAY」ボタンをクリックすると、再び足の開閉をはじめます。
おさらいのつもりでこれらの意味を考えてみると・・・
@この場合、フレームは1フレームのみなので、1フレームの再生が終了すると二度と「フレームイベント」は発生しませんが、再生の際に読み込まれたムービークリップやボタンのインスタンスは、以後は独立してそこに存在します。
したがって、それぞれの中にあるタイムラインを進行させて足の開閉を続けたり、ムービークリップ自体に記載したアクションスクリプトを実行して横移動を続け、さらにその中に抱える「弾丸」ムービークリップインスタンスも動作します。ボタンの機能も失われることはありません。

B「PLAY」ボタンの「play();」を実行しても、元のシーンのタイムラインが1フレームしかないので動きようがありませんが、「インベーダ」の中では、足を開閉するタイムラインが存在しているので、各ボタンで設定している「tarou.stop()」」や「tarou.play()」は有効に働いたということです。

 「ムービークリップ」のイベント

312

ムービークリップインスタンスにアクションスクリプトを設定すると、「onClipEvent()」という「イベントハンドラ」を伴って{ }内にアクションが同時に記載されます。

 onClipEvent( イベント ){
    実行するアクションスクリプト
 }


そして、上記”310”番Cの下の図にあるのがそのイベントの種類です。
@「Load(ロード)」:ムービークリップインスタンスが配置されているフレームが再生され、そのムービークリップインスタンスが読み込まれたとき。

例えば、あるムービークリップインスタンスが5フレームのキーフレームに配置されているとして、ムービーが1フレームから順に再生されていき、5フレームにきて、このムービークリップが読み込まれたときに「Load」イベントが一度だけ発生します。
A「EnterFrame(エンターフレーム)」:フレームレート(通常1/12秒)ごとに繰り返し継続してイベントが発生。
B「UnLoad(アンロード)」:上図で19から20フレームにフレームが進む際、タイムラインからムービークリップインスタンスが消えるとき。
C「Mouse Down(マウスダウン)」:ムービーの再生画面の上でマウスが押し込まれた瞬間。
D「Mouse Up(マウスアップ)」:ムービーの再生画面の上で押し込まれていたマウスが離れた瞬間。
E「Mouse Move(マウスムーブ)」:ムービーの再生画面の上でマウスが移動した瞬間。
 ※C〜Eはボタンイベントのようにインスタンス上だけでなく画面上のどこであってもイベントが発生。
F「Key Down(キーダウン)」:キーボードのどれかのキーが押された瞬間。
G「Key Up(キーアップ)」:押されたキーが離れた瞬間。
H「Data(データ)」:loadVariables()メソッドなどが実行され、外部データの読み込みが完了したとき。

※C〜Gは、ボタンのイベント同様、いずれも外部からの予測できないタイミング(神様の気まぐれ)で発生するイベントです。

313 今回「tarou」に対するアクションスクリプトの記載では、イベントをAの「EnterFrame」としたので、

 onClipEvent( enterFrame ){
   実行するアクションスクリプト
 }

{ }内に記載されたアクションスクリプトは、最初に試みた1〜2フレームのループの中で発生させた「フレームイベント」と同様、フレームレート(通常1/12秒)ごとに繰り返し継続して実行されることになります。

 それはだれの命令か?・・・命じる者が変われば同じ対象でも指定の仕方が変わる

314

アクションスクリプトの実行を命じる者(主体)と命じる対象は、いずれも(人格のある)ムービークリップインスタンスです。(第2回”219”番参照)
「実行を命じる者」とは、アクションスクリプトが現に記載されているムービークリップインスタンスのことです。
したがって、この場合アクションスクリプトが「tarou」ムービークリップインスタンスに直接記載されているので、「tarou」が実行を命じる者となります。
フレームに記載された場合は、そのフレームの所有者であるムービークリップインスタンスが実行を命じる者となり、ボタンインスタンスに直接記載された場合も、そのボタンの所有者であるムービークリップインスタンスが実行を命じる者となります。
つまり、仮に「tarou」ムービークリップ編集画面の中で、フレームに記載した場合も、その中にボタンを配置しそこに直接記載した場合も、いずれも「tarou」ムービークリップインスタンスがそのアクションスクリプトの実行を命じる者となるということなのです。
そして、これらアクションスクリプトそのものは、命じる者であるムービークリップインスタンスに属します(アクションスクリプトの所有者はムービークリップインスタンスです)。

315

では最初に試みた、シーン編集画面の1・2フレームのアクションスクリプトは、そのフレームの所有者であるムービークリップインスタンスが実行を命じる者ということになりますが、この場合のムービークリップインスタンスとは具体的に”だれ(固有のインスタンス名)”のことでしょうか?

316

シーン編集画面は、ムービー本体の絶対時間軸(元のタイムライン)とムービー(ドキュメント)の絶対空間(座標)を規定するもので、その中で様々なオブジェクトや各ムービークリップインスタンスを配置し(その範囲内で)独自の働きをさせることができます。
またムービークリップインスタンスの中にもさらにムービークリップインスタンスを配置・・・と幾重にも「入れ子構造」にすることもできました。
「入れ子構造」の最下層のムービークリップインスタンスから見た直近上位の階層にあるものは、自分の行動範囲を規定し包み込む親のムービークリップインスタンスであり、そのムービークリップインスタンスの上位もさらにその親のムービークリップインスタンスであり・・・とさかのぼると最後に行き着くのが「大元のムービークリップインスタンス」と考えられるもの、つまり元のシーンのインスタンスです。
人格をもつ個人がいて、法人組織(個人の入れ子構造)があって、それらが地球上の絶対時間と絶対空間(緯度・経度)の中で活動していることにたとえれば、「大元のムービークリップインスタンス」はこの地球にあたります。
地球にいわゆる「人格」があるのかどうか分かりませんが、大地の恵みを与えてくれたり地震や台風を発生させたりと、「支配者」としての意思があるように振舞い、それによって人間社会全体の行動が大きく左右されます。
支配者としての地球は個々人が拠って立つ根源ですから、それを特定する固有名詞は必要ないのと同様、「大元のムービークリップインスタンス」には「インスタンス名」がありません
また「地球」という呼び名も、他の惑星と区別する場合に使用する名称(”地球”も○○星という、地球外から見た客観的な名称ではありませんが)ですから、地球の住人からすれば、ただ「大地」と呼べばそれは自分達の根源である地球を意味します。
この「大地」というのに相当するのが、アクションスクリプトの世界では、「_root(ルート)」と表記して、「大元のムービークリップインスタンス」を指します。

317

ということで、最初に試みた、シーン編集画面の1・2フレームのアクションスクリプトの実行を命じる者の正体は、大元のムービークリップインスタンス「_root」のことです。
そして、1フレームでは、命じる対象として、その直近支配下に置いた「tarou」と「hanako」を名指しして・・・
 tarou._x = 〜〜、hanako._x = 〜〜 
とそれぞれのムービークリップインスタンスに対して位置を変えよと命令しました。

318

今回は「tarou」に直接アクションスクリプトを記載したので、実行を命じる者である「tarou」が命じる対象は、自分自身です。
ムービークリップインスタンスが自分自身のことを指すキーワードが「this(ジス)」なので・・・
ここでは、上記”309”番のスクリプトの「tarou._x」に変えて、

 this._x = this._x + 11; ←「自分自身のX座標」を(+)右に11px移動
 if ( this._x > 440 ){    ←(その結果)もし、「自分自身のX座標値」が440を超えていたら
   this._x = 56;       ←「自分自身のX座標」を56に設定(しなおして配置)
 }

とします。
同様に、「hanako」にアクションスクリプトを記載し、「hanako」自身の行動を規定して命じるなら、
「onClipEvent( enterFrame ){ }」内のスクリプトは、

 this._x = this._x - 11; ←「自分自身のX座標」を(−)左に11px移動
 if ( this._x < 56 ){    ←(その結果)もし、「自分自身のX座標値」が56を下回っていたら
   this._x = 440;       ←「自分自身のX座標」を440に設定(しなおして配置)
 }

となります。
※自分自身を指す「this」の記載を省略して「_x = _x + 11;」としても暗黙で自分自身を指し正常に動作します。
しかし、「MX」の拡張機能の一部に「this」を記載する場合と省略する場合で扱いが異なるものがありますので、将来「MX」バージョンのアクションスクリプトの勉強をされる予定の方は、その際になって混乱しないために、省略しないで記載するように心がけてください。

319

それでは、「hanako」に対する行動についても、「tarou」のアクションスクリプトにまとめて記載するとすればどうなるでしょう。
命じる者である「tarou」から、命じられる対象である「hanako」を指定することになるのですが、いきなり・・・

 hanko._x = hanako._x - 11;

と記載すれば、上記”317”番でご説明しているように、これが記載されたムービークリップインスタンスの
直近支配下にあるムービークリップインスタンス「hanako」という意味であって、この場合は「tarou」ムービークリップの中に配置された「hanako」を指すことになります。
「hanako」は、「tarou」の中に配置されたものではなく、「tarou」と同様「大元のムービークリップ」の中に配置されていますから、存在しない「インスタンス」を指定しても無効(無視されるだけ)です。
このような場合は、「大元のムービークリップインスタンス」に戻って、そこから指定します。
「大元のムービークリップインスタンス」のことを「_root」と表記しますから・・・

 _root.hanako._x = _root.hanako._x - 11;

と、「_root」と「インスタンス名」を「.(ドット)」で繋げば、
「大元のムービークリップインスタンス」の中にある「hanko」というムービークリップインスタンスのX座標という意味になり、実在する「hanako」を指定することができます。

320

もし、この「hanako」の中にある「弾丸」ムービークリップを指定して、アクションを実行しようとすれば、
「弾丸」ムービークリップにはまだ「インスタンス名」が無かったので、それに例えば「dangan」という名前を付けたうえで、

 _root.hanako.dangan._y = 〜〜

と、大元の「_root」から順番に「入れ子構造」をたどりながら内へ内へと「インスタンス名」を「.(ドット)」で繋ぎながら指定していきます。
このように、「インスタンス名」を繋ぎながら対象となるムービークリップインスタンスを指定することを「パスを記載」するといいます。
※ちょうど、フォルダ名を「/(スラッシュ)」で繋ぎながら目的のファイル名を指定するのと同じ要領です。
そして、大元の「_root」から記載するパスのことを特に「絶対パス」といいます。
※「相対パス」については後日。

※※かつて「Q&A掲示板」で、ムービークリップインスタンスの配置されている「レイヤー」を指定する方法についてご質問がありました。
「レイヤー」は、配置されているオブジェクト(ムービークリップやボタンや文字、図形など)の上下の重なり順を決めたり、「モーショントゥイーン」を設定したり、自分が編集しやすいように便宜的に分けるためにあります。
アクションスクリプトの世界では、ムービークリップの「入れ子構造」とフレームだけが対象で、そのムービークリップがどのレイヤーに配置されていようが全く関係ありません。
極端な話、ひとつのレイヤーにすべてのムービークリップインスタンスを詰め込んでも構いません。
アクションスクリプトを考えるときは、レイヤーのことは忘れてください(笑)

321

■実際に「tarou」のアクションスクリプトに続けて「hanako」に対するアクションスクリプトを追記して、動作を確認してみましょう。
まず、ステージの「tarou」をクリック選択して、アクションパネルで・・・



あとは、上記”302”番F〜Hの手順を参考に、最終的に以下のように記載します。

 onClipEvent (enterFrame) {
   this._x = this._x + 11;
   if (this._x > 440) {
     this._x = 56;
   }
   _root.hanako._x = _root.hanako._x - 11;
   if (_root.hanako._x < 56) {
     _root.hanako._x = 440;
   }

 }

メニューバー「制御」→「ムービークリップ」で確認してください。




invader.fla←ここまでのサンプル制作ファイルです。右クリックして「対象をファイルに保存」でダウンロードできます。

322

「tarou」と「hanako」の動作は、これまでのサンプルと同じですが、ボタンをクリックしたときの動作が違います。
「STOP」ボタンをクリックしても、横移動は停止せず、足の開閉だけが止まります。
ところで、前回第2回の最後にあった宿題の答えは分かりましたか?
「STOP」ボタンに記載されたアクション、

 on( release ){ ←ボタンがクリックされたら
   stop();       ←タイムラインを停止
   tarou.stop();   ←(同時に)「tarou」という名前のムービークリップインスタンスのタイムラインを停止
   hanako.stop();  ←(同時に)「hanako」という名前のムービークリップインスタンスのタイムラインを停止
 }

   ”最初の「stop();」では、「だれの」が記載されず、いきなり”タイムラインを停止”と命じています。
   この省略された「だれ」というのはだれのことでしょうか?
   そして、これらの者に対して”停止命令”を発している”主”は、一体だれでしょうか?”

もうお分かりですね!
上記”314”番、「アクションスクリプトがボタンに記載された場合は、そのボタンの所有者であるムービークリップインスタンスが実行を命じる者です。」
このボタンは「大元のムービークリップインスタンス」に配置されている付属品ですから、「大元のムービークリップインスタンス」が命令の主体です。
そして、タイムラインも「大元のムービークリップインスタンス」のものですが、「インスタンス名」がないので、”だれ”という固有名詞を指定できないけれども、「_root」と表現できますから、省略しないで記載すると・・・

 _root.stop();

とすることもできますし、命じる者自身のタイムラインという意味で、

 this.stop();

とすることもできるのです。

323

「Stopアクション」はタイムラインの進行を停止するものであって、フレームレートごとにイベントを発生する「onClipEvent( enterFrame)」の回転を停止させることはできません。
そのため、今回サンプルではインベーダの横移動を停止できなかったのですが、次回は「ボタン」からのアクションスクリプトの中で「変数」を使い、この横移動を停止する方法をご説明する予定です。

 誰のどこに”いつ、だれの、何を、どうする”を書く

324

以上、ここまで実践を交えながらご説明してきたことを整理しますと・・・
アクションスクリプトは「いつ、だれの、何を、どうする」をひとつひとつ順序立てて記載した文章であり、それを「誰のどこに」記載すれば、自分の思い描いたイメージを作れるかを考えて記載します。

325

「誰のどこに」というのは、アクションスクリプトの記載場所という観点からの説明です。
誰の」というのは、命令する主体となるムービークリップインスタンスのことで、「大元のムービークリップインスタンス」を含む個々すべてのムービークリップインスタンスが該当します。
そのムービークリップインスタンスの「どこに」というのには、次の3種類の場所があり、下記”326”番の「いつ」に対応して、どんなイベント(きっかけ)でアクションを実行するかによって記載場所を選択することになります。
@ムービークリップインスタンスを外からクリック選択して、直接ムービークリップインスタンス自体に記載。
これを「クリップアクション」といいます。
クリップアクションでは、必ず「onClipEvent(イベント)」ハンドラを伴い、アクションスクリプトはその{ }内に記載します。(”312”番参照)
Aムービークリップ内に配置された(付属品としての)「ボタン」インスタンスをクリック選択して、ボタン自体に記載。
これを「ボタンアクション」といいます。
ボタンアクションでは、必ず「on(イベント)」ハンドラを伴い、アクションスクリプトはその{ }内に記載します。(第2回”208”番参照)
これは、そのムービークリップが、ボタンを「”神界”とコンタクトするための道具」として利用し、アクションを実行しようとするものですから、ボタンに記載されたアクションスクリプトといえども命令の主体はあくまでそのムービークリップです。
Bムービークリップ内の編集画面にあるフレームをクリック選択して、フレームの中に記載
これを「フレームアクション」といいます。

326

ここからの「いつ、だれの、何を、どうする」というのは、アクションスクリプトに実行させる仕事に着目した説明です。
いつ」とは、ボタンがクリックされたとき、ムービー画面上でマウスが移動したとき、該当のフレームが再生されるとき、などのように、何かが行われるためのイベント(きっかけ)のことで、利用したいイベントに応じて、上記”325”番でいう「どこに」の3種類から記載場所を選択します。
そのフレームに来たら何かをさせたいときは「フレームアクション」。
ボタンクのプレスやクリック、マウスオーバーなどを利用するときは、ムービークリップの中にボタンという道具を作成して「ボタンアクション」にし、目的のイベントを選択。
ムービークリップが読み込まれたとき最初に何かを設定したいとか、フレームレートごとに毎回継続して何かをさせたいなどの場合は「クリップアクション」にして、目的のイベントを選択。

だれの」とは、「大元のムービークリップインスタンス」を含む、「何を、どうする」の対象となる個々すべてのムービークリップインスタンスのことで、個別に名付けられた「インスタンス名」を指定することです。
ただし、「大元のムービークリップインスタンス」を指定するときは「_root」で指定します。
対象となる「インスタンス」が、アクションを記載するムービークリップインスタンス(上記”325”番の「誰の」)の直下に配置されていないときは、「_root」からの「絶対パス」を使って「インスタンス名」を指定します。(上記”320”番参照)
また、対象が自分自身である場合は、インスタンス名に代えて「this」というキーワードを使うことができます。
何を」とは、対象のムービークリップインスタンスの「プロパティ(大きさ、位置座標、透明度、色、回転角度など)」 のことです。
どうする」とは、そのプロパティの「値を設定したり変更したりする」ことです。
「hanako」というムービークリップインスタンスの「X座標」というプロパティの「値を56にする」というのは・・・
代入式を使って、hanako._x = 56; とすることでした。

327

代入式ではない、hanako.stop(); 「hanako」のタイムラインを停止するというのは、「何を(タイムライン)」+「どうする(停止)」という一連の流れを、「stop()」というひとつ単語に封じ込めたものです。
このような「何をどうする」などという特定の機能や役割をあらかじめ定めて、ひとつの単語に封じ込め、その単語をスクリプトとして記載すれば、定めたとおり自動的に実行できるようにしたものを「メソッド」といいます。
そして、これまで使ってきた中では「stop()」と「play()」が、この「メソッド」にあたります。
「参考図書」や「アクションスクリプト辞書」などをみると、様々なアルファベットの単語が並んでいますが、この中で「アルファベット」の最後に「()」が付いているものが「メソッド」です。
書式は、命じる対象となる「インスタンス」名に「.(ドット)」を介して・・・

 インスタンス名.メソッド(); ←「だれの」、「何をどうする」
       hanako.stop();   ←「hanako」の「タイムラインを停止」
        _root.play();   ←「大元のムービークリップインスタンス」の「タイムラインを進める」
         this.stop();   ←「自分自身」の「タイムラインを停止」

※アクションスクリプトで使われる様々なメソッドは、マクロメディア社がFLASHソフトの中にあらかじめ「この単語(「予約語」といいます)を記載すれば、こんな機能や役割をさせる」とひとつひとつ定義して(使えるように仕込んで)いるものなのです。
※また、メソッドは「function」を使って、自分で定義する(使えるように仕込む)こともできます。

328

「if」などの「条件文」では、「だれの、何を、どうした」の結果、その「プロパティの値」を調べ、「値の条件」によって、それぞれ「だれの、何を、どうする」を{ }内に記載します。
※目で動きを見ながら編集するモーショントゥイーンなどと違って、数値から動作を想像しながらの作業になりますので、思ったイメージに仕上げるには、時にはメモ用紙に数値を控えながら、電卓片手に何度も何度もやり直すことになると思います(笑)


 優れたアクションスクリプトの組み立て方とは・・!

329

ここまで「インベーダ」の横移動を「モーショントゥイーン」で行ったり、アクションスクリプトで行うにしても複数の方法を使ってきました。
ムービーを再生したときの動作が同じでも、その方法にはいろいろあることがお分かりいただけたと思います。
市販のサンプル集などにある完璧で効率の良い方法も数ある方法のひとつで、それを上手く活用することもできます。
しかし、優れた方法とは、だれに見られても恥ずかしくない効率の良いスクリプトではなく、少々非効率でも、他人に理解されなくても、制作する自分にとって最も理解しやすい方法、最も理解しやすいスクリプトの組み立て方なのです。
あなたがWebデザイナーさんであったり、自分のホームページをFlashで飾りたいと願う方なら、目的は完成品としてのFlash作品の出来栄えであるはずで、制作過程のスクリプトを品評会に出品するわけではないからです。



第3回 誰のどこに「いつ、だれの、何を、どうする」を書く 戻る このページの先頭へ 次へ

質問掲示板 過去記事 サンプル作品集 FLASH5講座 ACTION SCRIPT講座 リンク 憲ちゃんのHP FLASH制作代行 トップページ

トップページ