ActionScript (アクションスクリプト)
ActionScript (アクションスクリプト) とは、 EcmaScript をベースとしたFlash用のスクリプト言語の事です。
Flashで ActionScript を使用する事によって、ゲームプログラミングや数値計算などといった高度な処理を行う事が出来るようになります。
ParaFla! や Suzuka で使用することができる ActionScript は、Adobe Flash (Macromedia Flash) 本来のスクリプトとは一部仕様が異なっているところがあり、
この理由で、「 ParaFla!Script 」と呼ばれることもあります。
(ActionScript のコンパイルには ParaFla! 、 Suzuka 共にaclib.dllを使用しています。)
プログラミングやスクリプトを初めて経験する人にとっては、はじめは難しく感じられるかもしれません。
もし JavaScript などのスクリプトを扱ったことがあれば、感じを掴みやすいと思います。
ActionScript が使えるようになれば、Flashの操作入力やゲーム制御など制作の幅が広がるので、興味のある人はぜひ勉強してみてください!
このページではまず ActionScript の書き方(構文)から具体的な処理の仕方について解説していきます。
ただし、筆者はプログラミングのプロではありませんので、もしかしたら一部誤っている部分や、間違った用語を使っている可能性があります。
なるべくこのようなことがないように努めていますが、もしこれらを見つけた方はご連絡していただけると助かります。
■ INDEX 1.アクションスクリプトの基本的構文 (SWF6〜8)
1.1.イベントハンドラ 1.2.スクリプトの記述 1.3.スクリプトにコメントを入れる 2.アクションスクリプトでのデータ処理 (SWF6〜8)
2.1.データの種類 2.2.変数 2.3.式の計算 3.アクションスクリプトでの処理 (SWF4) 4.その他 |
1.アクションスクリプトの基本的構文 (SWF6〜8)
1.1.イベントハンドラ
ActionScript は、決められた構文に従って記述しなければいけません。
書き方が間違っている場合はエラーが発生し、スクリプト( スプリクトではありません )を実行する事はできません。
まずは、正しい文法を覚えていきましょう。
ちなみに、スクリプトは全て、半角アルファベット(と記号)で記述していきます。
全角だとエラーになってしまうので注意してください。
ParaFla! 、Suzuka で扱う ActionScript には、3つの種類があります。
フレームアクション | 1フレームで実行するスクリプト |
ボタンアクション | ボタンの動作を記述するスクリプト |
クリップアクション | スプライトに記述するスクリプト |
"フレームアクション" は、
ParaFla! の場合「イベントリスト」を右クリックし、「アクションを挿入」から「スクリプト」を選ぶことで作成でき、
Suzuka の場合「レイヤーリスト」を右クリックし、「アクションレイヤーを挿入」することで作成できます。
1フレームの間しか実行されないので、繰り返し実行させたい時は「ラベルへジャンプ」などを使用して何度もイベントを実行してください。
"ボタンアクション" は、
ParaFla! の場合「イベントのプロパティ」で「ボタンにする」にチェックを入れ、「スクリプト」を選んだ場合、
Suzuka の場合「ボタン」を作成し、「レイヤーに追加」した場合です。
ボタンアクションでスクリプトを記述するには、まず「ボタンイベントハンドラ」というものをはじめに記述する必要があります。
「イベントハンドラ」というのは、『ボタンを押した』、『マウスカーソルがボタンの上にのった』など、
特別な動作が発生した時に、特定の処理を行うものです。
ボタンイベントハンドラにもさまざまな種類がありますが、まず代表的なものは次の2つです。
on(press){}
on(release){}
『on(press)』(オンプレス)はボタンを押した瞬間、
『on(release)』(オンリリース)はボタンを押していて、離した瞬間の処理を行えます。
『{』から『}』の間に書かれたものが実行されるので、「{ 〜 }」の中に行いたい処理を自分で記述していきます。
両方のイベントハンドラだけをまず記述すると、以下のようになります。
on(press){
}
-
on(release){
}
イベントハンドラは、自分で使用したいものだけ記述すれば十分ですが、複数記述する場合は、
上記のようにイベントハンドラ同士の間に「-」(ハイフン)を記述しなければいけません。
例えば、イベントハンドラを3つ記述したら、イベントハンドラの間の2箇所にハイフンだけの行を作る必要があります。
ただし、Suzuka はこのハイフンだけの行を省略できるので、記述する必要はありません。
その他のボタンイベントハンドラは以下のようなものがあります。
on(rollOut){ } | マウスカーソルが離れたら |
on(rollOver){ } | マウスカーソルが上に乗ったら |
on(releaseOutside){ } | ボタンの上でクリックしたまま、マウスカーソルをボタンの外に移動させてクリックを離したとき |
"クリップアクション" はスプライトにスクリプトを記述する場合です。
クリップアクションにも、ボタンアクションと同じように「イベントハンドラ」が必要になります。
クリップアクションでは「クリップイベントハンドラ」というイベントハンドラを記述します。
onClipEvent(load){ } | スプライトが表示された1フレーム目にだけ処理する |
onClipEvent(enterFrame){ } | 表示されて2フレーム目以降、スプライトが存在している限り毎フレーム処理する |
イベントハンドラだけ記述すると以下のようになります。
onClipEvent(load){
}
-
onClipEvent(enterFrame){
}
複数のハンドラを記述する場合、ParaFla!は間にハイフンを入れなければならなかったり、
『{』から『}』の間に記述したものが実行されるというのは、ボタンイベントハンドラを同じです。
ちなみに、「onClipEvent(load)」を記述せず、「onClipEvent(enterFrame)」だけ記述した場合、
1フレーム目から「onClipEvent(enterFrame)」が実行されます。
その他、主なクリップイベントハンドラは以下のようなものがあります。
onClipEvent(MouseMove){ } | Flashの画面上でマウスカーソルが動くたびに処理する |
他にも多くの種類がありますが、ここでは省略します。調べてみてください。
また、クリップアクション(つまりスプライト)にはボタンイベントハンドラも記述する事ができます。
1.2.スクリプトの記述
スクリプトを記述する時には、空白(スペース)、タブ、改行を入れて見やすく記述したほうが良いのですが、全く入れなくても動作上は問題ありません。
on(press) {
}
on(press){
}
on(press){}
これらはどれも、構文上は正しいイベントハンドラの記述ですが、
可読性を向上させるためにも、なるべくスペースやタブ、改行を入れてすっきりと、見やすく記述することをオススメします。
少なくとも、一番上の例のような書きかたは見づらいのでやめたほうが良いです。
1.3.スクリプトにコメントを入れる
スクリプトには、注釈(コメントや説明書き)などを入れることが出来ます。
// | 「//」以降の同じ行の文字を全てコメントにする |
/* */ | 「/*」から「*/」までの間に囲んだものを全てコメントにする(複数行可) |
コメントにした文章は、スクリプトから無視され、実行されないので、その部分の説明やコメントなどを書く場合に便利です。
on(press){ //ボタンを押した時
//ここに処理を書く
}
/*
-
on(press){
使わないハンドラをコメントアウト
}
*/
上記のように使用します。(緑色で示した部分がコメントになっています。)
1.4.関数、メソッドを使う
ここから実際に、ActionScript で処理を行うための記述を解説します。
まず、スクリプトには「関数」と、「メソッド」(メゾットではありません)というものが存在します。
何がそれぞれどう違うのかということは考えず、今はとりあえず『同じもの』と考えてください。
では、「関数、メソッド」とは何かというと、あらかじめスクリプトが持っている機能のことです。
それらの機能を呼び出すことによって、簡単にスクリプトで処理を行えるというわけです。
関数には以下のようなものがあります。
gotoAndPlay() | アクションの「ラベルへジャンプ」「フレームへジャンプ」と同じ処理 |
play() | アクションの「再生」と同じ処理 |
stop() | アクションの「停止」と同じ処理 |
まず『gotoAndPlay()』から説明します。
これは、「アクション」にある「ラベルへジャンプ」「フレームへジャンプ」と同じ処理を行う事ができます。
しかし、「ラベルへジャンプ」したい場合にはどのラベルにジャンプするのかというラベル名を、「フレームへジャンプ」したいときには度のフレームにジャンプするのかというフレームを指定しなければいけません。
でも、ActionScript では、ラベル名やフレームを入力するようなボックスはでてきてくれません。
そこで、関数に「引数(ひきすう)」という値を指定してやります。
『gotoAndPlay()』に、引数としてラベル名やフレームを指定します。
その引数はどこに書けばいいのかというと、まず下の図を見てください。
gotoAndPlay ()
関数は、上記の傍線部のようにアルファベット+括弧で表わされています。
「gotoAndPlay」の部分は関数の名前で、引数は「( )」の中に指定します。
例えば、40フレーム目にジャンプしたい場合は、そのカッコの中に「40」と書きます。
gotoAndPlay(40);
関数の最後に「; (セミコロン)」がついていますが、
これはスクリプトでひとつの処理の終わりをあらわすもので、必ず必要です。
関数などの処理の最後には必ず記述するようにしてください。
ラベル名も数値と同じようにカッコの中にそのまま書いていいのかというと、
ラベル名のような「文字列のデータ」を書くときにはある規則従って書かなければいけません。
例えば、「ムービー」という名前のラベルにジャンプしたい場合は、以下のようにします。
gotoAndPlay("ムービー");
数値のときとは違って、ラベル名を「" (ダブルクォーテーション)」で囲みます。
ActionScript では、関数の引数だけでなく文字列のデータを記述する際には、必ず文字列を「"」で囲んでください。
また、「"」ではなく「' (シングルクォーテーション、アポストロフィ)」でもOKです。
gotoAndPlay('ムービー');
ちなみに、文字列を「"」又は「'」で囲まなければいけないということは、
囲む文字列の中に「"」又は「'」の文字を記述できないことになりますが、それについては後ほど説明します。
さて、gotoAndPlay 関数の場合はラベル名やフレームを引数に指定して、関数がその引数の通りに処理してくれましたが、
引数の指定が必要の無い関数もあります。先ほど紹介した「play()」関数と「stop()」関数などがそうです。
これは、「アクション」の「再生」「停止」と同じ処理をします。
関数を呼び出すときには、引数を指定せずに「play();」と書くだけでOKです。
ここで、SWFのバージョンについての説明します。
「gotoAndPlay」関数は、「A」「P」が大文字で、その他は小文字になっています。
SWFのバージョンによっては、この大文字小文字を正しく記述しないと動かなかったりします。
例えば「gotoAndPlay」関数を、SWF6だと「gotoandplay」や「GOTOANDPLAY」と記述しても動きますが、
SWF7や8では「gotoAndPlay」と、正しく記述しないと動きません。
SWF7や8で戸惑わないように、普段からなるべく大文字小文字を正しく記述する癖をつけましょう。
1.5.ターゲット
ActionScript はさまざまな場所に記述できるので、記述する場所によって効果の対象が変わってきます。
たとえば、メインのイベントに「stop()」と記述した場合、メインのイベントの再生が停止されますが、
メインではなく、スプライトの中のイベントに「stop()」と記述した場合、スプライトの再生が停止されます。
では、メインのイベントからスプライトのイベントの再生を停止させたいときはどうすればいいでしょうか。
ActionScript では「ターゲット」というものを使って、関数を実行する対象を指定してやることで、関数の処理を他のスプライトに実行する事ができます。
スプライトの「イベントのプロパティ」(Suzuka の場合は「レイヤーのプロパティ」)に、「インスタンス名」というテキストボックスがあるので、
ここに、そのスプライトの名前を入力してください。その名前が、住所のような役割をしてくれます。
インスタンス名には、半角英数字と「_」(アンダースコア)が使用できるので、自分の好きな、わかりやすい名前を付けてください。
ターゲットを指定するには、関数の前に「.」(ドット)で区切ってインスタンス名を記述します(ドットシンタックス)。
例えば、メインのイベントのフレームアクションから、「sp1」というインスタンス名をつけたスプライトを停止したい場合は、以下のようにします。
sp1.stop();
更に、「sp1」というインスタンス名をつけたスプライトの中に配置した、「sp2」というインスタンス名をつけたスプライトを停止したい場合は以下のようになります。
sp1.sp2.stop();
スプライトには、自由にインスタンス名をつけることができましたが、メインのイベント(親イベント)には「_root」(ルート)という名前がもともとついていて、変えることは出来ません。
今までとは逆に、スプライトの中のフレームアクションから、メインのイベントの再生を停止したい場合は以下のようにします。
_root.stop();
以下はいろいろなターゲットの指定です。
_root.abc.stop(); //メインのイベントにあるスプライト「abc」を停止
def.ghi.jkl.play(); //スプライト「def」にあるスプライト「ghi」にあるスプライト「jkl」を再生
_root.mno.gotoAndPlay("スタート"); //メインのイベントにあるスプライト「mno」にあるラベル「スタート」にジャンプ
逆に、ターゲットからスプライトの構造がどうなっているのかを知ることも出来ます。
例えば、ターゲットが[_root.spo.spt.as.take]となっていたら、
メインのイベントにあるスプライト「spo」の中に、スプライト「spt」があり、
その中にあるスプライト「as」の中にあるスプライト「take」を指定している、ということが読み取れます。
ターゲットには他にも、「_root」のような決まった意味を持つものがあります。
this | (ディス)自分自身を指定 |
_parent | (ペアレント)自分が配置されているスプライトを指定 |
「this」は、自分自身を指すターゲットです。
ターゲットを指定していない時は、自分を指定していることになるので、
・ stop(); <==> this.stop();
・ abc.play(); <==> this.abc.play();
上記の2つは、それぞれ同じ意味になるわけです。
「_parent」は、自分が配置されているスプライトを指すターゲットです。
例えば、メインのイベントにあるスプライト「abc」で「_parent」を指定すると、
スプライト「abc」はメインのイベントに配置されているわけなので、「_parent」は「_root」を指定することになります。
また、メインのイベントにあるスプライト「abc」にあるスプライト「def」で「_parent」を指定した場合は、
スプライト「def」はスプライト「abc」に配置されているわけなので、「_parent」はスプライト「abc」を指します。
「_parent」を重ねると、さらに上の階層を指定できます。
つまり、「def」で「_parent._parent」と指定すると、「_root」を指す事になります。
ただし、「this」と「_parent」は、フレームアクション/ボタンアクションに記述する場合とクリップアクションに記述する場合では、指されるものが異なるので注意が必要です。
_root.abc.tam
例えば、スプライトが上記のように、メインのイベントにスプライト「abc」があり、
更にその中にスプライト「tam」が存在する、という構造になっていたとき、
「_root.abc」のスプライト内でフレームアクション、またはボタンアクションで「this」と指定すると、
指定されるのは「_root.abc」になりますが、
「_root.abc」に配置してあるスプライト「tam」のクリップアクションで
「this」としたときに指定されるのは「_root.abc.tam」になります。
同様に、「_root.abc」のスプライト内でフレームアクション、またはボタンアクションで「_parent」と指定すると、
指定されるのは「_root」になり、
「_root.abc」に配置してあるスプライト「tam」のクリップアクションで「_parent」とすると、
指定されるのは「_root.abc」になります。
これらから、「_root」はどこに記述してもメインのイベントを指すのに対し、
「this」と「_parent」は記述する場所によって何を指すのかが変わってきます。
このことから、「_root」を使って絶対的にターゲットを指定することを「絶対指定」、
「this」や「_parent」を使って相対的にターゲットを指定することを「相対指定」と呼んだりします。
1.6.まとめ
それでは、最後に要点をまとめてみましょう。
- ActionScript には、フレームアクションとボタンアクションとクリップアクションがある。
- フレームアクションにはイベントハンドラが必要ないが、ボタンアクションとクリップアクションには必要。
- ParaFla!ではイベントハンドラの間に『 - 』(ハイフン)だけの行が必要。Suzuka では必要ない。
- スクリプトにはスペースやタブ、改行を適度に入れて、見やすく記述する。
- 『 // 』『 /* */ 』を使用してスクリプト中にコメントを入れることが出来る。
- 関数、メソッドに引数を指定すると、あらかじめ決まっている処理を行ってくれる(引数がいらないものもある)。
- 数値のデータを記述するときはそのまま記述してもいいが、文字列のデータを記述する時はその文字列を『 " 』で囲む。
- 関数、メソッドを実行する対象は、インスタンス名をドットで区切ったターゲットで指定する。
では、これらを踏まえたスクリプトの例を挙げてみます。
○メインのイベント( _root )に配置したボタンアクション
on(release){ //ボタンをクリックして離したら
this.stop(); //_rootの再生を停止
this.main.play(); //_rootに配置したスプライト「main」を再生
}
○フレームアクション
gotoAndPlay("メイン"); //ラベル「メイン」にジャンプ
○メインのイベント( _root )に配置したスプライトのクリップアクション
onClipEvent(load){ //スプライトが表示されたら
_parent.stop(); //_rootの再生を停止
}
-
on(press){ //スプライトがクリックされたら
_parent.play(); //_rootを再生
}
基本的な構文は、以上のようになります。
2.アクションスクリプトでのデータ処理 (SWF6〜8)
2.1.データの種類
ここから、本格的に ActionScript でのデータ処理を解説していきます。
ActionScript で扱うデータにはさまざまな種類があり、
大きく分けると次の4つになります。
- 数値型
- 文字列型
- 論理型
- オブジェクト型
数値と文字列については、関数のときにも使ったと思います。
●数値( Number:ナンバー )
名前の通り、数値を表すデータです。
「5」や「-25」、「0.000032」などが該当します。
●文字列( String:ストリング )
文字列を表すデータです。
文字列のデータは、『"』又は『'』で囲む必要があります。
囲まれていないと、文字列のデータとして認識されません。
●論理( Boolean:ブーリアン/ブール )
「はい」か「いいえ」のどちらか片方を表すデータで、
「true (トゥルー)」 と 「false (フォルス)」 の2つがそれぞれ Yes 、 No を表します。
true | 「はい」の意味。真 <しん>。 |
false | 「いいえ」の意味。偽 <ぎ>。 |
関数の引数の指定に「true」と「false」を使う事があるので覚えておいてください。
「true」と「false」は文字列のデータではないので『"』で囲んではいけません。
ちなみに、数値の 0 は false 、 1 は true と同じ意味を持ちます。
●オブジェクト( Object:オブジェクト )
これについては後ほど説明します。
ActionScript には、これらのデータを格納するための入れ物があり、これを『変数』といいます。
2.2.変数
変数は、データを格納しておくための入れ物です。
変数を使用するためには、まず変数の名前を考える必要があります。
変数名には半角英数字と「_」(アンダーバー)が使用できます。
「suuzi」や「moji」、「my_hensu」などのわかりやすい名前にするといいと思います。
ただし、SWF6では「suuzi」と「SUUZI」のように大文字小文字が異なっても同じ変数として扱われますが、
SWF8では別々の変数として扱われてしまうので注意してください。
変数には好きなデータを格納することができますが、ひとつの変数に同時に格納しておけるものは1つだけです。
例えば、「suuzi」という名前の変数を作成して、「123」という数値を格納する場合、スクリプトの記述は以下のようになります。
suuzi = 123;
真ん中にある「=」は「代入演算子」といって、「右に書いたデータを左の変数に格納する」という意味になります。
このように、「変数にデータを格納する事」を「代入」(変数代入)といいます。
代入もスクリプトのひとつの処理なので、最後に「;」(セミコロン)が必要です。
それぞれ別々の変数を作りデータを代入すると、以下のようになります。
suuzi = 12;
moji = "変数に代入";
flag = true ;
同じ変数に別のデータを代入すると、変数はひとつのデータしか格納することができないので、
それまでに代入されたものは消えて、最後に代入したもののみが格納されます。
suuzi = 3;
suuzi = 5;
suuzi = 2;
スクリプトは上の行から順番に実行されていくので、
この場合、最終的に変数「suuzi」に代入されている値は「2」となります。
(ちなみに ParaFla! や Suzuka の ActionScript では、変数にどのデータを代入するか、という型指定を定義する必要がありません。)
2.3.式の計算
数値のデータの場合、「演算子」を使用して計算式を記述する事によって、四則演算を行う事ができます。
変数に代入するデータの部分に計算式を書くと、計算された結果が変数に代入されます。
suuzi = 1 + 4;
この場合、変数「suuzi」には「5」が代入されます。
計算式に用いる「演算子」には、以下のようなものがあります。
+ | 足し算。和。 |
- | 引き算。差。 |
* | 掛け算。積。 |
/ | 割り算。商。 |
% | 剰余(割り算の余り)。 |
『(』、『)』で囲まれた部分を先に計算したり、和や差の計算よりも積や商の計算のほうが優先順位が高く先に計算される、といった計算法則なども数学と同じです。
suuzi = 1 * 5 + 6;
suuzi = 6 / 3 * (2 + 4);
suuzi = 5 * 3 + 10 / 5;
suuzi = 10 % 3;
上記のような計算式では、変数「suuzi」に代入される値は上から順にそれぞれ「11」、「12」、「17」、「1」になります。
2.4.いろいろな計算の記述
計算式の中には、変数を含める事もできます。
変数の中に格納されているデータが数値の場合、その数値が計算式に組み込まれます。
pt = 5;
suuzi = 3 + pt - 2;
上記のような式では変数「suuzi」に「6」が格納されます。
変数の中に格納されているデータが数値でない場合、計算はできません。
上記と同じ要領で、『今現在、変数に代入されている数値に「5」を足す』場合は以下のように計算式を記述します。
suuzi = suuzi + 5;
もともと変数「suuzi」に「7」が代入されていたとすると、変数「suuzi」の中身は「12」になります。
また、上記のような計算の記述は、以下のように簡略化することが可能です。
A = A + B | A += B | 変数AとBを足した数値を変数Aに代入 |
A = A - B | A -= B | 変数AからBを引いた数値を変数Aに代入 |
A = A * B | A *= B | 変数AとBをかけた数値を変数Aに代入 |
A = A / B | A /= B | 変数AをBで割った数値を変数Aに代入 |
はじめの例の記述を簡略化させると、以下のようになります。
suuzi += 5;
どちらも同じ意味なので、自分の好きな方法で記述してください。
また、変数の内容に「1」だけ足したい、又は、引きたいという場合は、さらに以下のように記述する事ができます。
A = A + 1 | A ++ | 変数Aに1を足して変数Aに代入(インクリメント) |
A = A - 1 | A -- | 変数Aから1を引いて変数Aに代入(デクリメント) |
1だけ足したり引いたりしたい場合は、これらを使用すると楽になると思います。
suuzi ++;
suuzi --;
SWF4/6 と SWF7/8 では、変数に何も入れていない状態での計算の処理が異なるので注意が必要です。
たとえば、ある変数に何も代入されていない状態でその変数をインクリメント(デクリメント)した場合、
SWF4/6 では何も代入されていない状態が 0 とみなされ、結果的に変数の内容は 1 ( -1 ) になりますが、
SWF7/8 では何も代入されていない状態が undefined になるので、数値の計算はできません。
なので、まず 0 などの数値を代入してから計算をする必要があります。
2.5.文字列の計算
変数に代入されているデータが文字列の場合、
別々の変数に入っている文字列を演算子『+』で結合する事ができます。
+ | 文字列の結合をします。 |
moji = "も" + "じ";
上記のようにすると、変数「moji」には「もじ」という文字列が格納されます。
str = '文字列';
str2 = '結合';
moji = str + 'の' + str2;
上記の場合は、変数「moji」に「文字列の結合」という文字列が格納されます。
文字列のデータでは、引き算や掛け算などの演算を行うことは出来ません。
2.6.変数の表示
変数に代入したデータを、テキストとしてFlash内に表示することが出来ます。
テキストの「ファイルのプロパティ」(Suzuka は「テキストのプロパティ」)を開き、「変数名」という欄に変数の名前を入力してください。
これで、そのテキストに、指定した変数に格納されているデータが表示されるようになります。
テキストのフォントがデバイスフォント(フォント名の一文字目が"_"のフォント)以外のフォントの場合は、
「ダイナミックテキスト」のチェックをいれることによって「変数名」の入力欄が現れ、デバイスフォントと同じように扱うことが出来ますが、
この場合は「ファイルのプロパティ」のテキストフィールド(Suzuka は「テキストのプロパティ」の「埋め込みテキスト」)に入力してある文字しか表示できません。
テキストフィールドに入力されていない文字は、変数にデータが格納されていても、表示することはできません。
あらかじめテキストフィールドに、その変数に代入する可能性のある文字列を全て入力しておかなければいけません。
2.7.特殊文字の挿入
文字列のデータに特殊文字を含めると、変数の内容をテキストで表示するときなどに改行して表示したりする事ができます。
\n | 改行( Line Feed ) |
\r | 改行( Carriage Return ) |
\\ | 『\』の文字 |
\" | 『 " 』の文字 |
\' | 『 ' 』の文字 |
\t | タブ(空白)文字 |
例えば、
moji = "1行目\n2行目";
このように、代入する文字列の間に「\n」(\r)を入れると、
テキストで表示した時に「\n」(\r)を入れた場所で、以下のように改行することができます。
1行目
2行目
また、「\」という文字には文字化けを修正する効果もあり、
文字列が文字化けしてしまう場合は、おかしく表示される文字の前に「\」を入れることで、正しく表示できる場合があります。
moji = "もじ\れ\つ";
例えば、「れつ」の2文字が文字化けする場合、上記のようにして対処します。
これらのことを「エスケープ」する、「エスケープ」に使う「\」の文字を「エスケープシーケンス」と言います。
2.8.スクリプト処理の分岐
変数の内容によって、行う処理を変えたいときは「if」(イフ)を使います。
「if」は、以下のように記述します。
if ( 条件 ){
処理
}
「if」は、『(』から『)』の間に記述した「条件」を調べて、それが「true」だった( = 条件に当てはまる)場合、
『{』から『}』の間に記述した「処理」が実行されます。
「条件」は、以下のような式で記述します。
X == Y
真ん中の「==」は「等価演算子」といって、この場合『「X」と「Y」が同じ』という意味になります。
例えば、変数「kaisu」が 5 になったら、変数「moji」に文字列を代入したいといった場合、以下のようになります。
if (kaisu == 5){
moji = "5になりました";
}
等価演算子で調べるデータは文字列などでもOKです。
if (str == "テスト"){
moji = "ok";
}
条件式を記述するための「等価演算子」などの演算子には、他にも「比較演算子」など、以下のようなものがあります。
■等価演算子(データが同じかどうかなどを調べる) | |
A == B | AとBが等しい |
A != B | AとBが異なる |
A === B | AとBが厳密に等しい(あまり使用しません) |
A !== B | AとBが厳密には等しくない(あまり使用しません) |
■比較演算子(数値のデータの大小を調べる) | |
A > B | AがBより大きい(超) |
A >= B | AがBと等しいか大きい(以上) |
A < B | AがBより小さい(未満) |
A <= B | AがBと等しいか小さい(以下) |
また、ふたつの条件式を記述して、以下のような処理を行う事もできます。
条件式1 && 条件式2 | 条件式1と条件式2の両方が当てはまる(アンド) |
条件式1 || 条件式2 | 条件式1と条件式2のどちらかが当てはまる(オア) |
例:
if (kaisu == 5 && count >= 3){
moji = "5と3以上になりました";
}
この場合、変数「kaisu」が 5 、変数「count」が 3 以上になったときに、変数「moji」に文字列が代入されます。
また、「if」の後に「else」(エルス)を記述すると、「if」の条件に当てはまらなかった場合の処理を記述することができます。
if (kaisu == 8){
moji = "8です";
}else{
moji = "8ではありません";
}
この場合は、変数「kaisu」の値が 8 だったら変数「moji」には『8です』と代入され、
値が 8 ではなかったら変数「moji」に『8ではありません』と代入されます。
さらに、「else」を「else if」(エルスイフ)にすることで、「else」に条件を付加することができます。
if (kaisu == 8){
moji = "8です";
}else if(kaisu == 3){
moji = "8ではなく3です";
}else{
moji = "8でも3でもありません";
}
この例では、以下のような結果になります。
変数「kaisu」の値 | 変数「moji」に代入される文字列 |
8 | 8です |
3 | 8ではなく3です |
それ以外 | 8でも3でもありません |
「else if」は「if」と「else」の間にいくつでも記述することができます。
2.9.スプライトとオブジェクト
オブジェクトは、「プロパティ」というデータを複数格納する事のできるデータ型です。
例えば、「画像」というオブジェクトがあったとすると、これには「縦幅」や「横幅」などのプロパティがあると考えられます。
「スプライト」もオブジェクトの中に含まれるので、スプライト自身のデータが格納されている、以下のようなプロパティがあります。
_x | スプライトのX座標の位置 |
_y | スプライトのY座標の位置 |
_alpha | (アルファ)スプライトの透明度(0〜100):%(パーセント) |
_rotation | (ローテーション)スプライトの角度:°(度) |
_xscale | (Xスケール)横方向の拡大率(0〜100 100がデフォルト):%(パーセント) |
_yscale | (Yスケール)縦方向の拡大率(0〜100 100がデフォルト):%(パーセント) |
_visible | (ビジブル)スプライトを true:表示 false:非表示 |
スプライトの情報(プロパティ)を見るときは、ターゲットでスプライトを指定します。
テキストとして表示したい時は、以下のように変数に代入します。
xziku = _root.abc._x;
yziku = _root.abc._y;
toumeido = _root.abc._alpha;
hyouji = _root.abc._visible;
逆に、これらのプロパティに直接数値を代入すれば、スプライトを操作することもできます。
_root.abc._x = 30;
_root.abc._y = 60;
_root.abc._alpha = 90;
_root.abc._visible = true;
上の例のようにすると、インスタンス名が「abc」のスプライトのX座標を 30 、Y座標を 60 、透明度を 90% にして表示することができます。
ただし、オブジェクトやプロパティによっては、値を代入する事ができないプロパティも存在します(読み取り専用のプロパティ)。
2.10.トレース関数
ActionScriptで、指定した値を「トレースウィンドウ」というところに出力することができます。
trace(); | 引数に指定した値をトレースウィンドウに出力する |
トレースウィンドウを表示するには、ParaFla!では「プレビュー(P)」から「トレースウィンドウを表示(T)」を選択、
Suzukaでは「ウィンドウ(W)」から「トレース(T)」を選択します。
トレース関数を利用することによって、変数に何が格納されているのか、などといった事を簡単に調べる事ができます。
moji = "テスト";
trace(moji);
このようにすると、トレースウィンドウに「テスト」と出力できます。
トレースは製作段階での一時的な確認のための出力なので、実際のFlashには何の効果も持ちません。
ただし、トレースのログを消し忘れたままトレースを出力し続けると、 ParaFla! では処理が重くなってしまうときがあるので注意してください。
2.11.自分で関数を作ってみる
なにか処理を行う時に使用する関数ですが、この関数を自分で作成する事ができます。
これらの関数は、ユーザー定義関数や、自作関数などと呼ばれています。
関数を作成するには、まず、その関数の処理がどういう内容なのかを定義する必要があります。
関数を定義するには「function」(ファンクション)を使用します。
function 関数名(){
//関数で行う処理
};
関数の定義を、イベントハンドラの中に書くことは出来ません。
定義した関数は通常の関数と同じように、以下のように呼び出して使用することが出来ます。
関数名();
このページのはじめのほうで、関数に引数を指定する方法を説明しましたが、自分で作成した関数も引数を受け取る事ができます。
ただ、関数を呼び出す際に引数を指定するだけでは値を受け取る事は出来ません。
関数を定義するときに、細工をすると引数を受け取る事が出来るようになります。
function 関数名(1つめの引数を代入する変数 , 2つめの引数を代入する変数 …){
//関数で行う処理
};
定義のカッコの中に、「,」(コンマ、カンマ)で区切って、受け取った引数を代入する変数を指定します。引数は何個でも受け取る事ができます。
以下に例を示します。
function ret_arg(fir_arg, sec_arg, thi_arg){
trace(fir_arg + "/" + sec_arg + "/" + thi_arg);
}; //関数の定義(受け取った引数をトレースに出力する関数)
ret_arg("引数その1", "引数その2", "引数その3", "引数その4");
//関数の呼び出し
上記の例では、関数を呼び出すときに引数を4つ指定していますが、関数部分には受け取った引数を代入する変数を3つしか記述していないため、3つ目以降の引数は無視されます。
次は、関数を実行した結果を調べる方法を説明します。
例えば、「引数で指定した2つの値を比較し、大きい(小さい)ほうの値ひとつを出力する」というような関数を自分で作成したいというような場合には、「return」を使用すると便利です。
return 値; | 値 に指定した値を返す |
以下のように使用します。
function com_big(fir_arg, sec_arg){
if (fir_arg > sec_arg){
return fir_arg;
}else if(fir_arg < sec_arg){
return sec_arg;
}else{
return fir_arg;
//同じ値だった場合
}
};
function com_small(fir_arg, sec_arg){
if (fir_arg < sec_arg){
return fir_arg;
}else if(fir_arg > sec_arg){
return sec_arg;
}else{
return fir_arg;
//同じ値だった場合
}
};
trace(com_big(5, 2)); //→ 5が出力される
trace(com_small(5, 2)); //→ 2が出力される
//関数を実行した結果をトレースに出力(大きい値を返す関数、小さい値を返す関数)
これらのような自作した関数も、ターゲットを使って外部から呼び出すことができるので便利です。
[_root.com_big(5, 2);] メインイベントに定義した関数com_bigを実行。
2.12.イベントハンドラと関数
実は、イベントハンドラの書き方には以下のようなものもあります。
//ハンドラの処理に、名前が無い関数(匿名関数)の処理を指定
onEnterFrame = function(){
trace("ok");
};
上記のようにすると、フレームアクションでも「onClipEvent(enterFrame)」と同じ処理をすることができます。
また、以下のような書き方もあります。
//自作関数の処理をハンドラの処理に指定
onLoad = Fanc_test;
onEnterFrame = Fanc_test;
function Fanc_test(){
trace("ok");
};
少し難しいかもしれませんが、興味のある人は調べてみてください。
2.13.配列
配列( Array:アレイ )は、複数の値をもつことのできる変数です。
配列に複数の値を格納するには、次のようにします。
arr = [-5, 2, "test"];
上の例では、配列「arr」の1番目の値に数値「 -5 」、2番目の値に数値「 2 」、3番目の値に文字列「 test 」をそれぞれ代入しています。
配列のそれぞれの値を取得するには、次のようにします。
arr = [-5, 2, "test"];
trace(arr[0]); //-5
trace(arr[1]); //2
trace(arr[2]); //test
1番目の値から[0]、[1]、[2]、… のように指すので、注意してください。
配列のそれぞれの値に代入する方法も同じです。
arr = [-5, 2, "test"];
arr[0] = 10; //-5を10に置き換え
trace(arr[0]); //10
配列の値の番号を、変数を使って指定することも可能です。
n = 1;
arr = [-5, 2, "test"];
trace(arr[n]); //arr[1]を指定している⇒結果は2
配列に格納されている値の個数を取得することも可能です。
arr = [-5, 2, "test"];
trace(arr.length); //データの数は全部で3つ
複数の値をまとめて管理する場合に配列はとても便利なので、覚えておいてください。
3.アクションスクリプトでの処理 (SWF4)
3.1.スクリプトの記述
SWF4で使用する ActionScript は、SWF6〜8のものと比べると制限が多く、また異なる点がいくつかあります。
●クリップアクション
SWF4ではクリップアクションが使用できません。
よって、「load」「enterFrame」などのイベントハンドラは使用できません。
(同じく、「onLoad = function(){};」「onEnterFrame = function(){};」なども使用できません。)
「enterFrame」のような処理を行いたい場合は、
フレームアクションに記述して「ラベルにジャンプ」などで繰り返し動作させるという方法があります。
●他のスプライトへのアクセス
ターゲットの区切り文字は「.」(ドット)ではなく、「/」(スラッシュ)になります(スラッシュシンタックス)。
スプライトなどのプロパティにアクセスする際にのみ「.」が使用できます。
また、SWF4ではプロパティの名前に、「_」(アンダースコア)がつきません。
/spr/abc.x = 20; //メインのイベントに配置したスプライト「spr」に配置した「abc」のX座標を20に設定
spr/abc.rotation = 50; //スプライト「spr」に配置した「abc」の角度を50°に設定
プロパティではなく、他のスプライトの変数にアクセスする場合や、
他のスプライトで関数を実行する場合は、「tellTarget」(テルターゲット)を使用します。
SWF4では、「_root」をあらわす語は「/:」となります。
tellTarget("/spr/abc"){
hensu1 = "テスト"; //スプライト /spr/abc の変数 hensu1 に文字列を代入
hensu2 = /:qt; //スプライト /spr/abc の変数 hensu2 にメインのイベントの変数 qt のデータを代入
stop(); //スプライト /spr/abc の再生を停止
};
上記のように使用します。
青色で示した部分に、アクセスしたいスプライトをターゲットで示すと、
赤色で示した部分のように{ }内でそのスプライトの変数にアクセスできるようになります。
他のスプライトにもアクセスしたい場合は、もうひとつ別に「tellTarget」を記述してください。
●演算子
SWF6~8では等価演算子は数値のデータや文字列のデータを問わず、同じ演算子が使用できましたが、
SWF4では数値のデータと文字列のデータで使用する等価演算子が異なります。
== | 数値のデータの等価演算子。同じかどうか調べる。 |
=== | 文字列のデータの等価演算子。同じかどうか調べる。 |
!= | 数値のデータの等価演算子。異なっているかどうか調べる。 |
!== | 文字列のデータの等価演算子。異なっているかどうか調べる。 |
例:
is = 30;
if(is == 30){
trace("is_ok");
}
str = "テスト";
if(str === "テスト"){
trace("str_ok");
}
また、文字列を結合するための演算子も異なります。
& | 文字列のデータを結合します。 |
例:
is = 5 + 3;
str = "文字列の" & "テスト";
trace(is & " : " & str);
「+」では数値の計算しかできないので注意してください。
●使用できる制御構造、関数など
SWF4では、使用できる制御構造や関数にかなりの制限があります。
■ ParaFla! 同梱の文書[ sample/sample07/readme.txt ]より転載。
○制御構造 for(){} while(){} do{ }while(); if(){ }else{ } tellTarget(){} switch(){ case: } は使用できません。 ○関数 random(num) 0〜(num-1)の間の整数の乱数を取得 time() Flashを表示してからのミリ秒単位の経過時間を取得 length(str) 文字列strの長さ(文字数)を取得 int(num) numを四捨五入した整数値を取得 concat(str1, str2) 文字列str1とstr2を結合した文字列を取得 duplicateClip(target, new, depth) スプライトtargetをインスタンス名new、深度depthで複製 removeClip(target) スプライトtargetを消去 startDrag(target, lock, [left, right, top, bottom]) スプライトtargetをドラッグ可能にする lockをtrueで、クリック後targetが中心に移動、falseで移動しない left, right, top, bottomでドラッグ可能な範囲の座標を指定 stopDrag() ドラッグを停止 ord("chr") 文字chrをASCIIコード番号に変換 chr(num) ASCIIコード番号numの文字を取得 callFrame("label") フレームlabelのスクリプトをサブルーチンとして呼び出す getURL(url, window, [method]) アドレスurlをwindow(_blank, _top, _self...)で開く loadMovie(url, level, [method]) アドレスurlにあるムービー(画像)をスプライトlevelに読み込む loadVariables(url, level, [method]) アドレスurlにあるテキストに記述された変数をlevelに読み込む substr("string", index, count) 文字列stringのindex文字目からcount文字数分の文字を抽出する *(Flash Lite関数) FSCommand(str1,str2) FSCommand2(str1,str2...) 引数は1〜5個 *(SWF3関数群) nextFrame() 「次のフレームへ」 prevFrame() 「前のフレームへ」 play() 「再生」 stop() 「停止」 toggleQuality() アンチエイリアス処理のオン/オフ(画質)の切り替え stopSounds() 再生されているサウンドを全て停止 gotoFrame(num or label) フレームnum、またはラベル名labelにジャンプ? gotoAndPlay(num or label) フレームnum、またはラベル名labelにジャンプ frameLoaded(num) ? setTarget(target) ? ■関数の [ ] で囲まれた引数は省略可能。
■ FSCommand2
携帯端末のみで動作する関数に、「FSCommand2」があります。
これを使用することで、携帯端末の情報を取得したりすることができます。
ここでは、その一部を紹介します。
情報取得 | |
FSCommand2("GetMaxBatteryLevel") |
端末の最大バッテリー残量を数値で返す。 返り値:(-1,0,1,2,〜 = 取得失敗,0,1,2,〜) |
FSCommand2("GetBatteryLevel") |
端末のバッテリー残量を数値で返す。 (-1,0,1,2,〜 = 取得失敗,0,1,2,〜最大バッテリー残量) |
FSCommand2("GetMaxSignalLevel") |
端末の最大電波状況(アンテナの本数)を数値で返す。 (-1,0,1,2,〜 = 取得失敗,0,1,2,〜) |
FSCommand2("GetSignalLevel") |
端末の電波状況(アンテナの本数)を数値で返す。 (-1,0,1,2,3,〜 = 取得失敗,0,1,2,3,〜最大電波状況) |
FSCommand2("GetMaxVolumeLevel") |
端末の最大音量を数値で返す。 (-1,0,1,2,〜 = 取得失敗,0,1,2,〜) |
FSCommand2("GetVolumeLevel") |
端末の音量を数値で返す。 (-1,0,1,2,〜 = 取得失敗,0,1,2,〜最大音量) |
FSCommand2("GetPowerSource") |
端末が使用している電源の種類を数値で返す。 (-1,0,1 = 取得失敗,バッテリー,外部電源) |
FSCommand2("GetPowerSource") |
端末が使用している電源の種類を数値で返す。 (-1,0,1 = 取得失敗,バッテリー,外部電源) |
FSCommand2("GetLocaleLongDate", "day") |
現在の日付を「March 28, 2008」のように変数 day に代入する。 (-1,0 = 取得失敗,取得成功) |
FSCommand2("GetLocaleShortDate", "day") |
現在の日付を「3/28/2008」のように変数 day に代入する。 (-1,0 = 取得失敗,取得成功) |
その他の日付を取得する FSCommand2 |
リンク先ページを参照 - |
動作/データ処理 | |
FSCommand2("SetQuality", "画質") |
画質に"high"、"medium"、"low"のどれかを指定すると、その画質に変更する。⇒参考 (-1,0 = 失敗,成功) |
FSCommand2("StartVibrate", on, off, re) |
指定どうりにバイブレータを動作させる。 on = 動作するミリ秒時間(0〜5000)(1000 = 1秒) off = 停止するミリ秒時間(0〜5000) re = on、offを繰り返す回数(0〜3) (-1,0 = 失敗,成功) |
FSCommand2("StopVibrate") |
バイブレータを停止させる。 (-1,0 = 失敗,成功) |
FSCommand2("Escape", str, "res") |
変数strの文字列をURLエンコードして変数resに代入する。(16進数) (-1,0 = 失敗,成功) |
FSCommand2("Unescape", str, "res") |
変数strの文字列をURLデコードして変数resに代入する。 (-1,0 = 失敗,成功) URLエンコード/デコードについて |
SWF4では自作関数を使用することはできませんが、「callFrame」を使用することにより同等の処理を行えます。
まずは任意のフレームに「アクションを挿入」⇒「<スクリプト>」(Suzuka は「アクションレイヤーを挿入」)でフレームアクションをつくってスクリプトを書き込みます。
他のフレームから先ほど書き込んだスクリプトを実行したいときは、callFrame に先ほど挿入したフレームアクションのフレーム数を指定すれば、繰り返しそのスクリプトを利用することができます。
<呼び出したいフレームアクションのスクリプトが1フレーム目にある場合>
呼び出したいスクリプト
trace("トレースに出力");
他のスクリプト
callFrame("1"); //traceが呼び出される
callFrame を使用しても、フレームヘッド(再生位置)がそのフレームに移動してしまうわけではありません。
●ボタン
ボタンにスクリプトを使用する場合、ボタンイベントハンドラを使用します。
携帯端末ではPCのようにボタンをマウスカーソルでクリックするということができないので、
ボタンを携帯でクリックする際は端末のカーソルキーで上下を選択して決定キーでクリックしたことになります。
また、通常のボタンではなく数字キーの押下で処理をしたい場合、以下のようにします。
on(keypress "5"){
trace("5が押されました。");
} //数字の5キーを押したら処理
「 5 」を他の数字に書き換えることにより、他のキーもチェックすることができます(0〜9)。
ただし、前述したように携帯端末のカーソルキーは通常のボタンの選択などコントロールに使用されるので、keypress で処理することはできません。
●ダメ文字
SWF4では、特定の文字をスクリプトエディタに入力すると、スクリプトに問題が無くても構文エラーになってしまったり、文字化けが発生するという現象が発生します。
これらの特定の文字は「ダメ文字」と呼ばれ、Shift_JISで「『\』の文字と同じ文字コード」を2バイト目に含む全角文字が該当します。
「『\』の文字と同じ文字コード」を2バイト目に含む全角文字、つまりダメ文字は以下のようなものがあります。
喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭xx\\
これらは、ダメ文字の後ろに『\』を記述することで対処できます。
trace("十\");
少し詳しく説明すると、例えば「 十 」という文字はShift_JISの16進数で「8F 5C」の2バイト、
「\」という文字は「5C」の1バイトになっています。
ここで、SWF4だと「 十 」の2バイト目の「5C」が「\」の文字だとみなされてしまうため、
「 十 」と入力しても「8F」の文字(存在しないようです)と「\」の文字の2文字と解釈されてしまいます。
trace("十");
よって、上記のようにしても、
trace("*\");
と解釈されてしまっているわけです。
すると、「\」の後ろにある「"」がエスケープされ、
結果的に、文字列を囲む「"」の終わり部分が無くなって構文エラーになってしまう(ダメ文字とダメ文字の次にくる文字の2文字が文字化けしてしまう)という訳です。
対処法の通りにダメ文字の後ろに「\」を記述すると、
trace("*\\");
となります。
「\」が「\」をエスケープして「\」の文字になり、
trace("*\");
「8F」と、「\」の文字の「5C」が合体して「8F 5C」、つまり「 十 」という文字になるので、
正常に表示されるようになるということです。
ちなみに、ダメ文字の後ろに「\」を記述することは「エスケープする」とは言わないようです。
● eval を用いた配列変数の表現
SWF4では配列を使用することができませんが、eval関数を使用することによって、配列をシミュレートして使うことができます。
このシミュレートされた配列を「擬似配列」と呼んだりします。
ちなみに、eval関数は、指定した文字列を変数名やターゲットとしてみなすようにする関数です。
この方法は Flash Lite のテクニックとされていますが、SWF4でもこのテクニックを使うことができます。
ただし Flash Lite とは記述方法が多少異なっていて、直接eval関数を使用しません。
まず、擬似配列に値を代入したい場合(擬似配列が式の左辺に来る場合)は、以下のように記述します。
n = 0;
("var" & n) = 25;
擬似配列の部分をカッコでくくるだけです。
これは、「var0」という変数に25を代入しているのと同じ処理なのですが、
変数「n」の数値を変えることによって「var1」や「var8」など、別の変数にアクセスすることができます。
つまり、配列「var[n]」と同じような感覚で扱うことができ、とても便利です。
次に、擬似配列の値を他の変数に代入したい場合(擬似配列が式の右辺に来る場合)は、以下のように記述します。
n = 0;
score = valueOf("var" & n);
擬似配列の部分をvalueOfでくくります。
さらに、上記の2つのような代入式ではなく、等価演算子や比較演算子を使用した条件式で擬似配列を使用する場合も多少記述方法が異なります。
n = 0;
if(valueOf("var" & n) == damage){ 〜 }
条件式で擬似配列を使用する場合、擬似配列が式のどちらの辺に来ても擬似配列の部分をvalueOfでくくります。
処理を指定した回数分繰り返す「for」と組み合わせて使用すれば、複数の擬似配列の値を簡単に処理することができます。
for (i = 0; i <= 5; i ++){
("data" & i) += 5;
trace(valueOf("data" & i));
}
//変数 data0 〜 data5 のそれぞれの値に5を足してトレース
ちなみにvalueOfの使い分けは、
擬似変数の値を参照したい場合はvalueOfでくくり、擬似変数の変数名を参照したい場合はカッコだけでくくるようです。
(擬似変数への代入のときなどは擬似変数の変数名を参照しなければいけない。それ以外の場合では擬似変数の値の参照。)
上記の例で3行目を[trace(("data" & i));]とやると、擬似変数の値ではなく変数名が出力されてしまいます。
●その他
・SWF4の動作をPCでシミュレートするには?
・SWF4で「アクション」⇒「URLを取得」が動作しない?
・携帯電話で表示する際の制限
・「スクリプト」に何も記述していないのにエラーが出る =⇒ 「;」を入力しておいてください。
その他の詳しい事は、ParaFla!同梱の文書[ sample/sample07/readme.txt ]を読んでください。
4.その他
4.1.練習問題
ActionScript についての簡単な復習です。JavaScript が動作するブラウザで遊べます。
4.2.メモ・TIPS
ActionScriptのメモを残していきます。
●マウス座標 ●右クリックメニューの非表示 ● Flash Player のバージョンを表示する ●テキストフィールドの入力制限
●進数変換 ●特殊な値 ●スプライトの表示/消去 ●数値の四捨五入/ランダム値の生成
●いろいろなプロパティ ●クリップボード ● ActionScript のバージョン ●変数名による処理速度
●ある処理の処理速度を計るサンプル ●数値計算の処理 ●変数名とターゲットの静的、動的な指定
●キーの押下を判断する ●複数の変数への同時代入の記述
●マウス座標
マウスカーソルの座標を取得したい場合は、
onClipEvent(enterFrame){
_root.xzahyou = _root._xmouse;
_root.yzahyou = _root._ymouse;
trace("X:" + _root.xzahyou + " Y:" + _root.yzahyou);
}
のようにすると、変数「_root.xzahyou」と「_root.yzahyou」にマウスの座標が代入されます。
(「_xmouse」「_ymouse」はFlashの画面上にあるマウスカーソルの座標を示す特別な変数です。)
●右クリックメニューの非表示
フレームアクションなどで、
Stage.showMenu = false;
と記述すると、右クリックメニューの「拡大」「再生」などを非表示にする事ができます。
再び表示させたい時は「true」に設定してください。
● Flash Player のバージョンを表示する
「$version」という特別な変数にバージョン情報が入っているので、別の変数に代入して表示します。
fv = $version;
trace(fv);
「getVersion()」という関数でもバージョンは取得できますが、SWF4では機能しません。
fv = getVersion();
●テキストフィールドの入力制限
テキストフィールドに入力できる文字の制限ができます。
//文字数の制限
ins_txt1.maxChars = 5; //5文字まで入力可能
//入力できる文字の制限
ins_txt2.restrict = "abcde"; //a,b,c,d,eの5文字は入力可
ins_txt3.restrict = "a-z"; //小文字のaからzまでは入力可
ins_txt4.restrict = "a-z0-9"; //小文字のaからzと0から9までは入力可
ins_txt5.restrict = "* #"; //*とスペースと#のみ入力可
ins_txt6.restrict = "^0-9"; //0から9までは入力不可
ins_txt7.restrict = "^a-zA-Z"; //小文字のaからz、大文字のAからZは入力不可
ins_txt8.restrict = "\^\-\\"; //^と-と\の文字のみ入力可
ins_txt9.restrict = "0-9^5"; //5を除いた0から9までは入力可
ins_***についてはこちらを見てください。
この制限は、直接テキストを入力したときのみ有効で、スクリプトでテキストを処理した場合(スクリプトで変数にテキストを代入したときなど)は制限できません。
●進数変換
いろいろな進数の変換を行うことができます。
num = parseInt("255", 10).toString(16).toUpperCase();
//10進数の「255」を16進数(記号は大文字)に変換
num2 = parseInt("0xFF", 16);
//16進数の「FF」を10進数に変換
「toString()」は数値(10進数)を他の進数に変換します。引数には変換の基数を指定します。
引数に 2 を指定した場合は2進数に、 16 を指定した場合は16進数になります。指定できる範囲は 2〜36 で、デフォルトは 10 です。
「parseInt()」は進数を数値(10進数)に変換します。引数には変換したい進数と、その進数が何進数であるかを指定します。指定できる範囲は 2〜36 です。
parseInt("11001", 2) ⇒ 25
parseInt("0xF0", 16) ⇒ 240
NaN (ナン) ⇒ Not a Number。数値でないことをあらわす。
undefined(アンデファインド) ⇒ 未定義。データが割り当てられていないことをあらわす。
ちなみに、SWF6では undefined はカラの文字列("")になります。
また、データの型の種類を調べるにはtypeof()を使用してください。
t = 5; trace(typeof(t)); //出力:number
●スプライトの表示/消去
ActionScript でスプライトを表示したり、消去することができます。
インスタンス名.removeMovieClip();
指定した インスタンス名 のスプライトを消去する。
インスタンス名.duplicateMovieClip(コピー先のインスタンス名, 深度);
インスタンス名 のスプライトを、コピー先のインスタンス名 のインスタンス名で 深度 にコピーして表示する。
attachMovie(作成するスプライトのスプライト名, 作成するスプライトのインスタンス名, 深度);
作成するスプライトのスプライト名 のスプライトを 作成するスプライトのインスタンス名 のインスタンス名で 深度 に作成して表示する。
作成するスプライトのスプライト名 は、スプライトの「ファイルのプロパティ」にある「スプライト名」です。
(Suzuka は「スプライトのプロパティ」の「書き出し」の「識別子」。「このシンボルを書き出す」にチェックする)
removeMovieClip は、 duplicateMovieClip/attachMovie などで作成されたスプライト(ActionScript での深度が正の範囲のもの)しか消去できません。
ParaFla! や Suzuka で配置したスプライトは、ActionScript での深度が負の範囲なので、消去できません。
ParaFla! や Suzuka での深度と、ActionScript での深度は、数値の取る幅が異なるので注意してください。
深度 | AS での深度 |
-256 : 0 : 256 |
-16384 -16383 : -16127 : -15871 : 1048575 |
深度は、負になるほど奥に、正になるほど手前になります。
ActionScript の深度は 1,048,575 〜 -16,384 で、この範囲がFlashで扱える深度の範囲になります。
ParaFla! での深度の範囲は 256 〜 -256 で、ActionScript での深度では -15,871 〜 -16,383 の範囲にあたります。
Suzuka ではレイヤーリストの一番上のものから順に ActionScript での深度で -1 、 -2 、 … と割り当てられていきます。使用するのは -16,000 までにしたほうが良いとされています。
ActionScript で深度を指定する場合( duplicateMovieClip/attachMovie など)は、正の範囲の値を使うように勧められています。
この他に、新規のスプライトを作成するcreateEmptyMovieClip(インスタンス名, 深度);というメソッドもありますが、ここでは説明を省略します。
Math.round() //引数に指定した数値の小数点以下を四捨五入
Math.floor() //引数に指定した数値の小数点以下を切捨て
Math.ceil() //引数に指定した数値の小数点以下を繰上げ
Math.random() //0 以上 1 未満の浮動小数をランダムに返す。
//「Math.random()」を使用してランダムな整数を取得する場合、以下のようにする。
nummin = 1; //ランダムに返す数値の最小値
nummax = 10; //ランダムに返す数値の最大値
numres = Math.floor(Math.random() * nummax) + nummin;
trace(numres);
//四捨五入を行う以下のような処理も考えられますが、最大値と最小値の返される割合が、他の値の返される割合の半分になってしまうのでお勧めしません。
nummin = 1; //ランダムに返す数値の最小値
nummax = 10; //ランダムに返す数値の最大値
numres = Math.round(Math.random() * (nummax - 1)) + nummin;
trace(numres);
_focusrect = false;
//ボタンなどにフォーカスを当てた(選択した)とき(パソコンではタブキーを押した場合、携帯端末では上下のキーを押した場合)に表示される黄色い矩形(くけい)を表示(true)、非表示(false)にする。
_quality = "HIGH";
//画質を変更する。LOW(低)、MEDIUM(中)、HIGH(高)、BEST(最高)、の中から指定する。
_currentframe
//現在再生中の位置(フレームカウント)を返す。インスタンス名を指定すれば、そのスプライト内のフレームカウントを返す。
_name
//スプライトのインスタンス名を返す。例: spr
_target
//スプライトのターゲットパスを返す。例: /spr/mv/test
//区切りをスラッシュではなくドットにしたい場合は、eval(_target)のようにする。例: _level0.spr.mv.test
_root._url
//SWFファイルの存在するファイルパスを返す。例: file://C|\test\test.swf
instance.useHandCursor = false;
//指定したインスタンス名 instance のスプライトで、ボタンの上にマウスカーソルが乗った時に指差しハンドカーソルに形状を変化させる(true)か、させない(false)かを指定する。
クリップボードにデータをコピーさせることができます。
System.setClipboard("クリップボードにセット");
//指定した文字列をクリップボードにセットする。テキストを選択して右クリックから「コピー」するのと同じ処理。
クリップボードのデータを取得するメソッドはセキュリティ上の問題で用意されていません。
FlashPlayer バージョン 10 以降では、System.setClipboard はボタンイベントハンドラなどからの実行でしか動作しないようです。
ActionScript にはいくつかバージョンがありますが、ParaFla! や Suzuka で使用できるのは ActionScript 1.0 (Flash MX 相当)になります。
また、ActionScript の解説サイトで変数などのデータ型を定義しているものがありますが、ParaFla! や Suzuka では変数などのデータ型定義はできません(下記赤太字で示した部分)。
move_flg:Boolean = false;
move_distance:Number = 5;
function move():void{
if(move_flg){
_x += move_distance;
}
};
上記のような場合は、データ型を定義している部分を削って、以下のようにします。
move_flg = false;
move_distance = 5;
function move(){
if(move_flg){
_x += move_distance;
}
};
『ActionScript 1.0 は変数をアドレスに変換しないので変数名が長いほど処理が遅くなる』らしいです。
無駄に長い変数名はつけないほうが良いでしょう。
var t_count = 10000;
//処理を繰り返す回数
var t_time = getTimer();
for(var i = 0; i < t_count; i ++){
//-- 行う処理を記述 --↓--
//----- ここまで -----↑--
}
trace(((getTimer() - t_time) / 1000) + " second.");
//計測結果をトレースに出力
ある処理がどれくらい負荷のかかる処理なのかを調べたいとき、その処理を一定数繰り返して終了するまでに何秒かかるかを計測することでひとつの目安となります。
上記のコードでは処理を1万回繰り返し、その間にかかった秒数を出力します。
PCの負荷状態によって同じ処理を行ったとしても値にばらつきが出るので、上記の計測を何度か繰り返して出した平均値を参考にすると良いと思います。
Math.abs(x)
指定した数値 x の絶対値を返す。
Math.cos(x)
指定したラジアンの角度 x のコサイン(余弦)を返す。
Math.E
自然対数の底(e)をあらわす。
Math.log(x)
指定した正の数値(真数) x の自然対数(logex)を返す。
Math.max(x, y)
数値 x と y を比較し、大きいほうの値を返す。
Math.min(x, y)
数値 x と y を比較し、小さいほうの値を返す。
Math.PI
円周率(π)をあらわす。Math.PI = π。
Math.pow(x, y)
数値 x を y 乗した値を返す。
Math.sin(x)
指定したラジアンの角度 x のサイン(正弦)を返す。
Math.sqrt(x)
指定した正の数値 x の平方根を返す。
Math.tan(x)
指定したラジアンの角度 x のタンジェント(正接)を返す。
ラジアンとは?
日常で私たちが使用している、円の 1 周の角度を 360°(deg) とする単位を「度数法」といいます。
これに対し、円の 1 周の角度を 2π ラジアン(rad) とする単位を「弧度法」といいます。
1(rad) は約 57.3° で、 π(rad) = 180° 、 π/2(rad) = 90° です。
偶数か奇数か?
変数の値が偶数か奇数かを判断するには % 演算子を使用すると簡単です。
対象の値を2で割って、余りが出なければ偶数、余りが出れば奇数ということになります。
num = 6;
if((num % 2) == 0){
trace("偶数です。");
}else{
trace("奇数です。");
}
変数名やターゲットを指定するときは、普通以下のように指定します。
count = 5;
_root.spr._x = 0;
それでは、例えば「count1」、「count2」、「count3」、・・・、「count49」、「count50」という50個の変数に値を代入したり、
「spr1」、「spr2」、「spr3」、・・・、「spr49」、「spr50」という50個のスプライトのプロパティにアクセスする必要がある場合はどうしたらよいでしょうか?
count1 = 5;
count2 = 5;
count3 = 5;
count4 = 5;
count5 = 5;
count6 = 5;
:
_root.spr1._x = 0;
_root.spr2._x = 0;
_root.spr3._x = 0;
_root.spr4._x = 0;
_root.spr5._x = 0;
_root.spr6._x = 0;
:
などと全て書いていくのは疲れますし、現実的ではありません。
そこで、SWF6以降では eval 関数やArray(アレイ)クラスを使用して、このような処理を簡単に行う方法があります。
50個の変数に値を代入したり、50個のスプライトのプロパティにアクセスするには以下のようにします。
for(i = 1; i <= 50; i += 1){
this["count" + i] = 5;
eval("_root.spr" + i)._x = 0;
}
for は、指定した値の範囲の回数分 { 〜 } のブロック内を繰り返し処理します。
この場合は、変数 i を 1 からスタートして、ブロック内を一回処理するたびに変数 i を 1 づつ増やしていき、それを変数 i が 50 を超えない間繰り返すことになります。つまり50回処理されます。
変数 i が 1 づつ増えていくことを利用して、50個の変数名やスプライト名の共通する部分(「count」や「_root.spr」の部分)と変数 i を結合させて、変数名やスプライト名として機能させているわけです。
他にも、以下のような使い方もできます。
n = "hen";
r = "suu";
this[n + r] = 10;
t = "sp";
u = "ri";
eval(t + u + "te")._y = 100;
それぞれ「hensuu」という変数名と「sprite」というインスタンス名のスプライトを指定していることになります。
このような指定の仕方を「動的な」指定と呼ぶそうです。
このページで紹介した「 on(press) 」などのボタンアクションでは、マウスのクリックによる処理しか行えません。
キーを押しているかどうか判断するには、「 on(keyPress) 」ボタンイベントハンドラを使用するか、「 Key.isDown() 」メソッドを使用します。
「 on(keyPress) 」は、指定したキーが押されたら処理を行うボタンイベントハンドラです。
on(keyPress "a"){
trace("Aキーが押されました");
}
「 "" 」内には判断したいキーのアルファベットや数字を入力します。
「 on(keyPress "a") 」とすれば「 a 」キーを押したとき、「 on(keyPress "A") 」とすれば「 Shift 」キーと「 a 」キーを同時に押したときに処理が実行されます。
このハンドラは SWF4 でも使用できますが、携帯端末で機能するのは判断したいキーに数字を指定したときのみです。
「 Key.isDown() 」メソッドは、指定したキーが押されていれば true 、押されていなければ false を返します。
keycheck = Key.isDown(90);
if(keycheck){
trace("Zキーが押されました");
}
キーの指定は引数に指定すればよいのですが、その際「キーコード」という数値で指定します。
例えば、キーコード「 90 」は「 Z 」キーをあらわします。
どのキーコードがどのキーなのかはキーコード表示ツールで調べることができます。
「 Key.isDown() 」はメソッドなので、「 onClipEvent(enterFrame) 」などのイベントハンドラの中で実行します。
複数の変数へ同時に同じ値を代入するときには、以下のように記述しても代入することができます。
x = y = z = 0; //x, y, z の3つの変数に 0 を代入
また、変数の宣言でも同時に複数の変数を宣言することができます。
変数の宣言とは、「この変数を初めて使う」(これ以前の処理ではこの変数は存在していない)ということを宣言することです。
変数の宣言には「 var 」ステートメントを使用します。具体的には以下のようになります。
var a; //変数 a を宣言
これで、これ以降の処理で変数 a を初めて使用するということが宣言できます。
宣言と同時に変数へ代入を行うことも可能です。
var a = 5;
同時に複数の変数を宣言するには、変数をコンマ(カンマ)で区切って複数記述します。
var a, b, c; //変数 a, b, c を宣言
var a = 0, b = 1, c; //宣言と代入(c は宣言のみ)
ActionScript はわざわざ変数の宣言をしなくても普通に変数が使用できるので、結果的に「 var 」ステートメントを使用する必要は無いことがありますが、
ユーザー定義関数の中で「 var 」ステートメントを使用する場合は特別な効果があります。
関数内で「 var 」ステートメントを使用すると、その変数は関数の中(「 { 」から「 } 」までの間)だけでしか使用できなくなります。
このような変数を「ローカル変数」と呼びます。
function t(){
var x = 50;
trace(x); //関数の中からトレースすると 50 が出力される
};
t();
trace(x); //関数の外からは内容をトレースできない
上記の例で「 var 」をつけないで変数 x に代入すると、どちらともトレースする事ができます。
「 var 」ステートメントを使用することによって、メモリ(データ領域)を節約することができます。
「ローカル変数」について説明してしまったので、他の変数の種類についても少しだけ説明します。
このページで説明した、ターゲットの指定( this や _root など)をしてアクセスする変数を「タイムライン変数」と呼びます。
「タイムライン変数」は変数がどのスプライトにあるのかをターゲットで指定しなければいけませんでしたが、
どのスプライトからでもターゲットを指定しないでアクセスすることのできる変数を「グローバル変数」と呼びます。
_global.f = 10;
trace(f); //10 が出力される
「グローバル変数」は代入するときに「 _global. 」を変数名の最初につける必要があります。それ以外ではつける必要はありません。
情報元:
http://pc11.2ch.net/test/read.cgi/swf/1217081872/971 ⇒ http://log.40ch.net/parafla/part022.html#R971
http://f-site.org/articles/2006/10/20134813.html
4.3.最後に
ActionScript には、もともと「ゲーム用のスクリプト」や、「点数を増やすスクリプト」等というものが用意されているわけではありません。
パーツ( = スクリプト)を繋げ、期待する動作をするように組み立ていってください。
このページでは、関数、メソッドなどは少ししか紹介しませんでしたが、他にもとても多くの種類があります。
Adobe のサイトに ActionScript 2.0 リファレンスガイド という ActionScript の辞書があります。
これがあると、自分の知らないメソッドを見つけたり、メソッドの使い方を調べるのにとても便利なので、ダウンロードしておきましょう。
「ActionScript 2.0 リファレンスガイド」の「PDF」のリンクから、該当のファイル「flash_as2_language_reference.pdf」をダウンロードできます。
少し見つけずらいので、URLを書いておきます。
〔http://livedocs.adobe.com/flash/9.0_jp/main/flash_as2_language_reference.pdf〕
また、Adobe のサイトにはFlashドキュメンテーションという、「ActionScript 2.0 リファレンスガイド」の内容を含んだドキュメントもあります。
これはオンラインでブラウザから手軽に読めるので便利です。
また、ActionScript のサンプルを添えた解説ページなども、とても参考になります。
■ 区立ぱらふら予備校 - ParaflaScript分校
ParaFla! の ActionScript の基本の解説ページです。はじめて ActionScript を扱う方にもわかりやすい解説になっています。
■ Flashゲーム講座&アクションスクリプトサンプル集
ParaFla! や Suzuka の ActionScript の解説ではないので多少修正が必要な部分があるかもしれませんが、ほとんどのコードがそのまま動きます。サンプルのあるわかりやすい解説となっています。
■ こぴぺスクリプト ( メモ帳 )
手軽に使える ActionScript コードを紹介しているこぴぺスクリプト。ActionScript などの情報をまとめているメモ帳も参考になります。
他にも多くの ActionScript 解説サイトがあります。有効に活用してみてください。