2012年8月16日 星期四

[JavaScript]Cocos2d-x html5 試用 (五) TouchDispatcher & Scheduler

[TouchDispatcher]
這個類別算是[Cocos2d-x]裡的底層類別,主要管理『觸控事件』和『滑鼠事件』,
有興趣的可以看一下原始碼,這個我就不特別做解說。
 我們這裡以觸控面板為例 以當今觸控面板來說,分為『多點觸控』和『單點觸控』,而這個類別也提供了『多點觸控』和『單點觸控』,分別是:

註冊單點觸控事件的
[addTargetedDelegate]

    /**
     * @param {cc.TouchDelegate} delegate
     * @param {Number} priority
     * @param {Boolean} swallowsTouches
     */
    addTargetedDelegate:function (delegate, priority, swallowsTouches)
註冊一個『單點觸控事件』,第一個參數是想註冊的物件本身,第二個是優先權,第三個我試了很久看不出有甚麼差別,原始碼內也無地方也用到,所以暫時先略過。
    ccTouchBegan:function (pTouch, pEvent) {
        console.log(pTouch.locationInView().x + "," + pTouch.locationInView().y);
    },
    ccTouchMoved:function (pTouch, pEvent) {

    },
    ccTouchEnded:function (pTouch, pEvent) {

    },
在註冊『觸控事件』,前需要為物件加入以上函式,分別是『開始(按下)』、『移動』和『結束(放開)』。
因為『單點觸控』,所以當事件觸發時,會傳進點到的座標,如範例,可用『locationInView』函式得到座標。
cc.Director.sharedDirector().getTouchDispatcher().addTargetedDelegate(this,1);
當確認函式加入了之後,就可以註冊事件了。

接下來是,註冊多點觸控事件的
[addStandardDelegate]

    /**
     * Adds a standard touch delegate to the dispatcher's list.
     * See StandardTouchDelegate description.
     * IMPORTANT: The delegate will be retained.
     * @param {cc.TouchDelegate} delegate
     * @param {Number} priority
     */
    addStandardDelegate:function (delegate, priority)
註冊『多點觸控事件』跟『單點觸控事件』是一樣的,不一樣的在後面
    ccTouchesBegan:function (pTouch, pEvent) {
        for (var i = 0; i < pTouch.length; i++)
            console.log("Point[" + (i + 1) + "](" + pTouch[i].locationInView().x + "," + pTouch[i].locationInView().y + ")");
    },
    ccTouchesMoved:function (pTouch, pEvent) {

    },
    ccTouchesEnded:function (pTouch, pEvent) {

    },
『多點觸控事件』需要加入的函式,名稱與『單點觸控事件』的函式名稱不一樣,但是功能還是一樣的。
而因為是『多點觸控』,所以傳回的座標是以陣列的方式回傳,預設的最大觸控點是4個。
cc.Director.sharedDirector().getTouchDispatcher().addStandardDelegate(this,1);

註冊方式除了名子和『單點觸控事件』不一樣外,大概就是參數少一個吧。
 如果有多點觸控裝置的話,觸碰複數點,就會回傳碰到的所有座標。 

只能偵測到表面事件,是Canvas的缺點之一。
 所以我們必須要自行判斷及規劃『Canvas』裏頭的所有事件響應與否。
 而這部分,算是比較進階的了,所以暫時先不提。

[Scheduler]
    /**
     * *    Schedules the 'update' selector for a given target with a given priority.

     *    The 'update' selector will be called every frame.

     *    The lower the priority, the earlier it is called.
     * 


     * @param {cc.Class} target
     * @param {Number} priority
     * @param {Boolean} paused
     * @example
     * //register this object to scheduler
     * cc.Director.sharedDirector().getScheduler().scheduleUpdateForTarget(this, priority, !this._isRunning);
     */
    scheduleUpdateForTarget:function (target, priority, paused)

物件在註冊[Scheduler]前需要注意的事項如下:
1. 物件本身必須要擁有[update],可供呼叫。
    update:function () {
        //The 'update' selector will be called every frame.
    }

運作原理,就類似Flash裏頭的『onEnterframe』,他會在每一次frame更新時被呼叫。
2. 注意優先順序,程式會依優先權進入[update]狀態。
以上也是第一和第個個參數的介紹。最後第三個參數,代表是否再直接進入偵聽狀態,可視程式目的決定。
    cc.Director.sharedDirector().getScheduler().scheduleUpdateForTarget(this, 0, false);
註冊方法與[TouchDispatcher]一樣。
最後,這兩大類類別,需要在物件的初始化完畢後,才可進行註冊。

沒有留言:

張貼留言