(メインページへ)
3.1 シンタックスの基本要素

3.1 シンタックスの基本要素

大文字と小文字

Flash Player 7以降向けにパブリッシュされたムービーからはキーワード、、変数名、メソッド(関数)名、クラス名、プロパティ名などの大文字と小文字が区別されます。#includeで読み込む外部ファイルやクラス定義のためのActionScriptファイルでも同様です。たとえば、変数aと変数Aは区別されます。

var a = 1;
trace("a=" + a); // 変数aを調べる
trace("A=" + A); // 変数Aを調べる

出力結果
a=1
A=undefined

ムービークリップシンボルのインスタンスに付けるインスタンス名も大文字と小文字が区別されます。次の2つのインスタンスはmy_mcとMy_MCの別々のインスタンスとして認識されます。

my_mc._x = 100; // インスタンスmy_mcをx座標100の位置に移動
My_MC._y = 130; // インスタンスMy_MCをy座標130の位置に移動


ただし、古いバージョンからのアクションには大文字と小文字を区別せずに動作するものがあります。

var n = 15;
this.gotoAndPlay(n);//フレーム15へ移動
this.gotoandplay(n);//フレーム15へ移動

個別リンク

名前の付け方(識別子)

変数、プロパティ、メソッド(関数)、インスタンスなどに付ける名前を識別子といいます。識別子の先頭の1文字は、英字、アンダースコア、ドル記号のいずれかでなければなりません。数字やドットで始まる名前は使えません。名前の中に演算子で使っている記号を入れることはできません。すでにActionSriptが使っている予約語を識別子に使うことはできません。
なお、インスタンス名の末尾に_mcといった接尾辞を付けるとアクションパネルにスクリプトを入力する際にオブジェクト型に応じたコードヒントを表示できるようになります(コードヒント→p.??)。

予約語:
break、case、class、continue、default、delete、dynamic、else、extends、for、function、get、if、implements、import、in、instanceof、interface、intrinsic、new、private、public、return、set、static、switch、this、typeof、var、void、while、with

識別子の良い例:v、v1、v2p、usrName、my_mc
識別子の悪い例:1v、v(2p)、v-1、default、性別

個別リンク

演算子

ある値に対して演算を行い、新しい値を作る記号を演算子といいます。簡単なものでは加算の記号の+があります。演算子には次のようなものがあります。

note:
演算の対象となる値や変数のことをオペランド(operand)と呼びます。1+2ならば1と2がオペランドです。演算子はオペレータ(operator)です。

■算術演算子
算術演算子は数値の演算を行います。+-*/は一般的な加減乗除の計算と同じです。/の除算では、0での割り算を行ってもエラーにはならず値はInfinity(正の無限大)または-Infinity(負の無限大)になります。なお、+と-は数値の前に付けて正負を示す符号としても機能します。

算術演算子
+ 加算(足し算)
- 減算(引き算)
* 乗算(掛け算)
/ 除算(割り算)
% 剰余(割り算の余り)

例:
a = 1 + 2; // aに3が入ります。
b = 10 - 2 - 1; // bに7が入ります。
c = 4 * 3; // cに12が入ります。
d = 12 / 4; // dに3が入ります。
e = 15 % 6; //15割る6の結果は2余り3なので、eには3が入ります。

■ストリング演算子
+は加算の演算子ですが、オペランドの一方がストリング(String、文字列)のとき、ストリングの連結(文をつなげる)を行う演算子になります。

ストリング演算子
+ ストリングの結合
add ストリングの結合(使用を避ける演算子)


例:
name = "鈴木";
age = 25;
msg1 = name + "さん" // msg1に"鈴木さん"が入ります。
msg2 = "わたしは" + age + "です"; //msg2に"わたしは25です"が入ります。


■代入演算子
代入演算子は変数に値を入力したり、プロパティに値を設定する場合に使います。演算結果を代入するものを複合演算子と呼ぶこともあります。


代入演算子
= 代入・設定
+= 加算後代入
-= 減算後代入
*= 乗算後代入
/= 除算後代入
%= 剰余を代入
++ インクリメント(1足す)
-- デクリメント(1引く)

算数の計算式の「1 + 2 = 3」の=は等号ですが、ActionScriptの=は「ans = 1 + 2」のように式を書いて、=の右項の値を左項の変数やプロパティに代入あるいは設定します。ActionScriptの等号は==または===です。
また、「a = 1 * 2 + 3」のように演算子を結合して式を作れるのと同様に=も連結できます。このとき、式が右側から実行されていく点に注意してください(演算子の結合性→p.??)

例:
a = 10; // aに10を代入
b = c = 10 + 1; // bとcに11を代入

例:
d = 3;
e = 2;
x = y = (z = d + e) * 2;
trace(x); //出力→ 10
trace(y); //出力→ 10
trace(z); //出力→ 5

複合演算子は演算と代入を組み合わせたものです。値が代入される変数は先に初期化されている必要があります。

例:
// aに3足す
a = 10;
a += 3;
//a = a + 3と同じ


例:
// bから8を引く
b = 15
b -= 4 * 2; // 15- 8で7になる
//b = b - 4 * 2と同じ

例:
// cに7を掛ける
c = 3;
c *= 7;
//c = c * 7と同じ

例:
// dを3で割る
d = 15
d /= 2 + 1;
//d = d /(2+1)と同じ


// eを11で割った余りをeに入れる
e %= 11;
//e = e % 11と同じ


++と--はオペランドに1を加算または減算する演算子ですが、演算子をオペランドの前に置くか後ろに置くかで演算と代入の順が違います。++aのようにオペランドの前に演算子を置いたものをプリインクリメントと呼び、先に変数aに1を加算してから残りのステートメントを実行します。一方、a++ようにオペランドの後ろに演算子を置いたものをポストインクリメントと呼び、ステートメントを実行した後から変数aに1を加算します。--a、a--も同様でそれぞれプリディクレメント、ポストデクリメントと呼びます。

例:
//aに1を加算した後でステートメントを実行する
a = 5;
x = ++a + 3;
trace(x); // xは9になります。aは既に6になっています。
trace(a); // aは6になります。aには1加算されています。

例:
//ステートメントを実行した後でaに1を加算する
a = 5;
x = a++ + 3;
trace(x); // xは8になります。aは5のままで計算されています。
trace(a); // aは6になります。aには1加算されています。

例:
//aから1を減算した後でステートメントを実行する
a = 5;
x = --a + 3;
trace(x); // xは7になります。aは既に4になっています。
trace(a); // aは4になります。aから1減算されています。

例:
//ステートメントを実行した後でaから1を減算する
a = 5;
x = a-- + 3;
trace(x); // xは8になります。aは5のままで計算されています。
trace(a); // aは4になります。aから1減算されています。


■比較演算子
比較演算子は、左右のオペランドの大きさまたは同じものかどうかを比較します。結果は、条件を満たすときにtrue、満たさない場合にはfalseの論理値になります。比較演算子は、if、while、forといった条件によって制御を判断するステートメントで主に利用します。

note:
trueおよびfalseを論理値と呼びます。trueの否定はfalse、falseの否定はtrueです。

比較演算子
a == b 等価(aとbが等しいときにtrue、等しくないときfalse)
a != b 不等価(aとbが等しくないときtrue、等しいときfalse)
a < b より小さい(aがbより小さいときtrue、そうでないときfalse)
a <= b 以下(aがb以下のときtrue、そうでないときfalse)
a > b より大きい(aがbより大きいときtrue、そうでないときfalse)
a >= b 以上(aがb以上のときtrue、そうでないときfalse)
a === b 厳密な等価(aとbが値もデータ型も等しいときにtrue、そうでないときfalse)
a !== b 厳密な不等価(aとbが値もデータ型も等しくないときにtrue、そうでないときfalse)

==と!=の等価であるかどうかの判断はデータ型に応じて比較されます。このとき、数値と論理値を比較した場合は、trueは1、falseは0として比較します。つまり(true==1)と(false==0)はtrueになります。一方、===と!==の厳密な等価の判断では、数値と論理値は別物とみなし、(true==1)と(false==0)はfalseになります。nullとundefineの比較でも同様です。(null==undefine)はtrueですが、(null===undefine)はfalseです。

例:
//my_mcのx座標がマイナスならばmy_mcの位置をx座標300へ動かす
if (my_mc._x < 0) {
 my_mc._x = 300;
}


次のものは使用を避ける演算子に分類されているものです。

使用を避ける演算子
<> 不等価
eq 等価
ne 不等価
lt より小さい
le 以下
gt より大きい
ge 以上

■論理演算子
論理演算子は、trueまたはfalseの論理値をオペランドとして扱う演算子です。(論理値→p.??)

論理演算子
a || b 論理和 (a、bどちらか一方でもtrueならばtrue。両方ともにfalseのときfalse)
a && b 論理積 (a、bともtrueのときtrue。そうでなければfalse)
!a 否定 (aがtrueならばfalse。aがfalseならばtrue)

例:
// 変数xの値が0以下または300以上のときにdの値に-1を掛ける
if ((x <= 0) || (x >= 300)) {
 d *= -1;
}

例:
//my_mcをクリックするたびにmy_txtフィールドの表示・非表示が入れ替わります
my_mc.onPress = function() {
 var v = my_txt._visible;
 my_txt._visible = !v;
};

sampleファイル→ronri_hitei.fla


次のものは使用を避ける演算子に分類されているものです。

使用を避ける演算子
or 論理和
and 論理積
not 論理否定(単項演算子)

■ビット演算子
ビット演算子とは、値を2進数に換算して計算を行うものです。各桁(ビット)ごとに値を比較したり、桁をシフトする演算を行います。

ビット演算子
| ビット単位の論理和 (OR)
& ビット単位の論理積 (AND)
~ ビット単位の否定 (NOT)
^ ビット単位の排他的論理和 (XOR)
<< ビット単位の左シフト
>> ビット単位の右シフト
>>> ビット単位の符号なし右シフト
|= ビット単位の排他的論理和 (OR) を代入
&= ビット単位の論理積 (AND) を代入
^= ビット単位の排他的論理和 (XOR) を代入
<<= ビット単位での左シフト後代入
>>= ビット単位に右シフト後代入
>>>= ビット単位に符号なし右シフト後代入

ビット単位の論理和では値を2進数に換算して各ビットごとに比較し、どちらかが1ならば1にします。たとえば、6(2進数で110)と5(2進数で101)のビット単位の論理和は7(111)になります。同様にビット単位の論理積では両方が1のときに1にし一方が0ならば0にします。6と5のビット単位の論理積は4(100)になります。
2進数における桁のシフトは左へ1シフトすると2倍(2×1階乗)、左へ2シフトすると4倍(2×2階乗)になり、逆に右へ1シフトすると1/2倍(2×-1階乗)、右へ2シフトすると1/4倍(2×-2階乗)になるというように値が2のn階乗で変化します。


例:
a = 6 | 5;
trace(a); //出力→ 7

b = 6 & 5;
trace(b); //出力→ 4

c = ~2
trace(c) //出力→ -3

d = 4 << 2;
trace(d); //出力→ 16

■記号演算子
スクリプトでは次に示す記号を利用します。+-は算術演算子ですが、符号にも利用します。

記号演算子
+ プラス符号(単項演算子)
- マイナス符号(単項演算子)
() グループ化演算、関数のパラメータを囲む
, ステートメントの区切り
. ドット演算子(メソッド、プロパティ、変数、クラスパス、メンバーへのアクセス)
: タイプの指定
[] 配列演算子、配列アクセス(プロパティ、変数、リニアリストへのアクセス)
{} 配列オブジェクト(連想配列、プロパティリストへのアクセス)
// コメント行区切り記号
/* コメントブロック区切り記号(開始)
*/ コメントブロック区切り記号(終了)

カンマを使えば、同一行に複数のステートメントを区切って書くことができます。通常、カンマはforループステートメントの中で利用しますが、次のように使うこともできます。(forループステートメント → p.??)

例:
a = 1, b = +a;
trace(a), trace(b);

これをセミコロンを使って書くと次のようになります。どちらも同じ結果になります。

例:
a = 1; b = +a;
trace(a); trace(b);

■その他の演算子
その他の演算子として、次のようなものがあります。

その他の演算子
?:  条件演算子(三項演算)
typeof  値のデータ型を調べる(単項演算子)
instanceof インスタンスが指定のクラスかどうかチェックする
void  値を破棄しundefinedを返す(単項演算子)
new  クラスからインスタンスを生成する
delete  変数、インスタンス、プロパティを消去する


?:は「条件式 ? 値1 : 値2;」の3つのオペランドをもった演算子です。条件式がtrueならば値1、条件式がfalseならば値2を返します。

例:
//変数aの値が60以上ならば"合格"、60未満ならば"不合格"とrに代入する
r = (a >= 60) ? "合格" : "不合格";

次のように条件に応じて処理を分岐させる目的でも利用できます。次のサンプルのmy_mcインスタンスをクリックするとcntの値が1からカウントアップされ、10を越えたならば再び1に戻ります。cntの値は出力パネルに書き出されます。

sampleファイル→sankou.fla

例:
//cntが10未満なら1加算し、10以上ならば1を代入する
my_mc.onPress = function() {
 (cnt < 10) ? (++cnt) : (cnt = 1);
 trace(cnt);
};


typeofはデータ型を返す演算子です。typeof(v)のように関数のような記述を目にしますが、実際にはtypeof vのようにカッコは不要です。(データ型 → p.??)

例:
v = "test";
trace(typeof v); //出力→ string

v = new Date();
trace(typeof v); //出力→ object

個別リンク

演算子の優先順位と結合性

スクリプトのステートメントは、左から読んで順に実行するとは限りません。ステートメントの読み方、すなわち演算の実行の順番は、演算子の優先順位と結合性によって決まります。

■演算子の優先順位
同一ステートメントで複数の演算子を使っている場合、演算子の優先順位によって演算の順番が決まります。わかりやすい例としては次のような加減乗除の演算子を使った式があげられます。

例:
a = 8 + 2 * 3 - 10 / 5;

このステートメントでは*と/の優先順位が+と-より高いので、*と/の演算が先に実行されます。これはカッコを使った次の式と同様になります。多くの場合はカッコを使うことで演算の順番をわかりやすく示すことができます。

例:
a = 8 + (2 * 3) - (10 / 5);

■演算子の結合性
演算子の結合性とは、「a = b = c」のように同一の演算子がオペランドをはさんでつながっているときに、右から左へ実行(←)するか、左から右へ実行する(→)かを示すものです。
たとえば、「a = b = c」では=の結合性は「右から左へ」なので、まずbにcの値を代入し、次にaにbの値を代入します。結果として、a、b、cは同じ値になります。カッコを使って書くと「a = (b = c)」のように実行することになります。

例:
a = 1;
b = 2;
c = 3;
a = b = c;
// a、b、cのすべてが3になる

演算子を優先順位が高い順から並べると次のようになります。演算子の結合性は、右から左へと実行していくものを←、左から右へと実行していくものを→と記してあります。


演算子  説明    結合性
+  プラス符号    ←
-  マイナス符号    ←
~  ビット単位の論理否定 (NOT)  ←
!   論理否定 (NOT)    ←
not   論理否定 (NOT)    ←
++   ポストインクリメント    →
--   ポストデクリメント    →
( )    関数(パラメータを囲む)   →
[ ]   配列エレメント    →
.   構造体メンバー参照    →
++   プリインクリメント   ←
--  プリデクリメント   ←
new  オブジェクトの割り当て   ←
delete  オブジェクトの割り当て解除  ←
typeof  オブジェクトの種類   ←
void  未定義の値を返す   ←
*  乗算     →
/  除算     →
%  剰余     →
+  加算、 ストリングの連結  →
add  ストリングの連結   →
-  減算     →
<<  ビット単位の左シフト   →
>>  ビット単位の右シフト   →
>>>  ビット単位の右シフト (符号なし)  →
<  より小さい    →
<=  以下     →
>  より大きい    →
>=  以上     →
instanceof インスタンス    →
lt  より小さい    →
le  以下     →
gt  より大きい    →
ge  以上     →
==  等しい     →
!=  等しくない    →
eq  等しい     →
ne  等しくない    →
&  ビット単位の論理積 (AND)  →
^  ビット単位の排他的論理和 (XOR)  →
|  ビット単位の論理和 (OR)   →
&&  論理積 (AND)    →
and  論理積 (AND)    →
||  論理和 (OR)    →
or  論理和 (OR)    →
?:  三項演算    ←
=  代入     ←
*=、/=、%=、 複合代入    ←
+=、-=、&=、
|=、^=、<<=、
>>=、>>>=
,   カンマ     →

個別リンク

定数とエスケープ記号

定数として扱える値には次のようなものがあります

定数(プロパティを含む)
true  真(falseの逆を示すブール値)。数値コンテキストでは1と評価される
false  偽(trueの逆を示すブール値)。数値コンテキストでは0と評価される
Infinity 正の無限大
-Infinity 負の無限大
null  値がないことを示す特別な値
undefined 未定義を示す特別な値
newline  キャリッジリターン(改行コード)
Key.BACKSPACE BackSpaceキーのキーコード値 (8)
Key.CAPSLOCK CapsLockキーのキーコード値 (20)
Key.CONTROL Ctrlキーのキーコード値 (17)
Key.DELETEKEY Deleteキーのキーコード値 (46)
Key.END  End キーのキーコード値 (35)
Key.ENTER Enter キーのキーコード値 (13)
Key.ESCAPE Esc キーのキーコード値 (27)
Key.HOME Home キーのキーコード値 (36)
Key.INSERT Ins キーのキーコード値 (45)
Key.PGUP PageUpキーのキーコード値 (33)
Key.PGDN PageDownキーのキーコード値 (34)
Key.SHIFT Shiftキーのキーコード値 (16)
Key.SPACE スペースバーのキーコード値 (32)
Key.TAB  Tabキーのキーコード値 (9)
Key.RIGHT 右向き矢印キーのキーコード値 (39)
Key.LEFT 左向き矢印キーのキーコード値 (37)
Key.UP  上向き矢印キーのキーコード値 (38)
Key.DOWN 下向き矢印キーのキーコード値 (40)
Math.E  自然対数の基底e
Math.PI  円周率
Math.LN2 2の自然対数
Math.LN10 10の自然対数
Math.SQRT1_2 1/2の平方根
Math.SQRT2 2の平方根
Number.MAX_VALUE 最大の数値(約1.79E+308)
Number.MIN_VALUE 最小の数値(約5e-324)
Number.NaN  非数 (NaN)を表す値
Number.POSITIVE_INFINITY 正の無限大。Infinityと同じ
Number.NEGATIVE_INFINITY 負の無限大。-Infinityと同じ

nullとundefinedを等価演算子==で比較すると結果はtrue になります。厳密な等価演算子===で比較するとfalseになります。また、Flash Player 6以前用にパブリッシュされたファイルでは、undefined.toString()は "" (空のストリング)になりますが、 Flash Player 7以降用にパブリッシュされたファイルではundefinedになります。

note:
NaN (Not a Number:非数) は定義済みの変数という分類になります。voidは演算子の分類です。


改行コードやタブ文字など、通常では表記できない文字列を\を使ったエスケープ記号を使って記述できます。

エスケープ記号
\b バックスペース
\f 改ページ
\n 改行
\t タブ
\" "
\' '
\\ \
\000 - \377 1バイトを8進数で表記
\x00 - \xFF 1バイトを10進数で表記
\u0000 - \uFFFF ユニコード(16ビットを16進数で表記)

個別リンク

ムービークリップインスタンスの参照

ActionScriptでは、ムービークリップシンボルのインスタンスのプロパティの値を変更することで位置を動かしたり大きさを変えるといったアニメーションを行います。インスタンスのプロパティの値を調べたり変更するにはドット演算子(.)または配列演算子([])を使って目的のインスタンスのメソッドやプロパティを指し示します。ドット演算子の場合にはドットに続いて識別子を直接書くのに対し、配列演算子を使う場合には["識別子"]のようにストリングにします。
たとえば、メインのタイムラインにmy_mcというインスタンスがある場合には、次のようになります。

例:
ドット演算子を使ったとき
_root.my_mc
配列演算子を使ったとき
_root["my_mc"]

my_mcのプロパティ_x(水平座標)の値を150に設定する式は次のようになります。

例:
ドット演算子を使ったとき
_root.my_mc._x = 150;
配列演算子を使ったとき
_root["my_mc"]._x = 150;

配列演算子を使えばインスタンス名を変数で指定できるので、参照するインスタンスを次のように動的に指定できます。

例:
targetMC = "my_MC";
_root[targetMC]._x = 150;

これまではeval()関数を使っても同様のことができましたが、Flash 5以降では参照式にeval()関数を書くことはできなくなりました。

例:
targetMC = eval("myMC" + 1);
_root.targetMC._x = 150; // 成功

// Flash 5以降ではエラー
_root.eval("myMC" + 1)._x = 150;

note:
Flash3とFlas4ではインスタンスの参照にスラッシュシンタックスが利用されていました。スラッシュシンタックスはFlash Player 7でも動作しますが使用を推奨されていません。ActionScript2.0ではスラッシュシンタックスをサポートしていません。


■_root
ムービークリップシンボルのインスタンスを特定するために、インスタンス名、_root、this、_parent、およびlevelというキーワードを使います。まず、ムービー自身を_rootで指します。ステージに置いたムービークリップは_rootの下にあることになります。たとえば、ステージに置いたムービークリップのインスタンス名がTVならば、

_root.TV

のように指します。このとき、インスタンス名の大文字小文字を区別するので注意してください。名前がTVのときにtvでは参照できません。TVの中にscreenというインスタンス名のムービークリップが入れ子で入っている時screenは、

_root.TV.screen

になります。TVの中のeyeというインスタンス名のムービークリップは、

_root.TV.eye

のように指すことができます。このような参照方法をドットシンタックスと呼びます。ドット演算子(.)は「の」と置き換えて読むとわかりやすいでしょう。「_root.TV.screen」は「_rootのTVのscreen」です。
 これを配列演算子を使って書くと次のようになります。このほうが便利な場合もあるので合わせて覚えてください。こちらはブラケットアクセスと呼びます。

_root["TV"]["eye"]

図3-1-1 ステージにTVというインスタンス名のムービークリップがあり、その中にscreenとeyeというインスタンスが入れ子で入ってます。

なお、MovieClipLoader.loadClip()メソッドまたはloadMovie()関数でインスタンスに別のswfを読み込んで表示する場合には_root参照について注意が必要です。インスタンスにswfを読み込むと、そのswfはインスタンスと入れ替わってしまうので、swfが元々参照していた_rootとは変わってしまいます。読み込まれたswf内での_rootの参照がずれないようにするには、次のように_lockrootプロパティをtrueに設定します。(_lockrootプロパティ→p.??)

//インスタンスtvに読み込んでもswfの_root参照がずれないようにする
this._lockroot = true;


note:
クラスから生成したオブジェクトをインスタンスといいますが、ここではシンボルをステージに配置して作ったインスタンスについて書いています。_root、_parent。_levelはムービークリップシンボルの階層を示す場合にのみ使用されます。

■this(ムービークリップのインスタンスの場合)
thisは、ムービークリップアクションやフレームアクションが設定されているムービークリップのインスタンス自身を指します。「_root.TV.eye」といった参照は階層を_rootからたどった絶対位置で指し示すものですが、これに対してthisは自分を相対的に示します。
たとえば、ムービークリップシンボルのTVインスタンスに設定してあるonClipEventオブジェクトアクションの中に「this._x」とあるとき、これはTVのx座標を指します。つまり「_root.TV._x」と同じです。もし、TVインスタンスが_rootのすぐ下ではなく、別のムービークリップの中に入れ子になっていたとしても、やはりthisはTVを指します。同様にthis._xがインスタンスeyeに設定してあるオブジェクトアクションの中にあればthisが指すものはeyeであり、this._xはeyeのx座標を指します。このようにthisはまさしく「これ」です。this._xは「これのx座標」と言い換えることができます。(onClipEvent→p.??)

//thisはムービークリップアクションを設定してあるインスタンスを指す
onClipEvent (enterFrame) {
  r = (r+0.3) % (2*Math.PI);
  this._xscale = 100*Math.sin(r);
}

インスタンスのイベントハンドラやメソッドを設定するfunctionブロックの内側にあるthisもそのインスタンスを指します。次のスクリプトはメインのタイムラインのフレームアクションに書かれています。上のハンドラはchoインスタンスにonEnterFramイベントハンドラを設定しています。この中のthisはchoインスタンスを指します。下のハンドラはmushiインスタンスにonPressイベントハンドラを設定しています。この中のthisはmushiインスタンスを指します。(フレームアクション→p.??)

//自動的にchoインスタンスが回転
cho.onEnterFrame = function() {
  this._rotation += 5;
};

//mushiインスタンスをクリックすると回転
mushi.onPress = function() {
  this._rotation += 5;
};

■this(ボタンのインスタンスの場合)
ボタンのインスタンスに設定したオブジェクトアクションについては注意が必要です。ボタンに設定してあるonハンドラの中でthisが指すものはボタンのインスタンス自身ではありません。thisはボタンが置いてあるインスタンスを指します。次のスクリプトを設定してあるボタンをクリックすると、ボタンが回転するのではなく、ボタンが置いてあるムービークリップのインスタンスが回転します。(onハンドラ→p.??)

//ボタンが置かれているインスタンスが回転する
on (press) {
  this._rotation += 5;
}


ボタンもインスタンス名をつければフレームアクションからイベントハンドラを設定できます。この中で指すthisはボタンのインスタンスになります。たとえば、ボタンのインスタンス名がmy_btnであるとき、ボタンが置いてあるタイムラインのフレームアクションに次のスクリプトを書きます。この場合にはthisが指すものはボタンのインスタンスなので、ボタンをクリックするとボタン自身が回転します。

//ボタンをクリックするとボタン自身が回転する
my_btn.onPress = function(){
  this._rotation += 5;
}

ボタンをクリックして別のムービークリックインスタンスを回転させるには、thisではなく、回転させたいインスタンスを指し示すようにします。

//my_btnボタンをクリックするとmushiインスタンスが回転
my_btn.onPress = function(){
  _root.mushi._rotation += 5;
}


■_parent
_parentは相対的に1つ上の階層のインスタンスを指します。さらにその上のインスタンスならば、_parent._parentというように上の階層へたどることができます。
あるムービークリップから見た時に、それが置いてあるムービークリップは_parentになります。自分が置いてあるタイムラインのフレームアクションで定義してあるメソッドや関数にアクセスするには、_parent.mymethod()のように参照することになります。

■_level
loadMovieNum()アクションを使うことで、現在のムービーに別のswfを読み込んで重ねて表示することができます。このときのムービーの重なりを_levelで示します。通常の1つしかムービーがない状態の大元のレベルが_level0になります。この上に重ねて読み込んだムービーを、_level1、_level2、_level3...のように指します。
_rootは各レベルのタイムラインを参照しています。したがって通常は_rootと_level0は同じです。しかし、実際には複数のムービーを重ねて表示しているとき、それぞれの_levelに_rootがあります。

note:
ムービークリップに別のswfやJPEGを読み込んで差し替える場合にはMovieClipLoader.loadClip()メソッドまたはloadMovie()関数を利用します。

■指定がない場合
_root、this、_parentといった指定がない場合には、スクリプトが書かれているインスタンスを指します。メインのタイムラインのフレームアクションならば、指しているのは_rootと同じになります。ムービークリップのタイムラインのフレームアクションやオブジェクトアクションならばthisはそのムービークリップのインスタンスを指します
たとえば、次の例では_rotationが参照するのはchoインスタンスが配置されているタイムラインを指します。メインのタイムラインにchoが置いてあるならば、_root._rotationと同じになるのでステージ全体が回転します。choが別のムービークリップの中に入っているのならば、choを含んでいるインスタンスが回転します。

//choが置かれているステージ全体が回転
cho.onEnterFrame = function() {
 _rotation += 5;
};


図3-1-2 インスタンスC_mcを基準(this)にすると相対的な参照はこのようになります。

個別リンク

インスタンスのプロパティ

プロパティとはインスタンスごとの設定値です。座標、伸縮率、幅など、いろいろな設定値があります。ほとんどのプロパティは値を読み取るだけでなく、値を設定して変更できます。さらに、変数もまたインスタンスのプロパティと解釈できます。そこで変数へのアクセスもプロパティへのアクセスと同様に考えることができます。すでに何度か例を示していますが、プロパティの参照にはドット演算子または配列演算子を使います。

例:
// photo_mcインスタンスのx座標を100に移動します。
photo_mc._x = 100;
photo_mc["_x"] = 100;

// buyインスタンスの透明度を60%にします。
_root.shop.buy._alpha = 60;
_root["shop"]["buy"]["_alpha"] = 60;

//このインスタンスの横幅を50ピクセルにします。
this._widh = 50;
this["_widh"] = 50;

//photo_mcの変数modeの値をtrueに設定します。
photo_mc.mode = true;
photo_mc["mode"] = true;

個別リンク