携帯電話向けフラッシュ(SWF 4)で動作するアクションスクリプト。
携帯電話対応のフラッシュを作る場合、アクションスクリプトが必要であればSWF 4に合わせたスクリプトを書かなければなりません。
初めに言っておきますが、携帯電話向けのSWF 4のアクションスクリプトは、PC向けのSWF 6以降のそれとは全く別の言語と割り切った方が良いでしょう。
- 携帯電話向けフラッシュに関する、アクションスクリプト以外の注意事項は、携帯電話向けフラッシュ(SWF 4)作成の際のまとめで解説しておりますので、そちらも併せてご覧ください。
- 本稿は、PalaFla!(パラフラ)またはSuzuka(すずか)で開発される方を読者として想定しております。純正のフラッシュの場合、一部記述が異なっているものがあります。
SWF 4で使えるリテラル。
携帯電話対応のSWF 4上で動作するアクションスクリプトでは、以下のリテラルが使えます。
- 十進数
- 文字列
十六進数は使えず、また頭に0が付いた非零整数も正常に認識出来ません。
- 例えば、01と書いたりすると、正しく1と認識されません。
SWF 4で使える演算子。
携帯電話対応のSWF 4上で動作するアクションスクリプトでは、演算子として以下のものが使えます。
+-
数値の加算
- パラフラやすずかでは、正数を表わす単項演算子としては使えません。
- SWF 4では文字列の連結には使えません。
--
- (単項)負数
- (二項)減算
*- 乗算
/-
除算
- SWF 4では必ず
/の前後に空白文字を入れてください。そうしないとエラーになります。
- SWF 4では必ず
++- 1加算(インクリメント)
--- 1減算(デクリメント)
&-
文字列の連結
- SWF 4では論理積としては使えません。
特に抑えて欲しいのは、以下の点です。
- 除算(
/)については、必ず演算子の前後に半角空白を入れてください。そうしないと、エラーとなります。 - 文字列連結は、
&を用います。+で文字列の連結は出来ません。仮に+で連結しようとすると、数値演算として扱われます。片方が数値が入っているのでない限り、結果は零になるでしょう。 - 論理演算(
&,|,^)は使えません。但し、条件式に於ける論理演算子(&&,||及び!)は使えます。 -
また、剰余演算(
%)も使えないため、以下のように記述する必要があります。m=v-int(v / d)*d;
if文やwhile文などに用いる条件式には、以下のものが使えます。
==- 数値として等しい
===- 文字列として等しい
!=- 数値として等しくない
!==- 文字列として等しくない
>- 左が右より大きい
>=- 左が右と同じかより大きい
<- 左が右より小さい
<=- 左が右と同じかより小さい
尚、数値としての比較と、文字列としての比較では、使える演算子が異なる事に注意してください。
これらの式は、以下の演算子を用いて論理演算を行う事も出来ますが、パラフラやすずかでは、論理積と論理和が混在する場合には、必ず論理積も括弧で囲んでください。
&&- 論理積。左右双方の条件式が真値(非零)である場合に限り真値とする。左式が偽値(零)の場合は右式は評価しない
||- 論理和。左右の条件式のうちどちらかが真値(非零)である場合を真値とする。左式が真値(非零)の場合は右式は評価しない
!- 論理否定。論理式の真偽を反転する
SWF 4で配列変数やオブジェクト変数を使うには。
携帯電話対応のSWF 4上で動作するアクションスクリプトでは、配列もオブジェクトもサポートされておりません。
しかし、valueOf()函数を用いる事で文字列演算したものを変数名としてアクセスする事が可能になります。
SWF 4ではこれを用いる事で、擬似的に配列やオブジェクトを扱う事が可能になります。
SWF 4での擬似配列の扱い方。
SWF 4での擬似配列は、以下のような理屈で実現出来ます。
配列変数の代わりに、変数名と添字番号からなる名前の単純変数を必要な個数用意します。
- 但し、単純変数ですので、事前に宣言する必要はありませんし、そもそもSWF 4では宣言は出来ません。必要に応じて初期設定をしておけば良いでしょう。
例えば、SWF 4で a=new Array(1, 2, 3, 4); と言うのを実現したければ、
a0=1;a1=2;a2=3;a3=4;
と記述します。
実際にこれらにアクセスするには、添字が定数であれば、該当する単純変数に直接アクセスすれば良いでしょう。
配列の利点である添字に変数を用いてアクセスするためには、パラフラ及びすずかでは以下のようにします。
- 代入する場合
-
代入式の左辺値となる場合、文字列演算を用いてアクセスしたい単純変数名を表わす文字列をカッコで囲んで左辺値にします。
具体的には、
a[i]=1;としたいのであれば、('a' & i)=1;と記述します。
理屈としては、
- 文字列リテラル'a' に 数値変数
iの値を連結して 'ai' と言う文字列を得ます。 - そして、その文字列を括弧で囲んだものを左辺値にすると、その文字列の値が名前となっている変数への代入として扱われます。
- 文字列リテラル'a' に 数値変数
- 参照する場合
-
擬似配列の参照は、代入式の左辺値以外で用いる場合の全てが該当しますが、この場合は文字列演算で参照したい単純変数名を表わす文字列を引数とする
valueOf()函数を記述します。具体的には、
i=a[i]+1;としたいのであれば、i=valueOf('a' & i)+1;と記述します。
SWF 4で多次元配列を用いる場合。
二次元以上の多次元配列を携帯電話対応のSWF 4上で動作するアクションスクリプトにて実現するには、添字を次元数分並べるだけですが、単純につなげてしまうと、文字列演算の結果混乱が生じる事があります。
このため、添字と添字の間に _ を挟んでおきます。
例えば、a[1][2]=b[3][4][5]*2; と言うのを実現したいのであれば、
a1_2=b3_4_5*2;
と記述すれば良い訳です。
添字に変数が入る場合は文字列演算で実現するだけです。
例えば、a[x][2]=b[p][q][r]*3; と言うのを実現したいのであれば、
('a' & x & '_2')=valueOf('b' & p & '_' & q & '_' & r)*3;
と記述すれば良い訳です。
SWF 4での擬似オブジェクトの扱い方。
SWF 4での擬似オブジェクトも、文字列演算で実現します。
ただ、文字列を単純に連結すると、やはり混乱が生じるので、変数名とプロパティ名の間には _ を挟んでおきましょう。
例えば、idol.horikita='堀北真希'; をSWF 4で実現するには、
idol_horikita='堀北真希';
と記述すれば良いでしょう。
プロパティ名を変数とする場合の代入や参照も配列の場合と同様に出来ます。
例えば、orenoyome[person]='堀北真希'; をSWF 4で実現するには、
('orenoyome_' & person)='堀北真希';
と記述します。
左辺値でない場合は括弧の前に valueOf を付けるだけです。
SWF 4でプログラマが作成した函数を使うには。
SWF 4には function 節がないため、プログラマが函数を作る事が出来ません。
しかし、幸いな事に、callFrame()函数でサブルーティンを実行させる事は可能ですので、これで代用する事となります。
具体的には、サブルーティンとして実行したいコードを一つのフレームに収め、そのフレームの番号かフレームに与えたラベルをcallFrame()函数の引数とします。
その際に注意したい事は以下の通りです。
- ローカル変数の概念がありません。どうしても外部に影響されない変数を用いたいのであれば、何もないスプライトを用意して、そのスプライト上での変数を利用するなどの方法が考えられます。
- また、引数と言う概念も値を返すと言う概念もありません。従って値の引渡しにはやり取りするための変数名を決めておく必要があります。
- サブルーティンとなるのは1フレームのみです。複数フレームに跨ったサブルーティンを実行させたいのであれば、各フレームを順番に呼び出す必要があります。
- フレームの途中で処理が終わっても、そこで処理を終了させる命令はありません。条件分岐などを活用して用が済んだらあとは実行しないようにコードを工夫する必要があります。
- サブルーティンとしているコードを前方のフレームに書いてしまうと、必要ない場合でも実行されてしまう場合があります。サブルーティンを収めたフレームは必ず後方に置きましょう。
SWF 4で使える流れ制御節。
携帯電話対応のSWF 4上で動作するアクションスクリプトでは、流れ制御節として以下のものが使えます。
for(式1;式2;式3){}-
{ }で囲まれた節をループしますが、その前に式1
が評価されます。- 初め、ループに入る前に
式1
を評価し、 - ループの先頭で
式2
を評価して非零(真値)であれば節内を実行し、 - 節内を実行し終わったら
式3
を評価してループの先頭に戻ります。
- そう言えば制作者は
for(;;) {}節を全然使わないなあ…。
- 初め、ループに入る前に
while(式){}-
{ }で囲まれた節をループしますが、先頭で節内を実行するか否かを判断します。- ループの先頭で
式
を評価して非零(真値)であれば節内を実行し、 - 節内を実行し終わったらループの先頭に戻ります。
- ループの先頭で
do {} while(式);-
{ }で囲まれた節をループしますが、実行後に式
を評価して再度同節内を実行するか否かを判断します。 if(式) {} else {}-
式
を評価して非零(真値)であれば if…{}節を実行し、そうでない場合にはelse{}節があればそれを実行します。- else
{}節は任意です。
- else
tellTarget(式) {}-
式
をターゲット名として評価し、節内では当該ターゲット上をデフォルトの階層とて実行します。- 後述のスプライト(ムーヴィクリップ)の操作に欠かせません。
尚、SWF 4ではswitch() {} 節は記述出来ません。従って、case : ラベルも記述出来ません。
SWF 4で使える主な函数。
携帯電話対応のSWF 4上で動作するアクションスクリプトでは、主に以下の函数が使用出来ます。
- ここでは全ての函数を挙げてはおりません。
SWF 4でのみ用いるのが望ましい函数。
ここで挙げている函数は、全てSWF 6以降では動作しないか動作しても非推奨とされているかのどちらかですので、SWF 4でのみ用いるようにしてください。
- SWF 6以降では、オブジェクト指向の概念がより深くなっており、そのため何らかのオブジェクトにあるプロパティやメソッドを用いる事で同様の機能を得る事が出来ます。
callFrame(ラベル)-
ラベル
で指定されたフレームに在るスクリプトをサブルーティンとして実行します。- プログラマが作成したサブルーティンを使う場合に利用します。
random(数値)-
0以上
数値
未満の自然数の乱数を与えます。- SWF 6以降での
Math.random()メソッドとは機能が異なります。
- SWF 6以降での
time()-
フラッシュを表示してからの経過時間をミリ秒単位で与えます。
length(文字列)-
文字列
の長さを字数単位で与えます。 int(数値)-
引数の小数点以下を切り捨てた整数値を与えます。
concat(文字列1,文字列2)-
文字列1
と文字列2
を連結した文字列を与えます。- SWF 4では
文字列1 & 文字列2と同義です。
- SWF 4では
substr(文字列,数値1,数値2)-
文字列
に対し、数値1
文字目から、数値2
文字分の部分文字列を与えます。 ord(文字列)-
文字列
の先頭文字のアスキィコードを与えます。 chr(数値)-
数値
をアスキィコードとしている文字を与えます。
SWF 6でも使われる函数。
ここで挙げている函数は、SWF 6以降でも問題なく利用され得るものです。
getURL(URL,開き先,HTTPメソッド)-
URL
で指定された他のフラッシュ(或いは文書類)を開き先
で指定されたウィンドウにて取扱います。- 第二引数はHTMLでのtarget属性で用いられる値が指定出来ます。
- 第三引数は省略出来ます。
trace(式)-
式
の内容をトレースウィンドウに表示します。- 主にデバッグ用に用意された函数です。
- 実際にSWFとして出力する場合には影響は与えませんが、パラフラの場合プレヴューで多用していると重くなると言われております。
loadMovie(URL,ターゲット,HTTPメソッド)-
URL
で指定されたフラッシュをターゲット
として指定されたスプライト(ムーヴィクリップ)に代入します。- 指定されたスプライトの既存の内容は全て失われます。
- 第三引数は省略出来ます。
loadVariables(URL,ターゲット,HTTPメソッド)-
URL
で指定された文書類の内容を文字列としてターゲット
として指定された変数に代入します。- 第三引数は省略出来ます。
gotoAndPlay(ラベルまたはフレーム番号)-
当該フレーム実行終了後に
ラベルまたはフレーム番号
で指定されたフレームに移動して実行します。- この函数を実行したあとも当該フレームの処理は続いておりますので、注意してください。
SWF 4でのスプライト(ムーヴィクリップ)の操作方法。
携帯電話対応のSWF 4上で動作するアクションスクリプトでスプライト(ムーヴィクリップ)を操作するには、PC向けフラッシュで使えるSWF 6以降のそれとは大きく異なっております。
- 尚、SWF 4には attachMovie()メソッドに相当する函数がありませんので、取扱いたいスプライトは必ず事前にタイムライン上に置いておく必要があります。
SWF 4でのスプライト(ムーヴィクリップ)の複製。
携帯電話対応のSWF 4上で動作するアクションスクリプトでスプライト(ムーヴィクリップ)を複製するには、以下の函数を利用します。
duplicateClip(複製元のインスタンス名,複製先のインスタンス名,階層);
SWF 4でのスプライト(ムーヴィクリップ)の削除。
携帯電話対応のSWF 4上で動作するアクションスクリプトでスプライト(ムーヴィクリップ)を削除するには、以下の函数を利用します。
removeClip(削除したいインスタンス名);
勿論、削除したい階層に別のスプライトを置く事でも、結果的に削除出来る事は言うまでもありませんね。
SWF 4でのスプライト(ムーヴィクリップ)のプロパティ操作。
直接ターゲットを操作する場合。
ターゲットを直接操作するには、以下の点に注意してください。
ターゲットを指定するには、区切りとして . ではなく / を用います。
このとき、先頭は/で始まっている事が必要で、また/の前後に空白文字を入れてはいけません。
- 前後に空白があると、除算演算子と解釈されます。このように前後の空白の有無で演算子の意味を区別しているようです。
特に、_root. に相当するのは /: となります。
また、SWF 6以降ではプロパティ名は _ で始まっておりますが、SWF 4では _ は付きません。
例えば、_root.horikita.blouse._x=120; をSWF 4で実現するには、
/:horikita/blouse.x=120;
と書けば良い事になります。
ターゲットが文字列変数の値となっている場合。
ターゲットが文字列変数の値となっている場合には、上記の方法は使えません。
そこで、tellTarget(){ } 節を用います。
具体的には、tellTarget() 文の括弧内にターゲット名が入った文字列変数を入れ、直後の中括弧内で必要な操作を行います。
- このとき、ターゲットのプロパティへのアクセスには、thisキーワードを併用します。
- また、ターゲット外の変数については、当然ターゲット指定が必要になります。
_root上なら変数名の前に/:を付ける必要があります。 tellTarget() { }節の閉じ中括弧の直後には、必ず;を続けてください。
例えば、SWF 6に於いて、_root上で
n='_root.horikita';…n+='.blouse';…o=eval(n);o._x=120;o._y=140;o.desc='白いブラウス';o.value=a;
と言うのをSWF 4で実現するなら、以下のように書きます。
n='/:horikita';…n=n&'/blouse';…tellTarget(n) {this.x=120;this.y=140;desc='白いブラウス';value=/:a;};
SWF 4で外部から読み込んだフラッシュを操作するには。
SWF 4 で読み込める数少ない形式であるフラッシュを外部から読み込んで操作するには、以下のようにします。
- 空のスプライト(ムーヴィクリップ)を用意します
-
このスプライトを外部フラッシュの読込先にします。
このため、このスプライトには、インスタンス名を与えてスクリプトからアクセス出来るようにします。
-
特に、読込先となるスプライトを
duplicateClip()函数で複製して使えば、- 好きな階層にフラッシュを埋め込む事が出来る
- 不要になった時点で
removeClip()函数で削除するだけで領域を開放出来る
ので、便利でしょう。
以下、説明のため、このスプライトに
SWFSpriteと言う名前が与えられているとします。 -
loadMovie()函数で、外部フラッシュを当該スプライトに読み込みます-
読込用のスプライトに
SWFSpriteと言う名前が与えられていて、Horikita.swfと言うフラッシュを読み込みたい場合には、以下のようにします:loadMovie('Horikita.swf', 'SWFSprite'); - 当該スプライトを対象とした
tellTarget(){ }節内でgotoAndPlay()函数を実行する -
例えば、読込用のスプライトに
SWFSpriteと言う名前が与えられていて、そこにHorikita.swfと言うフラッシュを読み込んでいて、そのフラッシュ内のSTARTと言うラベルから実行させる場合は、以下のようにします:tellTarget('/SWFSprite') {gotoAndPlay('START');};
SWF 4での動的なテキストの操作方法。
SWF 4にはテキストフィールドが存在しないので、例えばパラフラなら変数名を与えたテキストアイテムを用意してそれを操作するしかありません。
テキストアイテムの場合、フォントのサイズと前景色が固定され、背景色などの属性は指定出来ないため、
- 背景色も指定したい
- 文字の色を使い分けたい
と言う場合には、スプライトに纏めて、それを操作する事になります。
枠線を付けたいのであれば、枠線を成すような画像を用意して、それをスプライトに貼り付ければよいでしょう。
- こう言った事は具体例を挙げるべきでしょうが、今回は割愛させていただきます。
ダイヤルボタンでの入力受付の方法。
現状では SWF 4 は携帯電話向けのフラッシュのために存在している規格と言えるので、ダイヤルボタンでの入力処理はゲームなどのインタラクティヴな携帯電話用フラッシュには欠かせないものとなるでしょう。
実際にダイヤルボタン(以下混同を避けるためキーと書きます)での操作を実現するには、ボタンアクションを利用します。
アクティヴなボタンのうちの一つにキーに対応する処理命令を記述します。
例えば、1 キーが押された際に、ルート上の変数 inputKey に 1 を代入したい場合は、アクティヴなボタンのうちの一つにボタンアクションとして、以下のように記述します。
on (keypress "1") {/:inputKey=1;}
勿論、複数のキーの処理を記述するのであれば、必要なだけ繰り返す事となります。
- パラフラの場合は、複数の処理の間に
-のみの行を記述しますが、すずかでは-のみの行を記述せずにそのまま並べます。
このとき、注意すべき事を挙げておきます。
- 複数のボタンに同じキーの処理を書かない
-
複数のボタンに同じキーの処理をボタンアクションとして書いた場合、どちらが処理対象になるか分かりません。
寧ろ複数のキーを単一のボタンにまとめて書いた方が安全です。
on (keypress) {}節でのキーの指定は、半角の二重引用符で囲みます-
例えば、以下のように単引用符で囲んだ場合、エラーとなります:
on (keypress '1') {/:inputKey=1;} - 携帯電話にないキーも有効です
-
例えば、# は PC で直接入力するのが面倒なので、PCでは代わりに - でも入力出来るようにすると言う事も可能です。
但し、複数のキーに同じ処理を記述する方法はありません。
それぞれのキーに同じ処理を記述する事になります。
- 可能ならカーソル操作も可能にしましょう
-
携帯電話だけでなく、プレイステーションポータブルなどもフラッシュが使えます。
また、PCの場合はキーボードよりマウスの方が多くの場合に於いてスムーズな操作が出来ます。
このため、可能ならボタンアクションを活用してカーソル操作でも操作出来るようにすると便利になるでしょう。
携帯電話専用命令。
携帯電話向けのフラッシュプレーヤには、FSCommand2()と呼ばれる函数が用意されていて、これを用いる事で電波状況や電源状況などと言った携帯電話ならではの情報を取得する事が可能になります。
また、時刻などもFSCommand2()函数を用いる事で、電話機で設定している時刻を取得出来るようになります。
- これに依り、例えばマスコットとした女の子が時刻に依り服装を変えるようなフラッシュを作る事も可能です。
ただ、これらの機能は、当たり前ですがPCではエミュレートする事は出来ません。
エヌ・ティ・ティ・ドコモ社が配布しているシミュレータでも、テスト出来る範囲は限られておりますので、可能であれば実機でのテストをお奨めします。