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.