主要思路是:在用户滑动界面时,依次设置三层背景的 x 轴的位置,然后在用户滑动结束时,计算一下速度,如果速度足够快,则让背景执行一下MoveBy,产生惯性的效果。(这是我想到的比较直接的做法,如果有好的方法,还请不吝赐教^_^)
附代码:
local scene = cc.Scene:create()
local s = cc.Director:getInstance():getWinSize()
local layer = cc.LayerColor:create(cc.c4b(180, 180, 180, 255))
scene:addChild(layer)
local bg = cc.LayerGradient:create(cc.c4b(0, 0, 255, 255), cc.c4b(0, 255, 0, 255), cc.p(1, 0))
layer:addChild(bg)
local ct = cc.LayerGradient:create(cc.c4b(0, 255, 0, 255), cc.c4b(255, 0, 0, 255), cc.p(1, 0))
ct:setPositionY(-0.2*s.height)
layer:addChild(ct)
local fg = cc.LayerGradient:create(cc.c4b(255, 0, 0, 255), cc.c4b(0, 0, 255, 255), cc.p(1, 0))
fg:setPositionY(-0.5*s.height)
layer:addChild(fg)
local beginX, startX, movedX, endX
local startTime, endTime, duration
local function onTouchBegin(touch, event)
beginX = touch:getLocation().x
startX = beginX
startTime = socket.gettime()
return true
end
local function onTouchMoved(touch, event)
movedX = touch:getLocation().x
local diffX = startX - movedX
fg:setPositionX(fg:getPositionX() - diffX)
ct:setPositionX(ct:getPositionX() - diffX/2)
bg:setPositionX(bg:getPositionX() - diffX/5)
startX = movedX
end
local function onTouchEnded(touch, event)
endX = touch:getLocation().x
endTime = socket.gettime()
local duration = endTime - startTime
local v = (endX - beginX)/duration
if math.abs(v) > 500 then
fg:runAction(cc.MoveBy:create(0.5, cc.p(v/500*50, 0)))
ct:runAction(cc.MoveBy:create(0.5, cc.p(v/500*50/2, 0)))
bg:runAction(cc.MoveBy:create(0.5, cc.p(v/500*50/5, 0)))
end
end
local touchListener = cc.EventListenerTouchOneByOne:create()
touchListener:registerScriptHandler(onTouchBegin, cc.Handler.EVENT_TOUCH_BEGAN )
touchListener:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED )
touchListener:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED )
layer:getEventDispatcher():addEventListenerWithSceneGraphPriority(touchListener, layer)
cc.Director:getInstance():runWithScene(scene)