ケータイFlashゲーム制作レクチャー
テクニカルノート
2007年8月1日
このテクニカルノートは,技術評論社刊『作って!遊んで! 自慢する! 本格ケータイゲームFLASH編』西村直樹・藤田和久(Studio無限界)著に掲載したテクニカルノートに加筆,修正を加えたものです。今後も,連載の内容に応じて,予告なく加筆,修正が加わることがあります。
なお,FlashLite 1.0/1.1と他のFlashのActionScriptとの相違点を確認したい場合は,付表「FlashLite1.0/1.1と他のFlashのActionScriptとの相違」を参照ください。
記号
%(=剰余算)
→算術演算
C
call
スクリプトを組んでいると「あれ,これと同じ処理,別のフレームにも書いたなぁ。」という事がよくある。こうした汎用的な処理は,どこかに置いておいて必要に応じて参照できれば効率的である。これが“サブルーチン”である。サブルーチンは,ムービーもしくはムービークリップ内の表示に影響しないフレームにラベルとアクションのみのレイヤを作成し,そこに記述する。この時,このフレームに設定したラベル名は特にサブルーチン名と呼ぶ。サブルーチンの呼び出しは,callアクションにより行なう。
call(サブルーチン名);
と記述すればよい。結果的にラベル名のフレームにジャンプするため,goto~()と似ているようにも見えるが,実際の処理手順は,goto~()とは,大きく異なる。call文は,その文により他の処理を待たずそのままサブルーチンのフレームに処理が移り,そのフレームの処理を行い,それが終わるとcall文の次の行に処理が移る。
goto~()とは,フレーム移動のタイミングも,先のフレームに記述されたアクション処理後の振る舞いも異なるのである。
D
do-while文
do{
処理
}while(条件);
の形で記述する制御文。条件が真の間,処理を繰り返す。
条件文が処理の後ろにあるため,始めから条件が偽であったとしても,1回は処理を実行することになる。このような繰り返し文を一般に「後判定の繰り返し」という。
duplicateMovieClip
ステージ上にあるムービークリップ(正しくは,そのインスタンス)の複製を作成する。複製されたインスタンスのプロパティの初期値は,複製元のプロパティと同じとなる(複製したインスタンスを削除する場合は,removeMovieClipを使用する)。
この関数は,同タイプのムービークリップを必要に応じ複数個利用したい場合など非常に便利な処理であるが,残念ながらFlashLiteにおける利用は,あまり現実的とは言えない。
その理由は,duplicateMovieClipによりコンテンツの使用メモリ量がどの程度増加するかを正しく把握することが困難だからである。現在の所,FlashLiteのコンテンツ制作において,一番のネックは実行時のメモリサイズの制限であり,ゲームデザインは,思いついたアイデアを所定のサイズ内に如何に収めるかの戦いでもある。インスタンスの複製は,実行中にメモリ使用量が大きく変動するため,実質的な実行サイズの見積もりが出来ないのだ(この部分に関する仕様は端末間の差も大きい。各キャリア情報で確認したりFlash CS3での制作時ならエミュレータで試すことも可能ではあるがそれも保障にはならず,結局は実機で動作確認しなければ確かとは言い難い)。
したがって,FlashLiteにおいては,この関数の利用を避け,あらかじめ画面外にインスタンスを隠しておくなどの手段を講じた方が賢明と言えるだろう。
E
else文
→if文
eval
eval(文字列)と記述した際に,()内の文字列を変数名(もしくはパス名)とみなし,その保持する値を返します。
→擬似配列
f
for文
for(初期化式;条件;再初期化式){
処理
}
の形で記述する制御文。条件が真の間,処理を繰り返す。
予め初期化式で変数の値を初期化し,条件が真であれば処理に制御を移し,再初期化式で変数の値を更新,再び条件を確認,真ならばまた処理を繰り返す。予め繰り返す回数がわかっている場合などに有効な繰り返し法である。
G
getTimer
ムービーの再生開始時からの経過時間をミリ秒単位で返す。ゲームに制限時間を設ける場合は,スタートキー押下時に初回のgetTimerを行いその戻り値を保存して置く。この値をゲーム進行中に随時呼び出したgetTimerの戻り値から差し引けば,これが経過時間(単位ミリ秒)と言うことになる。この"経過時間(仮にxとする)"は,以下の式により"分:秒:ミリ秒(順にab:cd:efgとする)"に直すことができる(ただし,経過時間は1時間を越えないものとする)。
x=getTimer() - startTime; //x=経過時間,startTimeは,
//スタートキー押下時のgetTimerの値
a=int(x/600000); //a=分の十の位
b=int(x/60000%10); //b=分の一の位
c=int(x/1000%60/10); //c=秒の十の位
d=int(x/1000%60%10); //d=秒の一の位
e=int(x%1000/100); //e=ミリ秒(百の位)
f=int(x%100/10); //f=ミリ秒(十の位)
g=int(x%10); //g=ミリ秒(一の位)
なお現在時刻を求めたい場合は,fscommand2を用いて次のように記述すればよい。
hours = fscommand2(""GetTimeHours""); //現在時(0~23の値)
minutes = fscommand2(""GetTimeMinutes""); //現在分(0~59の値)
seconds = fscommand2(""GetTimeSeconds""); //現在秒(0~59の値)
gotoAndPlay
gotoAndStop
getTimer
SWFファイルを再生し始めてからの経過時間をミリ秒単位で返す。
例えば,あるフレームにおいて,
t1 = getTimer();
を記述しておき,別のフレームで,
t2 = getTimer();
と記述する。ここでt2とt1の差分を求めた時,その値が1000以上であれば,t2計測時はt1の時点から1秒以上経過していることがわかる。
H
hitTest
Flash5から採用されたオブジェクト同士の衝突判定用関数(MovieClipクラスのメソッド)。例えば,オブジェクトA,Bの衝突を判定する場合,
A.hitTest(B)
の記述により,この式の値が,2つのオブジェクトが衝突していれば“真(=true)”,衝突していなければ“偽(=false)”となる。また,
A.hitTest(x,y,flug)
という書き方を使えば,オブジェクトと点の衝突判定も可能であるため,ムービークリップをボタンとして利用する際の「マウスポインタがオブジェクトに触れたか?」といったチェックも可能となる。
このような衝突判定は,ゲーム制作においては特に“当たり判定”呼ばれ,必須な処理のひとつなのだが,Flash Lite1.0およびFlash Lite1.1において,この機能がサポートされていないことは(Flash4ベースなので当然なことではあるが),残念な限りである。ただし,Flash Lite2.0からはサポートされているので,ケータイFlashの制作においても今後利用機会の増える機能であることは間違いない。
I
if文
if(条件){処理}
と記述すると,条件が真(演算の結果が0以外の値となる)の場合のみ{}内の処理を行い,偽(演算の結果が0となる)の場合は行わないというように,処理の分岐が行える。
if文は他に,
if(条件){
処理1
}
else{
処理2
}
条件が真の場合は処理1を,偽の場合は処理2を行う。
if(条件1){
処理1
}
else if(条件2){
処理2
}
条件1が真の場合は処理1を, 条件1が偽で条件2が真の場合は処理2を行う。
などのバリエーションがある。
ここで,条件は必ずしも評価式の形になっていなくても良い。変数でも式でも最終的な演算の結果が評価される。したがって,
if(a == 3)
と記述する所を,
if(a = 3)
と記述してしまうと,最終的な演算の結果として3という値が評価され,この条件は常に“真”となってしまう。これは初心者が犯しがちでかつ発見しづらいバグであるため,特に注意していただきたい。
int
int(変数名)の記述によって,変数名の保持する値の小数部を切り捨てた値を返します。
N
nextFrame
P
play
prevFreame
S
set
set(文字列,値)と記述した際に,()内の文字列を変数名(もしくはパス名)とみなし,その変数に値を格納します。
→擬似配列
stop
T
tellTarget
例えば,ムービーにムービークリップとボタンを配置する。ムービークリップは,1フレーム目にstop()を記述し停止状態にしておく。ここで,任意のボタンが押下されたらムービークリップの2フレーム目以降が再生されるようなムービーの作成を考える。このような動作を実現するためには,ムービーに置かれたボタンのボタンアクションから,別のオブジェクトであるムービークリップに対してgotoAndPlay(2)を発行しなければならない。この問題は,tellTargetアクションを利用することで解決する。
tellTargetアクションは,
tellTarget(対象となるオブジェクトのパス){
処理
}
と記述することにより,{}内の処理の対象を,スクリプトを記述したオブジェクトから,()内に記したパスで示されるオブジェクトに移す働きを持つ。
tellTargetアクションを使用する際に注意すべき点は,{}内は完全に対象となるオブジェクト内のコントロールとなる事である。仮にムービー上のあるフレームに,
v00 = 1;
tellTarget("/m10"){
if(v00==1){
gotoAndPlay("pt1");
}
}
と記述した場合,m10インスタンスの再生フレームがpt1に移動する事は期待できない。なぜなら,{}内で参照している変数v00は,m10インスタンス内の変数として参照されているからだ。これをステージ上の変数として参照したい場合,次の様に記述する事になる。
v00 = 1;
tellTarget("/m10"){
if(/:v00==1){
gotoAndPlay("pt1");
}
}
trace
開発を進めていると,「本当にそのアクションを通過しているか」,「変数の値が想定通りにセットされているのか」といった疑問が,生じることが多い。これを確認するために用いる関数が,Trace関数である。例えば,
for(i=0;i<5;i++){
Trace("i = " add i);
}
というようにスクリプトを記述すれば,プレビュー時Flashの出力ウインドウに
i = 0
i = 1
i = 2
i = 3
i = 4
と表示される。
覚えておくと開発の効率が格段にアップすること請け合いである。
W
while文
while(条件){
処理
}
の形で記述する制御文。条件が真の間,処理を繰り返す。
条件文が処理の前にあるため,始めから条件が偽であった場合,処理は1回も実行されないことになる。このような繰り返し文を一般に「前判定の繰り返し」という。あ
アクション
スクリプト,アクション,コード。Flashのメニューや解説本では,これらの単語をニュアンスで呼び分けているが,これらは皆ムービーおよびムービークリップ内に記述するプログラムの事を指しており,同義と思って構わない。もともと,スクリプトは“脚本”,アクションは“演技”という意味だが,ひとが演じる芝居と違ってコンピュータにはアドリブがない。書かれた脚本(=スクリプト)は100%忠実に再現(=アクション)される。したがって,スクリプト,アクションの二語に実質的な違いはないのだ。またコードはスクリプトとして記述される文字列自体の事である。本質的に,していることはプログラミングなのだが,一般にFlashの中では“プログラム”という言葉をあまり使わない。確かに,事務的なプログラム(=“段取り”)という言葉より,スクリプトやアクションという言葉の方が,Flashにはお似合いだと思う。なおアクションはその用途から,“フレームアクション”と“オブジェクトアクション”に大別される。
い
インクリメント,デクリメント
| 記号 | 意味 | 働き |
|---|---|---|
| ++ | インクリメント | 演算子の前(または後ろ)に付随する変数の値(数値)を1加算する。 |
| -- | デクリメント | 演算子の前(または後ろ)に付随する変数の値(数値)から1減算する。 |
++もしくは--を変数の前に書く場合と後ろに書く場合との違いは,式の実行順序に影響する。すなわち++を前に付けた場合は加算→参照となり,後ろに付けた場合は参照→加算となる。例えば,
a=0;
if(++a == 1){}
の場合は,変数aに1加算された後に定数1と比較されるので,結果は真となるが,
a=0;
if(a++ == 1){}
の場合は,定数1と比較された後に変数aに1加算されるので,結果は偽となる。
インスタンス
Flashではステージに配置されたシンボルをすべてオブジェクトもしくはインスタンスと呼ぶ。しかしスクリプトを書く上で特に注目しなければならないオブジェクトはムービークリップである。スクリプト内では,インスタンスをインスタンス名により識別する。また,ステージに配置したインスタンスおよびその(ムービークリップの)中に配置したインスタンスは階層構造を持つが,この階層の中でのインスタンスの所在を示したものが“パス”である。
特にFlash4のActionScriptでは,クリップアクションが使用できないため,ユーザ操作に対するムービークリップの反応はすべて,ボタンアクションとしてムービークリップの外から記述することになる。したがって,インスタンスを特定するためのパスやインスタンス名は,非常に重要な概念となる。
インスタンス名
インスタンスを識別するために付けられる名前
お
オブジェクト
オブジェクトアクション
Flashにおけるもうひとつのアクションが,“オブジェクトアクション”だ。オブジェクトアクションは,さらに細かく“ボタンアクション”と“クリップアクション”に分かれるのだが,Flash4のActionScriptでは,クリップアクションは使用できない。したがって,ユーザ操作に対するムービークリップの反応はすべてボタンアクションとして記述することになる。
ボタンアクションは,ボタンの操作に応じて実行されるアクションだ。
on ( event ) {
処理
・
・
・
}
か
カウンタ
関係演算
関数とメソッド
関数とは,SWFファイル内で再利用可能な機能部品のことである。サブルーチンのようにタイムライン上のフレームを消費することなく,スクリプトの部品化が可能である。
またクラス内に定義した関数を特にメソッドと呼ぶ。
FlashLite2.0においては,関数またはクラスとそのメソッドをユーザ定義することが可能だが,それらを利用するためには,それが定義されているフレームに再生ヘッドが既に到達していなければならない。
き
擬似配列
ほとんどのプログラム言語には配列と呼ばれる変数形式が存在する。同じ目的で利用する複数のデータを単一の名前(配列名)で一括管理できるようにした変数である。個々のデータの特定は添え字(インデックス)と呼ばれる番号で行なえる。この添え字にカウンタ変数を使い繰り返し処理を行えば,複数のデータの参照や更新をひとつの記述でまかなえるため,プログラムが冗長になるのを避ける事ができる。残念ながらFlash4のActionScriptには,この配列と言う変数形式が存在しない。しかし,文字列処理とsetアクションやeval関数を組み合わせて利用する事により,同様の効果を得ることができる。これを“擬似配列”または“エミュレートされた配列”と呼ぶ。
- 擬似配列利用時の変数名
- 変数を擬似配列として利用したい場合,変数名の末尾に連続した数値を付加すればよい。例えば,変数名arryを要素数13の配列として利用したい場合,arry0,arry1,arry2,・・・,arry12という具合である。
- 擬似配列へのデータの代入
擬似配列として利用すると言っても,個々の変数は普通の変数であるから,
arry0=5;
arry1=3;というように通常の操作でデータを代入することに何の差しさわりもない。しかし,擬似配列がその恩恵を賜るのは,「全ての変数に0を代入したい」などといった一括処理においてである。この場合,次のように記述できる。
for(i=0;i<13;i++){ set("arry" add i,0); }setアクションは,set(変数名,値)と記述することで変数名に値の代入を行なうアクションである。この時変数名は文字列としてセットできるため,配列名“arry”とカウンタ変数iの連結が可能となる。
- 擬似配列変数の値の参照
同様に「もし個々の変数の値が1だった場合・・・」のような処理を記述したい場合,eval関数を用いて,次のような記述となる。
for(i=0;i<13;i++){ if(eval("arry" add i) == 1){ ・ ・ ・ } }- 擬似配列利用上の留意点
- アドビ社が発行する「Adobe FlashLiteオーサリングガイドライン」には次のような記述がある。「ストリングおよびエミュレートされた配列の処理を避けます。この処理はCPUに高い負荷がかかることがあります。」実は擬似配列というテクニックは,公式には推奨しかねるテクニックなのだ。しかし,実際に試してみていただければわかると思うが,擬似配列を利用したムービーが直ちに実用に適さないほど重くなるかと言えば,そんな実感はない。もちろん円滑なアニメーションを実現するためにはcpu負荷が低いに越したことはない。ただ負荷が高くなることを恐れていては,ゲームを“作りこむ”ということができない。より大切な事は「作ろうとするゲームがちゃんと動くだろうか?」という不安にかける保険ではなく,「出来上がったゲームがより面白く動いている」という結果なのだ。そうした理由から,筆者は製作の過程で必要とあれば,躊躇なく擬似配列を利用する事にしている。もちろん,不必要にcpu付加を高めるような処理は作らないように努めているし,出来るだけ単純化した処理の作成を心掛けている。筆者はいたずらにガイドラインを軽視した製作を推奨している訳ではない。しかし,リスクがあると言われている手法も,それを正しく理解した上で上手に使いこなす事ができれば,その分創造の幅が確実に広がるとの考えから,あえて擬似配列というテクニックを紹介したのである。
こ
コード
異なるムービークリップに対する操作
さ
サブルーチン
→call
算術演算
| 記号 | 働き |
|---|---|
| + | 加算 |
| - | 減算 |
| * | 乗算 |
| / | 除算 |
| % | 剰余算 |
+(=加算),-(=減算),*(=乗算),/(=除算)の四則演算の他に,%(=剰余算)がある。剰余算とは割り算の余りを求める計算であるが,これが使いこなせると非常に重宝である。
例えば,トランプを使用したゲームを作成するため,カードムービークリップを作るとする。1~13フレームにはハートのA~K,14~26フレームにスペードのA~Kと1フレームずつ各カードを配置して,1~52のフレーム番号を任意で選びカードを表示する作りだ。この場合,(選ばれたフレーム番号-1)を13で割った余りを求めて1足せば,カードのナンバーを得る事が出来る。式で書けば,
(選ばれたフレーム番号-1)%13+1
という具合だ。
またこの例で考えるとカードの柄(正しくはスーツという)を求めるためには(選ばれたフレーム番号-1)を13で割って,商を求めれば良いのであるが,これには注意を要する。もし選ばれたフレーム番号が15の時,
num=(15-1)/13
の式で得られるnumの値は,4ではなく4.66666666666667となってしまうのだ。ActionScriptにおいて除算の解を整数値として求めたい場合は,int()アクションを用いて少数部を明示的に切捨てをなければならない。
し
処理の繰り返し
同様の処理を何度も行うために繰り返し構造を作成することは,プログラミングの常識であり,ほとんどのプログラム言語にはこれを実現するための構文が存在する。ActionScriptにおいても,for,while,do-whileなどの繰り返しを実現するアクションがある。例えば,forアクションは,
for(カウンタの初期化;カウンタの繰り返し条件;カウンタの増分式){繰り返す処理}
の構文で繰り返しを記述でき,配列の操作とも相性がよい。前項で紹介した
for(i=0;i<13;i++){
set("arry" add i,0);
}
などが代表的な使用例である。多少なりともプログラミングをかじった者は,このようなスクリプトを記述することについて,何のためらいもないだろう。このような記述は多くのプログラム言語において基本中の基本であるためだ。しかし,Flashムービーの作成に際しては,本当にfor文などの繰り返し処理を作成する必要があるか否かをよく検討するべきである。なぜなら,flashは円滑なアニメーションの実現を最優先するために,1フレームの演算がフレームレート内に処理しきれなかった場合,強制的にアクションが打ち切られて次のフレームに再生ヘッドが移動してしまうのである。ここで,1フレームの演算と表現したが,この演算にはアクションだけでなく画像表示のためのベクター演算も含まれている。また,アクションが打ち切られた場合,そこで参照されていた変数の値は“不定”となってしまう。前項で擬似配列はcpu負荷が高いと記したが,確かにこの高負荷の処理を繰り返しで行えば,フレームレート内で処理しきれないリスクは大きい。このリスクを回避するための1番の方法は,繰り返しを行なうフレームにstopアクションを記述し,フレームレートをオーバーした際にも再生ヘッドが移動しないようにする事である。また場合によっては,for文などの構文によらず繰り返しを実現する方法が取れるかも知れない。例えば,gotoAndPlay()で再生フレームを戻すことにより繰り返しを作ることも可能である。
処理の分岐
→if文
剰余算
→算術演算
す
スクリプト
スクリプト実行の順位
Flashムービーの,あるフレームにおける実行順位は,フレームアクション(タイムライン上のスクリプト)の処理→そこに配置されている各オブジェクトの処理となる。ここでオブジェクトの処理とはシェイプやグラフィックの描画であるが,それがムービークリップの場合,さらにオブジェクトアクションやオブシェクト内のフレームアクションを処理し,より下位に配置されているオブジェクトの処理へと続くことになる。
ところで,ここでレイヤー毎に注目した場合,実験的にはちょっと面白い動作を示すことが,わかっている。
フレームアクションにおいては,より上位に定義されたレイヤーが先に処理される。しかし,オブジェクトの処理順は,パブリッシュ設定のダウンロード順序に従うためデフォルトのままだと「下から上へ」という事になり,より下位に定義されたレイヤー上に配置されたものからとなる。つまり,処理順序が逆転するのだ。例えば(注),Layer1の上位にLayer2を追加した場合,フレームアクションは「Layer2に記したフレームアクション→Layer1に記したフレームアクション」の順に処理されるが,オブジェクトの処理は,これらのフレームアクションの処理終了後に,「Layer1に配置したオブジェクトの処理→Layer2に配置したオブジェクトの処理」の順に実行される。
(注)連載第3回目で使用したサンプルファイル〔Flashの処理順サンプル.fla〕を参照。
したがって,ムービーの,あるフレームに再生ヘッドが位置する時点で処理され得るすべてのアクションに,同一変数に対する更新を記したとすれば,シーン1のフレームアクションに記した更新から順に処理がなされ,最終的には一番上位のレイヤーに配置されたムービークリップのフレームアクションの更新値が有効になる。
このことは,goto~など再生ヘッドを移動させる処理についても同様である。すなわち,異なるレイヤーに配置した複数のオブジェクトにおいて,メインとなるシーン1のタイムラインの再生ヘッドを移動させる処理(例えばgotoAndPlay)が重複して呼び出されたとすると,一番最後になされた呼び出し(すなわち,一番上位のレイヤーに配置されたムービークリップからのgotoAndPlay)が有効となるのである。なぜなら,再生ヘッドの移動は一般のプログラム言語におけるgoto文と異なり,あくまでもそのフレームの処理がすべて終了した後に,次に再生ヘッドを移動させるフレームを指定しているに過ぎないからである(複数呼び出された再生ヘッドの移動は,順次実行され最後の移動処理が終了した時点で,その落ち着いた先のフレームの処理を開始する)。
ActionScriptのこうした振る舞いはFlash特有のものであり,しばしば開発者の混乱を誘う。無用の混乱を避ける意味でも(状況によって必ずしもではないが),
などの対処を心掛けるように,筆者は薦めている。
ストリング
文字列の事
た
代入式
| 記号 | 意味 | 働き |
|---|---|---|
| = | 代入 | 左辺の変数に右辺の値を代入する。右辺は,変数,数値,文字列のいずれでも良い。 |
| += | 加算後代入 | 左辺の値と右辺の値を足し,左辺の変数に代入する。 |
| -= | 減算後代入 | 左辺の値から右辺の値を引し,左辺の変数に代入する。 |
| *= | 乗算後代入 | 左辺の値と右辺の値を掛け,左辺の変数に代入する。 |
| /= | 除算後代入 | 左辺の値から右辺の値を割り,左辺の変数に代入する。 |
| %= | 剰余算後代入 | 左辺の値から右辺の値を割りその余りを,左辺の変数に代入する。 |
て
デクリメント
定数
スクリプト内に直接書かれた数字もしくは""で挟まれた文字および数字の並びのことを定数(もしくはリテラル)という。直接書かれた数字は,数値として扱われる。""で挟まれた文字および数字の並びは,文字列として扱われる。数字だけからなる文字列(例えば"12345")は,数値として扱われないため,算術演算を行っても正しい解は得られない。すなわち,
"12345" + 6
の解は,6 となってしまい,12351 にはならない。しかし,
a = "12345";
b = a + 6;
の解は,12351 となる。これはa+6の演算において,変数aの値である12345が,数値と評価された上で,6と加算され,その結果の値が変数bに代入されるためである。
と
等価演算および関係演算
| 数値 | 文字列 | 意味 |
|---|---|---|
| == | eq | 左辺の値と右辺の値は等しい |
| <> | ne | 左辺の値と右辺の値は等しくない |
| > | gt | 左辺の値は右辺の値より大きい |
| < | lt | 左辺の値は右辺の値より小さい |
| >= | ge | 左辺の値は右辺の値より大きいか等しい |
| <= | le | 左辺の値は右辺の値より小さいか等しい |
Flash4のActionScriptでは,数値を比較する場合と文字列を比較する場合で,使用する演算子が異なる(文字列を比較する場合,文字列の大小は文字のコードに準じる事になる。)。
は
パス
メインとなるムービーや配置したインスタンスによって作られる階層の中,それらの所在を示すものが“パス”である。パスの表記には,“相対パス”と“絶対パス”の二通りがある。相対パスは,自身のインスタンスの位置を基準として他のインスタンスの位置を示す。絶対パスは“フルパス”とも言い,メインとなるムービーを基準として他のインスタンスの位置を示す。今,メインとなるムービーにm10,m20という2つのムービークリップをインスタンスとして配置し,さらにm1内にm11,m12というムービークリップをインスタンスとして配置したとする。この時,メインとなるムービーおよびm10,m20,m11の絶対パスと,m12から見た相対パスは,以下の表の通りとなる。
| 絶対パス | 相対パス | |
|---|---|---|
| メインとなるムービー | / | ../../ |
| m10 | /m10 | ../ |
| m11 | /m10/m11 | ../m11 |
| m20 | /m20 | ../../m20 |
すなわち,"../"でひとつ上の階層を示す。これを「親」と呼ぶ。また,メインとなるムービーの絶対パス"/"のことを「ルート」とも言う。
配列
→擬似配列
ふ
フラグおよびカウンタ
特にActionScriptの文法上のきまりではないが,一般にプログラムの世界では,アイテムをGETしていれば1,していなければ0というように何かの状態を判断する目的で,0もしくは1の値しか取らない変数を設定することが多い。これを特に“フラグ”と呼ぶ。フラグにセットする値0と1は,その意味合いから0をfalse(偽の意),1をture(真の意)と書くこともできる。なお,フラグに1をセットすることを「フラグを立てる」と言う。
一方,変数を得点やミスプレイの数など,何かのイベントの数を数える目的で利用することも多い。この場合は,“カウンタ”と呼ぶ。
フレームアクション
フレームアクションは文字通り,アクションをキーフレームに直接記述する。記述されたアクションはそのキーフレームを通過した時点で実行される。フレームアクションは,特にどのレイヤに記述しなければならないという決まりがある訳ではないし,やろうと思えば,同一フレームの複数レイヤに分けて記述することも可能だ。しかし,こうした作り方は可能ではあるものの,やはりお勧めできない。本書では,すべてのサンプルのムービーおよびムービークリップについてフレームアクションを記述するレイヤを“アクション”と名付け統一している。このような作り方が,スクリプトの記述位置をいちいち探す手間を省き,開発効率を高めることは,一目瞭然であろう。
フレームラベル
フレームには,そのフレームを特定するための名前を付けることができる。これを“フレームラベル”(または省略して単に“ラベル”)と呼ぶ。
gotoAndStop()やgotoAndPlay()もしくはcall()のジャンプ先として,フレームを指定する際にgotoAndStop(10)などとフレーム番号の数値を直接記入してしまうと,その後フレームの挿入や削除を行う度に修正が必要となり,面倒である。フレームラベルは,この手間を解消してくれる。
また,フレームラベル名は,call()のジャンプ先と見た場合,その働きから,“サブルーチン名”とも呼ばれる。
プロパティ
プロパティとはムービーやインスタンスの属性のことであるが,スクリプトからみた場合これも変数に相違ない。FlashLite1.0/1.1で利用可能な主なプロパティは以下の通り。
| プロパティ | 用途 |
|---|---|
| _alpha | インスタンスの透明度(0~100)を参照,変更できる。 |
| _currentframe | インスタンスの現在の表示フレームを参照できる(変更はできない)。 |
| _focusrect | 現在フォーカスされているボタンの周りに黄色い枠を出すか否かのフラグ |
| _level | SWFファイルのロードされた順に,0からの連番が割り当てられる。 |
| _name | インスタンスの名前を参照,変更できる。 |
| _rotation | インスタンスの回転角度を参照,変更できる。 |
| _target | インスタンスの絶対パス名を参照できる。 |
| _visible | インスタンスの表示/非表示のフラグ(true/falseいずれかの値をとる)を参照,変更できる。 |
| _width _height | インスタンスの幅と高さを参照できる(Liteでは変更はできない)。 |
| _x _y | インスタンスの位置(座標)を参照,変更できる。 |
| _xscale _yscale | インスタンスの表示サイズ(%値)を参照,変更できる。 |
へ
変数
“変数”とはスクリプト内で数値や文字列を保存しておく入れ物のようなものであり,“変数名”によって,識別される。ActionScriptでは変数は特に使用宣言などしなくても使えてしまうため便利である反面,変数名をタイプミスしてもエラーとならず別の変数が作られてしまうなど,注意も必要である。
変数名の有効範囲は,ムービーまたはムービークリップ単位である。したがって,インスタンスが異なれば,同じ変数名でも別の変数として扱われる。あるインスタンスから別のインスタンスもしくはステージ上で定義した変数を参照したい場合,
パス:変数名
と明示的に記述する必要がある。例えば,ルート階層に二つのムービークリップ「clipA」と「clipB」があったとして,clipA内からclipB内の変数を参照したとすると,
絶対パス /clipB:変数名
相対パス ../clipB:変数名
となる。
なお,変数名の付け方には,特に決まりはないが,先頭文字に数字を付けたり,"_"以外の記号を使ったりする事は,取り扱いが面倒となるため避けたほうが良い。
変数名
変数を識別するために付けられる名前
→変数
ほ
ボタンアクション
む
ムービーおよびムービークリップの停止と再生
以下に,ムービーおよびムービークリップにおいて,その停止・再生および再生フレームの移動を行うアクションについて,表としてまとめておく。
| アクション | 機能 | 説明 |
|---|---|---|
| stop() | 停止 | 再生を現在のフレームで停止する。 |
| play() | 再生 | 現在のフレームから再生を開始する。 |
| gotoAndStop() | 移動後停止 | ()内に指定したフレームに再生ヘッドを移動し,そのフレームで停止する。 |
| gotoAndPlay() | 移動後再生 | ()内に指定したフレームに再生ヘッドを移動し,そのフレームから再生を開始する。 |
| nextFrame() | フレーム送り | 停止フレームを1フレーム進める。 |
| prevFreame() | フレーム戻し | 停止フレームを1フレーム戻す。 |
なお,FlashのActionScriptにおけるgotoAndStop文やgotoAndPlay文は,一般的なプログラム言語におけるgoto文といささか事情の異なる動きを見せる点注意が必要である。
例えば,あるムービーの1フレーム目にフレームアクションとして,
trace("フレーム1の1行目");
gotoAndStop(2);
trace("フレーム1の3行目");
と書いて実行してみる。プログラマー的な感覚だとgotoAndStop文の次に書いたtrace文は表示されないはずなのだが,実際はしっかり表示される。gotoAndStop文はあくまでもムービークリップの再生ヘッドをジャンプさせる命令であり,スクリプトのシーケンスを制御するものではないのである。
め
メソッド
も
文字列(ストリング)演算
| 記号 | 働き |
|---|---|
| add | 連結 |
文字列同士の連結を行う。すなわち,
"ABC" add "DEF"
の解は,"ABCDEF"となる。連結される文字列は,定数,変数どちらでも良い。また,
"ABC" add 123
は,123を文字列として変換後連結するため,"ABC123"となる。
本来,Flash4のActionScriptの連結演算子としては"&"コマンドがある。しかし,FlashLiteでは,これは使用できない。注意されたし。
ら
ラベル
乱数
“乱数”は,ゲームを作成する場合に欠かすことの出来ないアイテムのひとつだ。Flash4のActionScriptにおいては,random関数によってこれを得る事ができる。random関数は,()内に選択幅を指定する事で,0から(選択幅-1)の任意の整数値が得られるのである。例えば,さいころをシミュレートしたければ,
r = random(6);
とすれば,0~5の内の任意の値が得られる(1~6で値が欲しければ,この値に+1すればよい)。
ここで,よく問題となるのが,random関数は使用される回数を意識していないので,結果となる値に重複が有り得るということだ。今得られた値が前回と同じ値だったというようなことは当然のことで,指定した選択の幅が小さければむしろ同じにならないことの方が有り得ないと言える。しかし,例えば「順番を決める籤引き」などのように重複しない乱数というものを利用したいケースは意外と多い。この作り方はいくつかあるが,一番簡単な方法は,擬似配列を用いる方法である。今1~6の重複しないランダム値を得たいとする。この場合先ず,r0からr5の各変数に1から6の値を代入しておく。その上で複数回
i = random(6);
j = random(6);
w = eval("r" add i);
set("r" add i,eval("r" add j));
set("r" add j,w);
を行なえば,r0からr5に保持されている値は1~6の重複しないランダム値となる。これをr0から順次参照すればよいのである。
また,この方法は,不規則な数値や文字列の組から任意の値を得たい場合にも応用が可能である。
り
リテラル
→定数
る
ルート
メインとなるムービーの絶対パス"/"のこと
→パス
ろ
論理演算
論理演算子は2種類の記号があるが,これに用途の別はなく,数値,文字列に関係なく任意に使用して構わない。
| 記号 | 意味 | |
|---|---|---|
| && | and | 論理積(A && Bで,AもBも真の時,真となる) |
| || | or | 論理和(A || Bで,AかBのいずれか一方が真の時,真となる) |
| ? | not | 否定(!Aで,Aが真の時に偽,Aが儀の時に真となる) |
付表
ケータイFlashゲーム制作レクチャー
- 第18回 最終回!クリエイトツールFlash!!
- 第17回 パズルゲームレクチャー(3)オリジナルパズルを考える!
- 第16回 パズルゲームレクチャー(2)パズルを完成させる!
- 第15回 パズルゲームレクチャー(1) お手軽パズルゲームを作る!
- 第14回 マップ冒険ゲームレクチャー(4) イベントの作成②~そして!!
- 第13回 マップ冒険ゲームレクチャー(3) マップ上のイベントを作る!
- 第12回 マップ冒険ゲームレクチャー(2) PCの移動とマップスクロールを作る!
- 第11回 マップ冒険ゲームレクチャー(1) ゲームの王道 マップ冒険ゲームをFlashで作る!
- 第10回 カードゲームレクチャー(4) いよいよ完成!!
- 第9回 カードゲームレクチャー(3)めくったカードとその判定!!

