Flashの GotoAndPlayは状態遷移命令?

いまどき、これだけGOTOとついた命令(GotoAndPlay,GotoAndStop)使う言語も珍しい。
けど、実はGOTOのようでGOTOじゃないんです。ちょっと実験してみました。
つづきは一行リンクのあと。

最もタメになる「初心者用言語」まとめ

  • やっぱ、まずは日本語。。。

avm2(Flash)はwebで配布できるし、AS3以外の言語も出てくると嬉しいなぁ。

Y-Combinatorとは

ラムダのみで、シンボルなどを作らずに再帰を行うことをいう、らしい。
世の中には一生判らないだろうことが沢山あるけれど、そのリストにYコンビネータを追記しておこうと思う。

睡眠薬代わりに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()という名前経由でアクセスできるみたい。

【AS3.0】任意にフレームスクリプトを実行する
"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: ,

Related posts

Tags: ,

Comments are closed.