看板 Flash 關於我們 聯絡資訊
在 FLA,在 Library 中新增一個 MovieClip,時間軸上寫著: import flash.events.Event; import flash.display.DisplayObject; import flash.display.MovieClip; addEventListener(Event.ENTER_FRAME, onEnterFrameHandler); function onEnterFrameHandler(e:Event):void{ var owner:MovieClip =MovieClip(MovieClip(e.currentTarget).parent); trace(owner.name, owner.currentFrame + "/" + owner.totalFrames); } 這個 MC,我將用來當作發出訊息的小工具, 接著,在主場景 Main Timeline 上,將剛剛設計好的 MC 放一個上來~ 並將主場景時間軸拉長到 5 個 frame,並在 frame 5 寫 stop() 接著,主場景上,放兩個 mc1 與 mc2, 這兩個 MC 中都有放置 "負責發出訊息的工具MC", 這兩個 mc1, mc2 各拉長到 10 個 frame 測試,輸出結果: mc1 2/10 --> 因剛 addEventListener(Event.ENTER_FRAME, fun) 後, 該 frame 不會呼叫,所以從 frame 2 開始有送出訊息 mc2 2/10 root1 2/5 --> 從這可得知,主場景 frame 2,會等 mc1, mc2 的 frame 2 執行完, 才輪到主場景的 frame 做事情 mc1 3/10 mc2 3/10 root1 3/5 mc1 4/10 mc2 4/10 root1 4/5 mc1 5/10 mc2 5/10 root1 5/5 mc1 6/10 mc2 6/10 root1 5/5 --> 主時間軸停在 frame 5,mc1, mc2 的時間軸則繼續跑 mc1 7/10 mc2 7/10 root1 5/5 mc1 8/10 mc2 8/10 root1 5/5 mc1 9/10 mc2 9/10 root1 5/5 mc1 10/10 mc2 10/10 root1 5/5 mc1 1/10 --> mc1, mc2 時間軸因為沒有下 stop(),所以繼續從 frame 1 開始 mc2 1/10 root1 5/5 mc1 2/10 mc2 2/10 root1 5/5 此範例用來說明 每個 MC 的 AS 執行順序 一般來說,不會在一個 frame 的時間中, 使用 while 作大量、不知道時間終點、不知道何時停止 的工作內容, 若有此需要,通常會使用 enterFrame 每一個 frame 作一次, 若希望一個 frame 多做幾次,才 while (i<10) 之類的, 若使用 Timer() 來決定間隔多久執行一次, 其實他也是會以 fps 來決定多少個 frame 才執行一次 下一個議題是,系統事件 會在 frame 的"開始時" 執行, 還是會在 frame 的"結束時" 執行, 這個議題我通常不太關注,你有興趣可自己測試 不管是哪種,反正 一個事件發出來 一定會在那一個 frame 的時間內執行完畢, 若是一個 frame 的時間內要執行的工作太多,超過 15 秒, flash player 就有可能跳出警告詢問 user 是否要繼續等 ※ 引述《Evonda (MR.Together)》之銘言: : Hello ▁ : 這個問題一直埋在我心裡好久 但是一直不了這個as3語言的特性 : 我曾聽過前輩說過 避開這個問題就好了 ~ 於是我就沒去深入研究過 : 以前寫java的時候 ~ 我會用兩個thread 去管控這個waiting loop的問題 : 很單純就是很直覺會拿以前os學到處理race condition的狀況去實作 : 很輕而易舉 就可以控制這個情況 : =============================================================== : 可是到as3 他是single thread的觀念去跑 ~~ : 但有時候 Event會給我racing的狀況 : ( 舉例說 像是loading的狀況 假如使用同步去處理 會有先後順序之分 : 於是這個觀念 讓我覺得Event的處理 跟MultiThread其實很相像 ~ : 但是在使用上 又發現 你完全不可能向上面所想到方式去做 ~ : 因為這個會卡在一個frame裡面 ~(我的感覺啦 : 可以參考我下面這個測試程式 ~ : 他是在CS5裡面寫的 其實更本不會過 因為卡在回圈裡太久了 : 但我有點想瞭解我前面所想到的疑惑 或著我有觀念錯誤的地方 ~ : 希望 有人可以幫我解釋一下 這個問題 或著Link相關的資訊給我也可以 : 因為這個問題我是避掉了 或許只是為了躲開這個問題而已 並不是最佳解 : 但是總覺得好像處理上讓我每次解釋 都有點小困難 : import flash.events.Event; : var flag:Boolean = false ; : mcBtn.addEventListener(MouseEvent.CLICK,switchFlag); : function switchFlag(evt:Event):void{ : flag = true ; : } : var idx:int = 0 : while(!flag){ : trace("while loop :",idx++); : } : 謝謝 有打擾到大家的地方 在此感到抱歉 ~ 因為有點好奇 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.147.239.66