1. 程式人生 > >cocos2dx 實現gallery (五)

cocos2dx 實現gallery (五)

        boss還想實現一個自動滾的效果,就是我手指一下快速的劃過,不是慢慢拖動,然後這個滾滾會自己滾一段時間,再慢慢停下。

        首先需要判斷這個東西,是劃過還是拖動。直接取按下的時間和鬆開的時間的差值,小於eps就算是劃過,按自動滾處理,不然就按之前的拖動處理,我取的是0.5秒

        然後怎麼模擬這個滾一滾的慢慢停這個效果。。。我們還是來說物理吧。。。

        把整個過程分為2段,一段是加速,一段是減速。

        一開始滾輪靜止,受到作用力,加速。然後作用力消失,受到阻力作用,減速。

        加速的時候,假設是一個勻加速運動。這一段時間的位移和時間,我們是可以獲取的。通過下面,可以求得瞬時速度。

                                                                             s = 0.5*a*t^2        ---- s已知,t已知

                                                                             v = at                    ---- a上面算出

        減速這一段,假設這是一個勻減速運動。阻力恆定,那麼加速度就恆定。但是這個加速度怎麼取呢?我是測試了幾次自己取了個值。因為我希望輕輕撥動一下,滾動的時間,大概是在1秒多這麼一個範圍。通過 v= at ,可以大概求出一個a,再根據實際效果,稍微調整一下。

        知道觸控停止以後,還會滾多久,就方便了。啟動一個定時器:

            local schedulerFunc = function(dt)
                    dt = dt *1000   -- s to ms
                    timeLeft = timeLeft - dt
                    local velocity = acc*timeLeft
                    local path = velocity*dt*direction
                    if timeLeft <= 0 then
                        scheduler.unscheduleGlobal(self.scrollHandler)
                        self:move(path,true)
                    else
                        self:move(path)                        
                    end
                end
                self.scrollHandler =  scheduler.scheduleGlobal(schedulerFunc, 0.01)
        上面這個,簡單的就是,每個定時器週期內,算一個瞬時速度,然後算這個瞬時速度在一個週期內的位移,然後叫滾滾動那麼個距離。因為回撥很頻繁,這樣看上去效果已經不錯了。