cocos2dx 实现gallery (五)

本文介绍了如何在cocos2dx中实现滚轮的自动滚动效果,当用户快速滑动后,滚轮会继续滚动并逐渐减速至停止。通过判断滑动和拖动的区别,设置不同的物理运动模型来模拟加速和减速过程,最终达到平滑的滚动动画效果。
摘要由CSDN通过智能技术生成

        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)
        上面这个,简单的就是,每个定时器周期内,算一个瞬时速度,然后算这个瞬时速度在一个周期内的位移,然后叫滚滚动那么个距离。因为回调很频繁,这样看上去效果已经不错了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值