Flashの GotoAndPlayは状態遷移命令?

[pukiwiki]
いまどき、これだけGOTOとついた命令(GotoAndPlay,GotoAndStop)使う言語も珍しい。
けど、実はGOTOのようでGOTOじゃないんです。ちょっと実験してみました。
つづきは一行リンクのあと。
*[[最もタメになる「初心者用言語」まとめ:http://generation1986.g.hatena.ne.jp/ukstudio/20080204/1202113687]]
-やっぱ、まずは日本語。。。

avm2(Flash)はwebで配布できるし、AS3以外の言語も出てくると嬉しいなぁ。
*Y-Combinatorとは
ラムダのみで、シンボルなどを作らずに再帰を行うことをいう、らしい。
世の中には一生判らないだろうことが沢山あるけれど、そのリストにYコンビネータを追記しておこうと思う。
-[[Py:3項演算子とYコンビネーター:http://gyang.girly.jp/impli/archives/2008/01/#py3y.html]]
-[[[javascript] Y コンビネータって何?:http://d.hatena.ne.jp/amachang/20080124/1201199469]]
”arguments.callee” を使えばいいらしい(を
-[[Schemeで:http://www.loveruby.net/ja/misc/ycombinator.html]]

睡眠薬代わりにzzz

*[[ActionScript最適化 多分その1 ガベージコレクタを攻略する:http://hak.wablog.com/72.html]]
*[[Flickrからアルバムを生成するPythonコード:http://d.hatena.ne.jp/gamella/20080204/1202134479]]

*Flash フレームアクションのGotoAndPlay,GotoAndStopは「状態遷移」命令?
*の前にGotoAndPlay,GotoAndStopの恐怖

[/pukiwiki]

[pukiwiki]
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】任意にフレームスクリプトを実行する:http://wakuworks.jugem.jp/?page=1&cid=2]]
“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は、状態の切り替え命令として考える。。。

といいんじゃないかと思ったのですが、まだ自分では書けてません(汗 (<-いまここ

[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。