Flashの GotoAndPlayは状態遷移命令?
いまどき、これだけGOTOとついた命令(GotoAndPlay,GotoAndStop)使う言語も珍しい。
けど、実はGOTOのようでGOTOじゃないんです。ちょっと実験してみました。
つづきは一行リンクのあと。
最もタメになる「初心者用言語」まとめ
- やっぱ、まずは日本語。。。
avm2(Flash)はwebで配布できるし、AS3以外の言語も出てくると嬉しいなぁ。
Y-Combinatorとは
ラムダのみで、シンボルなどを作らずに再帰を行うことをいう、らしい。
世の中には一生判らないだろうことが沢山あるけれど、そのリストにYコンビネータを追記しておこうと思う。
- Py:3項演算子とYコンビネーター
- [javascript] Y コンビネータって何?
arguments.callee を使えばいいらしい(を - Schemeで
睡眠薬代わりにzzz
ActionScript最適化 多分その1 ガベージコレクタを攻略する
Flickrからアルバムを生成するPythonコード
Flash フレームアクションのGotoAndPlay,GotoAndStopは「状態遷移」命令?
の前にGotoAndPlay,GotoAndStopの恐怖
Flash IDEには
- GotoAndPlay(ジャンプ先フレーム番号 またはラベル)
フレーム番号を実行 - GotoAndStop(ジャンプ先フレーム番号 またはラベル)
ジャンプ先の描画のみ行い、フレームアクションは実行されない実行して、そのフレームで停止
という、いまどきめずらしいGoto系命令があります。
(Flexな人は使ったこと無いと思いますが。)
で、いままで、その挙動については深く考えたことが無かったのですが、次のようなコードを書いて試してみました。
普通はこんな感じ
1フレーム目
gotoAndPlay(5)
5フレーム目
trace("5")
trace("currentframe="+_currentframe)
10フレーム目
trace("10")
trace("currentframe="+_currentframe)
stop() // ここで停止
出力
5
currentframe=5
10
currentframe=10
ちょっと変態ちっくなことをしてみます
1フレーム目
gotoAndPlay(10)
gotoAndPlay(5)
trace("1")
trace("currentframe="+_currentframe)
stop()
5フレーム目
trace("5")
trace("currentframe="+_currentframe)
10フレーム目
trace("10")
trace("currentframe="+_currentframe)
stop()が書かれてません
結果
1
currentframe=5
10
currentframe=5
5
currentframe=5
無限ループにならず、ちゃんと5フレーム目で止まってます。
うわ、気持ち悪い~
で、これで何を言いたいのかといいますとー
BASICのGOTO文と、ActionScriptのGotoAndPlay,GotoAndStopは別モノ
なので、うっかり、
if(flag){ GotoAndPlay("Label") }
(以下通常の処理)
みたいな書き方をすると、flagが立ってても、ちゃんとそれ以下の通常の処理もされてしまう、という、多分、書いた人の想定とは違う結果に。
長らく、これに気がつかないではまりました。。。
フレームアクションは「関数」?
最新版flashCS3 だと、各フレームアクションを、frame1(),frame5(),frame10()という名前経由でアクセスできるみたい。
Flashのフレームスクリプトは、"frame" + "フレームナンバー"と言う名前の関数になります。
AS3では関数らしいです。なので、上記のアクションを擬似コードで書くと、
frameaction[1]=function(){ //
gotoAndPlay(10)
gotoAndPlay(5)
trace("1")
trace("currentframe="+_currentframe)
stop()
}
frameaction[5]=function(){
trace("5")
trace("currentframe="+_currentframe)
}
frameaction[10]=function(){
trace("10")
trace("currentframe="+_currentframe)
}
とすると、gotoAndPlay,gotoAndStopは、ひとつの関数実行後に実行される関数のキュー、と考えればいいみたいです。
frameaction[1]()
frameaction[5]()
frameaction[10)()
という順番で実行されている、ということの模様。
なので、フレームアクションに
1フレーム目
gotoAndStop(10)
10フレーム目
gotoAndStop(1)
と書くと、画面のレンダリングが行われず、暴走します。(やってみたらちゃんと?暴走しました)
function f1(){
f10()
}
function f10(){
f1()
}
を実行したと同じになると考えればあたりまえですが。。。
さらにはstop()の恐怖
で、stop()関数もクセもので
stop()
trace("1")
結果
1
stop()以降の命令も実行されてしまいます。
flag=true
if(flag){stop()}
tr("running")
出力
running
え゛~~~っていう。
あくまで、フレーム内のアクション全てが終わったら、次のフレームに移動しないで停止、という意味合いの命令みたいです。
フレームアクションを書くときは、状態遷移図を書くつもりになるとよいのかも
で、いままでが前フリ。
オブジェクト指向っていうと、クラス図を書くもの、らしいですが、Flashの場合はむしろ各フレームを状態と考えて、状態遷移図を書くつもりで、ステートマシンを作るつもりでプログラムを組むと、比較的きれいになるんじゃないかなー、と思った。
で、gotoAndStop,GotoAndPlayは、状態の切り替え命令として考える。。。
といいんじゃないかと思ったのですが、まだ自分では書けてません(汗 (<-いまここ
Tags: ActionScript, flashRelated posts
Tags: ActionScript, flash






