[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]