ActionScript 3.0で始めるオブジェクト指向スクリプティング

第3回変数を使う

前回のムービークリップインスタンスをコントロールするでは、ターゲットパスつにいて確認したうえで、ActionScriptに定義済み(ビルトイン)のプロパティや関数を使って、インスタンスをコントロールした。

今回は、任意の値をメモリして利用する仕組みである変数について学習しよう。

秒針と分針のアニメーション

前回は、最後に秒針のアニメーションを作成した。その復習も兼ねて、今度は分針も加えたアニメーションにしてみよう。

図1 回転する秒針と分針のアニメーション
図1 回転する秒針と分針のアニメーション

メインタイムラインに秒針と分針のインスタンスを配置して、その第1フレームアクションとして以下のスクリプト1を記述する。わかりやすいように、インスタンス名は秒針がsecond_mc、分針はminute_mcとした。秒針は1秒(=1000ミリ秒)につき6度回転する。分針は60秒(=1000ミリ秒×60秒)で6度回転すればよい。つまり、分針の回転角は、秒針の1/60ということだ。

スクリプト1 タイムラインに配置した秒針と分針のムービークリップインスタンスを回転するフレームアクション
second_mc.rotation = getTimer()/1000*6;
minute_mc.rotation = getTimer()/1000/60*6;

メインタイムラインは、第1フレームアクションが繰返し実行されるように、2フレームに広げる図2⁠。[制御]メニューから[ムービープレビュー]を実行して、アニメーションを確認してみよう。

図2 メインタイムラインに第1フレームアクションを記述して2フレームに拡張する
図2 メインタイムラインに第1フレームアクションを記述して2フレームに拡張する

いつ変数が必要なのか

前記スクリプト1には、getTimer()関数のミリ秒を秒に換算するgetTimer()/1000という式が2度出てくる。コンピュータは文句をいわないとはいえ、すでに答えの出ている計算を何度もするのは無駄である。何度も使う計算結果は、どこかにメモリしておければ効率的だ。

あるいは、この時計のアニメーションをストップウォッチのように、特定の時刻からの経過時間を計るのに使うとしよう。getTimer()関数は、前回説明したとおりFlash Playerが起動したときからの経過時間を返す。ストップウォッチの計測開始時に、getTimer()の値が10000ミリ秒(10秒経過)だったとする。すると、スクリプト1のステートメントは、つぎのように変更される。

    second_mc.rotation = (getTimer()-10000)/1000*6;
    minute_mc.rotation = (getTimer()-10000)/1000/60*6;

計測開始時刻が変わるごとに、2箇所を書替えなければならないというのでは面倒だ。しかも、今はごく単純な例を採上げている。このやり方で複雑な処理を記述すれば、何かひとつ変更があるたびに、何十箇所~何百箇所を修正するはめになることも十分考えられる。

それに、ストップウォッチをつくるとすれば、計測開始時刻をいちいち手で変更するのでなく、SWF再生時にスクリプトでダイナミックに変更したい。

以上のような場合に使うのが「変数」だ。変数には、値をメモリすることができる。メモリした値は、いつでも取出すことが可能だ。変数を使って式を記述すれば、メモリした値を変更するだけで、その変数を使ったすべての式の処理に結果が反映される。変数の値は、スクリプトでダイナミックに書替えることもできる。

変数を使う場合
  1. 同じ値を何度も利用するとき。
  2. 値をパラメータのように指定して一括修正したいとき。
  3. 値をスクリプトでダイナミックに変更したいとき。

変数の使い方

では、変数はどのように使うのかを説明しよう。第1に、変数には識別子で名前をつけ、varキーワードで宣言する[1]⁠。変数名は、識別子でさえあれば、任意だ(ただし、後述変数の名前のつけ方参照⁠⁠。

   var 変数名;

第2に、宣言を済ませた変数に値を設定するには、プロパティと同じく、代入演算子を用いる。

    変数名 = 値;

また、変数の宣言をすると同時に、値を設定することもできる。

    var 変数名 = 値;

たとえば、秒針のアニメーションで、getTimer()関数から計算した経過秒数を、nSecondsという名前の変数に設定するステートメントは、つぎのようになる。ここまでのシンタックス(文法)は、ActionScript 1.0や2.0でも同じだ。

    var nSeconds = getTimer()/1000;

第2に、ActionScript 3.0および2.0では、変数にどのようなデータが格納できるのか、その種類を指定できる。これを、データ型の指定という。データ型は、var宣言した変数名にコロン(:)をつけ、その後に指定する。

    var 変数:データ型;

上記の変数nSecondsには、数値を設定する。数値のデータ型は、Numberで指定する[2]⁠。よって、型指定を加えたステートメントは、つぎのとおりだ。

    var nSeconds:Number = getTimer()/1000;

型指定をすると、指定したデータ型と異なる値を代入すれば、[コンパイルエラー]になる。たとえば、上記のステートメントで、数値(Number)で指定された変数nSecondsに、テキスト(プログラミングでは「文字列」という)"fumio"を代入してみよう[3]⁠。[ムービープレビュー]を実行すると、[コンパイルエラー]パネルが開き、エラー内容が表示される図3⁠。

図3 指定した型と異なるデータを代入すると[コンパイルエラー]になる
図3 指定した型と異なるデータを代入すると[コンパイルエラー]になる

こうして型指定をすることにより、変数に宣言した以外のデータ型の値を、誤って設定してしまうことが防げる。

それでは、スクリプト1に修正を加えて、変数を使った処理に書替えてみよう。経過時間を秒数に換算した値を設定する変数nSecondsに加え、分数に換算した値は変数nMinutesに格納する。両変数とも数値(Number)型で指定したのが、つぎのスクリプト2だ。

スクリプト2 秒数・分数をNumber型で指定した変数に設定するフレームアクション
var nSeconds:Number = getTimer()/1000;
var nMinutes:Number = nSeconds/60;
second_mc.rotation = nSeconds*6;
minute_mc.rotation = nMinutes*6;

変数の名前のつけ方

前項変数の使い方で述べたとおり、変数名は識別子でさえあれば任意だ。ただ、プログラミングの慣習上、多くの人がしたがっているルールもある。このルールに則っていなくても、スクリプトの動作には特に問題はない。けれど、ルールにしたがっておくと、他の人や自分自身にも読みやすいスクリプトになる。

第1に変数名は、小文字で始める。インスタンス名も、変数名に準じる。また次回学習する関数名もまた、同じように頭は小文字にする。実際、ActionScriptのプロパティや関数(メソッド)の名前も、すべて小文字で始まっている。

第2に、接頭辞や接尾辞を使うことがある。接頭辞は識別子の先頭に、接尾辞は末尾につける記号のことだ。接尾辞は、前回「ターゲットパス」の項注釈(※5)で紹介した。接頭辞は、前項「変数の使い方」で、変数名nSecondsやnMinutesの最初につけた記号"n"を指す。接尾辞"_mc"はムービークリップインスタンス、接頭辞"n"は数値(number)で、それぞれ識別子に設定されたデータの内容を示す[4]⁠。

そうすると、変数のデータ型の指定と役割は似ている。しかし、接頭辞や接尾辞は、それが示すデータと違う値を変数に設定しても、コンパイルエラーのような警告は何も発生しない。また、具体的に使う接頭辞・接尾辞は、会社やチーム、あるいは個人によって異なりうる。

それでも、本連載ではふたつの点から、識別子に接頭辞または接尾辞を用いることとする。

接頭辞・接尾辞を使う意義
  1. 識別子を見てデータ内容がわかる。
  2. ActionScript定義済みの名前との重複が防ぎやすい。

第1に、データ型は、変数の宣言でしか確認できない。変数名に接頭辞や接尾辞が使われていれば、変数宣言まで遡って確認しなくても、データ内容がわかる。

第2に、たとえば前項の変数名で接頭辞のないsecondsやminutesを使おうとすると、すでにActionScript 3.0のDateクラスにプロパティとして定義されている。別の適切な名前を悩んで考えなくても、接頭辞をつけさえすれば、重複は防げる。

もっとも、ひとつの変数に接頭辞と接尾辞を両方使う必要はない。ActionScriptでは、接尾辞はコードヒントが表示されて便利なので、接尾辞が定められている場合はこちらを優先的に用いる。また、型指定のような厳密なチェックに利用される訳ではないので、あまり細かな分類にはこだわらず、大まかな内容がわかれば十分とする[5]⁠。

おすすめ記事

記事・ニュース一覧