天天看點

egret的timer使用總結

相信大家都知道,egret是一款H5遊戲引擎,而且,随着手機性能的提高,H5遊戲也逐漸多了起來,好多人在用這款引擎進行H5遊戲開發,部落客也嘗試了一下,但是,在使用過程中,還是發現了有不如意的地方,其中之一,就是該引擎的一個總要部分——計時器,這部分一定要給後來者說明一下,最大的坑,就是這個Timer停不下來,相信好多小夥伴們已經發現了這個問題.

部落客在自己的demo中想實作一個按鈕的長按事件,當按下一個按鈕的時候,就每隔0.3秒調用一個已經寫好的方法,當手指從按鈕上移除的時候,就取消長按事件,不再調用這個方法,在初始化方法中,建立計時器:

this.timer = new egret.Timer(300, 0);
        this.timer.addEventListener(egret.TimerEvent.TIMER, this.timerCallFunc, this);

           

這裡建立一個Timer,并設定了調用間隔事件為300毫秒,後面的0表示一直調用timer的回調方法,然後,是給timer添加事件,回調方法名叫做timerCallFunc.這裡的設計思路是在按鈕開始點選的事件TOUCH_BEGIN中,啟動timer,然後,在TOUCH_END中,停止計時器,是以,添加事件監聽方法:

this.button.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.begin, this);
        this.button.addEventListener(egret.TouchEvent.TOUCH_END, this.end, this);

           

在begin方法中,調用this.timer.start();在end方法中調用this.timer.stop();于是乎,問題來了,當我TOUCH_END的時候,确實調用了end方法,這裡是沒問題的,也執行了timer的stop()方法,但是還是會每隔300毫秒執行一次timerCallFunc方法,這問題就嚴重了,要是我要實作一個功能,在遊戲的商城中,設定一個按鈕的長按事件,玩家長按按鈕,就消耗金币,多次購買藥水,然後,手指從按鈕上移開之後,就不再購買,那如果出現上面的問題,當手指從按鈕上面移開之後,玩家打開了其他的頁面,結果背景一直在運作這個timer,那玩家的金币豈不是全都用沒了,這就太坑人了.為了避免這個問題,一個簡單的方法就是設定一個變量,用來标記是否調用回調函數.我們定義一個變量:

private flag:number = 0;
           

表示是否長按了這個按鈕,0表示沒有長按,1表示長按了,當我們點選按鈕時,首先調用的是TOUCH_BEGIN的事件監聽方法begin(),我們在begin中設定flag = 1;然後在TOUCH_END中設定flag = 0;同時,在timerCallFunc中判斷flag的值,如果是1,才執行購買的操作,否則,直接return;這樣就不會出現這樣的問題了,由于timer的回調間隔是0.3秒,是以,當手指或者滑鼠開始點選按鈕的時候,過了0.3秒才會執行timerCallFunc,是以,不必擔心是否進行的操作到底是不是長按.這裡還有一個問題要指出,就是timer的初始化的方法一定不要寫在按鈕的TOUCH_BEGIN中,這樣會出大問題:因為無法停掉timer,是以,每次點選一次開始按鈕,都會重新建立一個timer,這樣,點了多次之後,就要建立好多好多個timer,timerCallFunc就會多次被調用,就算我們設定了flag值,也是有問題的,當有多個timer同時調用一個方法的時候,隻要長按按鈕不松手,那麼,flag == 1就成立,那麼,這麼多的timer都按照0.3秒的間隔調用這個回調方法,就會産生多次調用,而且,時間間隔會小于0.3秒,而且是多次調用,完全超出了我們的控制範圍,是以這部分需要多加注意.

繼續閱讀