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

 第4回 変数を使いこなす 2004.01.29 .
 変数もそれが記載されたムービークリップインスタンスの所有物

401

変数とは、学校で習ったように・・・
式 X = Y + Z があり、Y = 3、Z = 2 のとき、X = 5 というときの「X」「Y」「Z
」のことで、
「値」を出し入れする”箱”のことです。
”箱”の「値」は、随時、変化させることが出来るので”変化する数”・・・「変数」というのでしょうね。
以下は、アクションスクリプトで扱う変数についての要点です。
@「変数名」は、「インスタンス名」と同様の留意事項(第2回”204”番)さえ守れば、それが何の値を入れる変数なのか自分で識別できるよう自由に名前を付けることができます。
A変数に格納する値は、加減乗除できる「数値」のほか、”文字(列)”なども扱います。
   suuji = 123;       ←変数suuji に「123」という数値を代入 
   moji = "あいうえお";   ←変数moji に”あいうえお”という文字列を代入
                   ※文字列を代入するときは、代入する文字を「” ”」で括ります。
Bアクションスクリプトは、それが記載されたムービークリップインスタンスの所有物であったように(第3回”314”番)、「変数」もそれが定義(記載)されたムービークリップインスタンスの所有物です。
たとえば、「貯金箱」という名前の変数があったとして、太郎の中にそれを置き、同じ名前の変数「貯金箱」を花子の中にも置き、太郎と花子が共に所属する会社に変数「帳簿」が置かれていたとします。
会社が、太郎と花子の変数「貯金箱」の中の金額を調べて、合計額を会社の変数「帳簿」に記録する、という場合・・・
それぞれの変数は、それぞれ「太郎」、「花子」及びこれらの直近上位階層にある「会社」の所有物です。
このことを、会社の中に、アクションスクリプトで記載するとすれば・・・

 帳簿 = tarou.貯金箱 + hanako.貯金箱;

というように記載します。
変数「帳簿」は、アクションスクリプトの書かれた会社の中にあるのですから、ずばり変数名を記載します。
会社に存在しない変数「貯金箱」は、それぞれ「だれの」所有する変数「貯金箱」なのか、「プロパティ」を指定したときと同様、変数名の前に対象の「インスタンス名」を指定して特定することになります。
そしてこの場合、同じ変数名であっても、それを定義(記載)したムービークリップインスタンスが異なれば、全く別の変数であるということです。

402

変数は、アクションスクリプトの中に記載されて使用されます。
仮に「hensu」という名前の変数が、ムービークリップインスタンス「tarou」のクリップアクションの中で、

 onClipEvent( load ){
   hensu = 0; ←変数hensu に「0」を代入
 }

と記載されているとします。
ムービーが再生され「tarou」が読み込まれると、「hensu = 0;」が実行されます。
この時点で(今まで存在しなかった)変数hensu が「tarou」の所有物として生成され(生まれ出て存在するようになり)、以後、自分の中からでも、パスを記載すれば他のムービークリップからでも、参照(値を調べて取得)することができるようになります。
このことを「変数hensu を定義する」といういい方をし、具体的には、ムービークリップインスタンスに変数名を記載するだけのことです。
アクションスクリプトの記載場所は、第3回”325”番でご説明したように「クリップアクション」「ボタンアクション」「フレームアクション」の3箇所がありますので、変数が記載される場所もこの3箇所あります。
例では、クリップアクションで変数hensu を定義しましたが、フレームに記載しても、ボタンに記載しても定義することができます。
※その場合、変数hensu を「tarou」の中の1フレームに記載したから、変数hensu は1フレームに存在すると狭く考えず、「tarou」の中のどこで定義されようとも、「tarou」という”ムービークリップインスタンスの中に存在する”変数hensu と大きく考えてください。

 変数でムービークリップの動きをコントロール

403

前回、2つの「インベーダー」の横移動を、「tarou」のクリップアクションで以下のように記載しました。

 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;
   }
 }

このように、EnterFrameイベント(フレームレートごとに繰り返し実行)の堂々巡りの中でそれぞれの「X座標」の増減を行いました。
そして、このEnterFrameイベントの堂々巡りの回転は、これが記載されたムービークリップインスタンス「tarou」が存在する限り永久に止まることはありません。
タイムラインを停止するには「stop()」メソッドがありましたが、この回転を止めるメソッドはありません。
ではこの場合どうすれば、「tarou」と「hanako」の横移動を停止させることができるか?

404

走っている自動車をブレーキを踏まないで止めるには、(慣性の法則はこの際無視)
@回転しているエンジンを止める。
A変速機のギアをニュートラルにしてエンジンの回転が伝わらないようにする。
Bクラッチを切ってエンジンの回転が伝わらないようにする。
この3つの方法があります。
@はタイムラインエンジンの進行をコントロールする「stop()」「play()」メソッドが使える場合です。
永久に止まらない「EnterFrameエンジン」搭載車の場合はABの方法で行います。

「EnterFrameエンジン」の回転を横移動の駆動力に変換しているアクションスクリプトが、「tarou」の例では、

  this._x = this._x + 11;←(繰り返されるたびに)自分の位置を11pxづつ移動

(1フレームレート当り11pxの速度で右に自走)
この「11」の値が「移動量」で、
大きければ速度が速く、小さければ速度が遅くなります。また値が「0」になると、現在位置に「0」を加えても同じ位置に再配置されるだけですから、どこへも行かずその場で停止しているように見えます。
この部分を例えば「speed」という名前の変数に置き換えて、

 this._x = this._x + speed; 

とし、ドラッグボタンなどから、変数speed の値を自由に変更できる仕組みをつくれば「変速機」ができます。
今ではオートマティック車がほとんどで、クラッチというものをご存知ない方もいらっしゃると思います(笑)
クラッチの仕組みは、踏めばエンジンの回転が伝わらず、離せば伝わるというものなので、OFF(停止)かON(進行)のどちらかです。
別途「move」という名前の変数を用意して、初期値を「move = 1;」と設定し、移動量「11」に掛け算すると、

 this._x = this._x + 11 * move

移動量「11×1」は「11」ですから、今までどおり「11の速度で移動」を続けます。
そして、ボタンなどから変数move の値に「0」を代入して「move = 0;」に設定すると、「11×0」は「0」、移動量が「0」というのは位置が移動しないことですから、「その場で停止」させることができます。

ご参考までに、変数speed と変数move を組み合わせて・・・

 this._x = this._x + speed * move

とすると、クラッチ付き変速機になります(^^)

405

■「変速機」方式は、ドラッグボタンの作成から始めないといけないので、とりあえず「クラッチ」方式で実際にやってみて動作を確認します。
前回までの「invader.fla」を開きます。
@まず、シーン編集画面の1フレームをクリック選択して、変数move の初期設定として「move = 1;」をフレームアクションで記載します。


※フレームが再生されるときに1回だけ「move = 1;」が実行され、「大元のムービークリップインスタンス」の中に変数move が定義されます。(この時点で大元のムービークリップインスタンスの所有物として存在し、自分の中からでも他のムービークリップインスタンスからでも、いつでも値を取得したり、値を代入したりできるようになる。上記”402”番参照)

Aステージの「STOP」ボタンをクリック選択して、アクションパネルで、不要になった「stop」アクションを図の要領でまず削除します。



B「on(release)」ハンドラのすぐ下に新しいスクリプトを記載したいので、そこをクリック反転させてから、図のようにして「move = 0」を挿入します。


※「STOP」ボタンも変数move も「大元のムービークリップインスタンス」の所有物なので、そのまま変数名を記載。
※ムービー再生中に「STOP」ボタンがクリックされると、変数move の値が「0」に更新される。

C同様にステージの「PLAY」ボタンをクリック選択して、上記ABの手順で、「play()」に代えて「move = 1」を記載してください。
「PLAY」ボタンのボタンアクション・・・

 on(release){     ボタンがクリックされたら
   move = 1;   ←変数move に「1」を代入
   tarou.play();
   hanako.play();
 }

※ムービー再生中に「PLAY」ボタンがクリックされると、変数move の値が「1」に更新される。

D次にステージの「tarou」ムービークリップインスタンスをクリック選択し、下図の要領で「* _root.move」を書き加える。


※このクリップアクションは、「tarou」に記載されているものなので、単に変数「move」と記載すると、それは「tarou」の所有する変数move(実在しない)を指すことになります。ここは
「大元のムービークリップインスタンス」の変数move の値を取得したいので、「_root.move」とパスを記載して特定します。
※上図Cの「hanako」の制御に関する部分で、

 _root.hanako._x = _root.hanako._x - 11 * _root.move

としても構いませんが、今回はこれを
削除し、改めて「hanako」インスタンスのクリップアクションとして書くことにします。
※これは、何事も他人に任せず「自分のことは自分でする」というプログラム組み立ての大事な考え方のひとつです。

Eステージの「hanako」をクリック選択、第3回”310”番A〜Cを参考に下図のように記載してください。



Fメニューバー「制御」→「ムービープレビュー」で動作を確認してください。
「tarou」「hanako」とも、それぞれのクリップアクションの中で、「EnterFrameエンジン」の回転ごとに毎回、大元のムービークリップインスタンスに存在する変数move (=_root.move)を参照(見に行って値を取得)しています。
「STOP」ボタンで、変数moveの値が「0」になると、「tarou」「hanako」の中の「_root.move」の参照結果も「0」になるので、その場で停止。
「PLAY」ボタンで、変数moveの値が再び「1」になると、動き出すというわけです。

 テキストボックス変数

406

FLASH独特のオブジェクト(部品)に「ダイナミックテキスト」と「テキスト入力」があり、それぞれ固有の変数を割り当てることができます。
「ダイナミックテキスト」は、ムービー再生中、画面上に変数の値を文字のかたちで表示する”道具”で、
「テキスト入力」は、再生中の画面から、変数に値を入力する”道具”です。
”道具”と強調しているのは、これらもボタンなどと同様、アクションスクリプトの世界で人格としての「インスタンス名」を持てず、特定のムービークリップインスタンスの所有物に過ぎない存在だからです。
※「MX」バージョンのアクションスクリプトでは、インスタンス名を与えることができるようになっていますが、この講座では「FLASH5」バージョンに従い「人格なし」としておきます。

407

「ダイナミックテキスト」「テキスト入力」に固有の変数名を設定する方法は・・・
@まず、ツールボックスの「A」文字ツールをクリック。
下図のような文字プロパティが表示されます。
※FLASH5では、メニューバー「テキスト」→「オプション」で「Aテキストオプション」パネルを使用します。



A「静止テキスト」のところをクリックして、「ダイナミックテキスト」又は「テキスト入力」を選択。
Bいずれの場合も、ステージ上でマウスをドラッグして任意の位置に「テキストボックス」を描いて作成します。
C「テキストボックス」が描かれると同時に「変数」欄が書き込み可能状態になり・・・
D「変数」欄にキーボードから、任意の「変数名」を記載します。
※いずれの場合もテキストボックスに付ける変数なので、これを「テキストボックス変数」といいます。

408

テキストボックス変数も変数なので、上記”401”番でご説明した内容と基本的に同じですが、特筆する点は・・・
@当然のことですが、変数の値を入れる”箱”として独自の「テキストボックス」をもっている。
Aテキストボックス変数が属するムービークリップインスタンスは、テキストボックスが配置されたムービークリップインスタンスです。
※シーン編集画面で直接テキストボックスを作成し、その変数名を「hensu」としたとき、変数hensu は大元のムービークリップインスタンス「_root」の所有物であり、「tarou」ムービークリップ編集画面で作成したテキストボックスであれば、その変数hensu は、「tarou」ムービークリップインスタンスの所有物となります(「tarou.hensu」)。
Bテキストボックス変数が扱う値は、”文字列”のみ
※テキストボックスの中に「123」という「数値」を記載したつもりでも、それは加減乗除できない”数字文字”になります。
「数値」の場合は、123 + 45 は、168 ですが、”数字文字”の場合、”123” + ”45”の演算結果は、”12345”です。
Cテキストボックス変数に値を代入する方法は、次の3種類。
 ア、編集画面で直接テキストボックス内に値(文字)を書き込む。
 イ、「テキスト入力」にして、ムービー再生画面のテキストボックスから値(文字)を入力する。
 ウ、アクションスクリプトで値(文字)を代入する。
   ※テキストボックス変数の変数名が「hensu」だったとして、
      hensu = "こんにちは!"; ←変数hensu に”こんにちは!”を代入
    これが実行されると、再生画面のテキストボックスに「こんにちは!」と表示されます。
   ※外部テキストファイルをムービーに読み込んで表示することもできます。
     (詳しくは、過去記事の■ロールオーバーで外部テキストスクロールなどを参照してみてください)       
Dテキストボックスに何も記載されない状態でムービーを再生すると、テキストボックスは表示されますが、この時点で未だ「テキストボックス変数」は定義されていません(変数としては存在していない)!
この場合、テキストボックスに値が代入されて、はじめて定義されます(使える変数として存在します)。
一度変数が定義される(存在する)と、その後値が空白になっても、変数が属するムービークリップが存在する限り永久に存在します。
※FLASHでテキストボックスに何も記載されない状態とは、一般的な、hensu = "";(「ヌル」何もない)という状態とも違うそれ以前の状態のことです。
※テキストボックスの内容が空白のまま、その変数を最初から定義(使えるように)しておきたい場合は、テキストボックスが配置されているムービークリップインスタンスのどこかで「hensu = "";」を記載して実行しておきます。

後々のためにあれこれむつかしい理屈も書きましたが、ここで当面知っておくことは、太字の部分だけで十分です。

 現在の座標値をテキストボックスで時々刻々表示する

409

実際に「テキストボックス変数」を使って、刻々変化する「tarou」と「hanako」のX座標値を文字で表示してみましょう。
■シーン編集画面でレイヤーを追加し、レイヤー名を「テキスト」とします。
※そろそろ「グリッド」線が目障りになってきましたので、メニューバー「表示」→「グリッド」でグリッド表示、吸着をなしにしてください。
@「テキスト」レイヤーの1フレームをクリック選択して、ツールボックスの「A」テキストツールをクリック。
ステージに「静止テキスト」で「tarou = 」「hanako =」と図のように記載。



A「静止テキスト」をクリックして「ダイナミックステキスト」を選択。
B「tarou =」「hanako =」の右横にテキストボックスを適当な大きさドラッグして作成、中に3桁分の数字を記載。
※この場合のX座標値の最大桁数が3桁なので、その桁数を確保するために行う作業です。
※具体の数字に何を記載しても、ムービー再生と同時に実際の座標数値に入れ替わりますのでとりあえず「000」と記載しました。
Cテキストボックス右下のハンドルの上でダブルクリックすると、ボックスの大きさが3桁分の大きさになります。
※テキストボックスの正確な位置設定は、Dの後、ツールボックスの矢印ツールをクリック選択して、該当のテキストボックスを選択、直接ドラッグするかキーボードの矢印キー又は「情報パネル」等で移動修正できます。
D変数名を「変数」欄にキーボードから打ち込む。
「tarou =」に対応するテキストボックス変数を「tarouX」、「hanako =」に対応するテキストボックス変数を「hanakoX」としてください。
※この2つのテキストボックス変数は、シーン編集画面に作成されたテキストボックスの変数なので、大元のムービークリップインスタンスの所有物になります。

E次にステージの「tarou」インスタンスをクリック選択、アクションパネルで
図のように「_root.tarouX = this._x
」を挿入。
※ここでも、単に「tarouX」と記載すれば、「tarou」の中にあるテキストボックス変数(存在しない)の意味になります。
テキストボックス変数tarouX は、大元のムービークリップインスタンスの所有物ですから「_root」を指定して特定します。



※アクションスクリプトの意味をおさらいしますと・・・

 onClipEvent (enterFrame) {   フレームレート(1/12秒)ごとに以下のことを繰り返し実行
   this._x = this._x + 11 * _root.move:←自分のX座標値を右辺の式の値にして、その位置に配置(※1)
   _root.tarouX = this._x;         ←(移動後の)自分のX座標値を_rootにあるtarouXに代入(※2)
   if (this._x > 440 ) {      (その結果)もし、自分のX座標値が440を超えていたら
     this._x = 56;              ←自分のX座標値を56にして、その位置に配置
   }
 }

(※1)現在の自分のX座標値に「11×_rootにある変数moveの値(1or0)」を加え、その位置に自分を配置。
(※2)_rootにある変数tarouX は、テキストボックス変数なので、その値がテキストボックスに”文字”として表示される。

F同様にステージの「hanako」インスタンスをクリック選択し、以下のようにアクションスクリプトを挿入。

 onClipEvent (enterFrame) {
   this._x = this._x - 11 * _root.move:
   _root.hanakoX = this._x;
   if (this._x < 56) {
     this._x = 440;
   }
 }

Gメニューバー「制御」→「ムービープレビュー」で動作を確認してください。



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

 第4回のまとめ

411

今回「変数の使用例」の一端をお示ししましたが、変数は、様々に知恵を発揮して上手く活用すれば、自分の思い描いたイメージを実現する強力な武器になります。
次回は、この変数と「Mathオブジェクト」という”数値演算をつかさどる「公共の装置」”を使って、「インベーダ」をランダムに移動させてみたいと思います。


第4回 変数を使いこなす 戻る このページの先頭へ 次へ

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

トップページ