1. 程式人生 > >Egret置於後臺時,暫停遊戲邏輯 (Egret 5 )

Egret置於後臺時,暫停遊戲邏輯 (Egret 5 )

實現 handle 動畫 blog http 計時 總結 背景音樂 lifecycle

官網教程-生命周期:http://developer.egret.com/cn/2d/lifecycle

主要是在遊戲置於後臺時,關閉遊戲邏輯、渲染邏輯和背景音樂,保證更好的用戶體驗。

一 Egret 5.1版本新API

5版本引入了egret.Ticker、egret.lifecycle API來暫停:

技術分享

二 源碼位置

egret.ticker就是SystemTicker,同時lifecycle也在SystemTicker.ts 文件裏。

技術分享

三 暫停流程

技術分享

首先在WebLifeCycleHandler裏監聽window的focus(獲得焦點)和blur(沒有焦點)事件

技術分享

觸發時,則調用lifecycle的resume和pause方法。執行定義的onPause和onResume,停止和恢復心跳,再派發ACTIVE和DEACTIVE事件。

技術分享

四 停止和恢復心跳

egret.Ticker.pause()和egret.Ticker.resume() 用來設置paused標誌位。

技術分享

在startTick中調用update,如果標誌位暫停狀態,則返回;如果運行狀態,則繼續執行。

技術分享

其他:

1 4.1.0版本如何實現5中的暫停?

布吉島

2 暫停後動畫效果如何運行?

分別讓兩個動畫在EnterFrame和Tween裏執行

EnterFrame:

暫停時動畫會停在當前位置,恢復時動畫會從當前位置繼續執行。

因為EnterFrame事件是根據心跳來計算時間廣播的,心跳停止了,那麽廣播也就停止了。

Tween:

測試一個Sprite循環在y軸上運動

技術分享

暫停時停在當前位置,恢復時動畫會從 (當前時間- 停止時間) 位置繼續執行。

比如Tween 1秒走100像素,停止了2秒,則恢復時會從200像素位置開始繼續運動。

因為Tween類裏的lastTime記錄的是停止時間,這個lastTime沒有隨著系統時間更新而更新,delta隨著暫停時間而變大,而delta直接參與了setPosition(delta)。

技術分享

粒子動畫

未測試

MovieClip動畫

未測試

總結:凡是根據心跳update來更新的動畫都會從當前位置停止,從當前位置恢復。

如果不是,例如Tween,自行記錄了lastTime,而這個lastTime不會根據心跳來更新,那麽要視具體實現原理分析。

3 暫停後計時器如何運行?

暫停時,從當前計時位置暫停。

恢復時,從當前計時位置恢復。

例如計時1s執行一次代碼,則暫停10s,這10s內不會觸發計時器執行任何代碼。

恢復時,則會立刻執行一次代碼,因為(當前時間 - 停止時間) = 10秒 > 1秒 ,會立刻觸發一次TIMER事件。

4 暫停後服務器發送的事件會有什麽影響?

Egret置於後臺時,暫停遊戲邏輯 (Egret 5 )