256 lines
6.3 KiB
Plaintext
256 lines
6.3 KiB
Plaintext
QueuePusherCtrl = class("QueuePusherCtrl")
|
|
|
|
QueuePusherCtrl.Dir = {
|
|
Horizontal = 1,
|
|
Vertical = 2,
|
|
}
|
|
|
|
function QueuePusherCtrl:ctor(container,classRef)
|
|
self.container = container
|
|
self.classRef = classRef
|
|
self.checkTimerID = -1
|
|
self.hideDelay = 0.5
|
|
self.hideDelayGrow = 0.1
|
|
self.startPos = {0,0}
|
|
self.endPos = {0,0}
|
|
self.speed = 10
|
|
self.gap = 0
|
|
self.maxNum = -1
|
|
self.isPushing = false
|
|
self.datas = {}
|
|
self:SetDir(QueuePusherCtrl.Dir.Horizontal)
|
|
self:Reset()
|
|
end
|
|
|
|
function QueuePusherCtrl:SetDir(dir)
|
|
self.dir = dir
|
|
if(self.dir == QueuePusherCtrl.Dir.Vertical) then
|
|
self.CheckCanShow = self.CheckVCanShow
|
|
self.ResetPushTargetPos = self.VResetPushTargetPos
|
|
self.FixStick = self.VFixStick
|
|
else
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:SetCellPos(cell,x,y)
|
|
if(cell.gameObject ~=nil) then
|
|
local pos = cell.gameObject.transform.localPosition
|
|
pos.x = x
|
|
pos.y = y
|
|
cell.gameObject.transform.localPosition = pos
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:SetStartPos(x,y)
|
|
self.startPos[1] = x
|
|
self.startPos[2] = y
|
|
for i=1,#self.waiting do
|
|
self:SetCellPos(self.waiting[i],x,y)
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:SetEndPos(x,y)
|
|
self.endPos[1] = x
|
|
self.endPos[2] = y
|
|
end
|
|
|
|
function QueuePusherCtrl:Reset()
|
|
self.waiting = {}
|
|
self.pushing = {}
|
|
end
|
|
|
|
function QueuePusherCtrl:AddData(data)
|
|
self.datas[#self.datas+1] = data
|
|
self:FillWaitingByData()
|
|
end
|
|
|
|
function QueuePusherCtrl:FillWaitingByData()
|
|
if(#self.datas>0 and #self.waiting==0) then
|
|
local data = table.remove(self.datas,1)
|
|
local cell = self.classRef.new(self.container)
|
|
cell:SetData(data)
|
|
self:AddCell(cell)
|
|
end
|
|
end
|
|
|
|
--加入到等待佇列中
|
|
function QueuePusherCtrl:AddCell(cell)
|
|
local last = self:GetLast()
|
|
if(last~=nil) then
|
|
cell.previous = last
|
|
last.next = cell
|
|
-- print(#self.pushing)
|
|
-- print(msg.gameObject.name.." last:"..last.gameObject.name)
|
|
end
|
|
-- print("塞入第"..QueuePusherCtrl.index.."個元素")
|
|
-- QueuePusherCtrl.index = QueuePusherCtrl.index +1
|
|
self.waiting[#self.waiting+1] = cell
|
|
self:SetCellPos(cell,self.startPos[1],self.startPos[2])
|
|
-- msg.gameObject.name = "Waiting_"..#self.waiting
|
|
self:CheckWaitingShow(#self.waiting)
|
|
end
|
|
|
|
function QueuePusherCtrl:GetLast()
|
|
local last = self.waiting[#self.waiting]
|
|
if(last==nil) then
|
|
last = self.pushing[#self.pushing]
|
|
end
|
|
return last
|
|
end
|
|
|
|
function QueuePusherCtrl:PushForward()
|
|
-- print("PushForward")
|
|
-- if(self.waiting[1]~= nil) then
|
|
self.ResetPushTargetPos(self,self.waiting[1])
|
|
-- end
|
|
end
|
|
|
|
function QueuePusherCtrl:CheckVCanShow(cell)
|
|
local previous = cell.previous
|
|
if(previous==nil) then return true end
|
|
-- if(previous~=nil) then
|
|
-- print(cell.gameObject.name.." previous:"..previous.gameObject.name.." gap:"..(previous:GetY()-cell:GetY()).." height gap:"..((previous:GetH()+cell:GetH())/2))
|
|
-- end
|
|
if(self.startPos[2] < self.endPos[2]) then
|
|
return (previous:GetY()-cell:GetY() >= ((previous:GetH()+cell:GetH())/2 + self.gap))==true
|
|
else
|
|
return (cell:GetY()-previous:GetY() >= ((previous:GetH()+cell:GetH())/2 + self.gap))==true
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:CheckWaitingShow(checkIndex)
|
|
checkIndex = checkIndex or 1
|
|
local cell = self.waiting[checkIndex]
|
|
if(cell~=nil) then
|
|
if(cell:Parsed()==false and checkIndex==1) then
|
|
-- print("parse")
|
|
cell:NextToPush()
|
|
end
|
|
if(self.CheckCanShow(self,cell)) then
|
|
self:StartPush()
|
|
elseif(not cell.isPushed) then
|
|
cell:Hide()
|
|
self:PushForward()
|
|
self:StartTimerCheck()
|
|
-- self:CheckPush()
|
|
end
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:VFixStick(cell)
|
|
local factor = -1
|
|
if(self.startPos[2] > self.endPos[2]) then
|
|
factor = 1
|
|
end
|
|
self:SetCellPos(cell,self.startPos[1],cell.previous:GetY() + (self.gap + (cell:GetH()+cell.previous:GetH())/2)*factor)
|
|
end
|
|
|
|
function QueuePusherCtrl:StartPush()
|
|
local cell = table.remove( self.waiting, 1 )
|
|
-- print("push!!")
|
|
if(cell ~= nil) then
|
|
self.pushing[#self.pushing+1] = cell
|
|
if(cell.previous~=nil) then
|
|
self.FixStick(self,cell)
|
|
end
|
|
cell:Show()
|
|
if(self.maxNum >0 and #self.pushing>self.maxNum) then
|
|
self:DestroyCell(self.pushing[1])
|
|
end
|
|
self:PushForward()
|
|
-- self.ResetPushTargetPos(self)
|
|
-- self:StartLuaTimer()
|
|
end
|
|
if(#self.waiting==0) then
|
|
self:FillWaitingByData()
|
|
self:StopTimerCheck()
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:VResetPushTargetPos(firstWaitCell)
|
|
local pushCell = nil
|
|
local endY= self.endPos[2]
|
|
local time = 0
|
|
local ltd = nil
|
|
local factor = 1
|
|
if(self.startPos[2] > self.endPos[2]) then
|
|
factor = -1
|
|
end
|
|
if(firstWaitCell~=nil) then
|
|
firstWaitCell.isPushed = true
|
|
if(self.pushing[#self.pushing]~=nil) then
|
|
endY = endY+(self.gap + (firstWaitCell:GetH()+self.pushing[#self.pushing]:GetH())/2)*factor
|
|
else
|
|
endY = endY+(self.gap + firstWaitCell:GetH())*factor
|
|
end
|
|
end
|
|
for i=#self.pushing,1,-1 do
|
|
local cell = self.pushing[i]
|
|
if(pushCell ~= nil ) then
|
|
endY = endY+(cell:GetH()/2)*factor
|
|
end
|
|
-- print("no."..i.." h:"..cell:GetH())
|
|
-- print("TargetY.."..endY)
|
|
time = math.abs(endY - cell:GetY())/self.speed
|
|
LeanTween.cancel(cell.gameObject)
|
|
ltd = LeanTween.moveLocalY(cell.gameObject,endY,time)
|
|
if(self.hideDelay>0) then
|
|
local delay = LeanTween.delayedCall(cell.gameObject,time + self.hideDelay + i*self.hideDelayGrow,function()
|
|
self:DestroyCell(cell)
|
|
end)
|
|
end
|
|
endY = endY+(self.gap + cell:GetH()/2)*factor
|
|
-- print("1Endy.."..endY)
|
|
pushCell = cell
|
|
end
|
|
|
|
-- if(self.maxNum >0 and #self.pushing>self.maxNum) then
|
|
-- ltd:setOnComplete(function ()
|
|
-- self:DestroyCell(pushCell)
|
|
-- end)
|
|
-- end
|
|
end
|
|
|
|
function QueuePusherCtrl:DestroyCell(cell)
|
|
if(cell~=nil) then
|
|
-- print("DestroyCell.."..cell:GetY())
|
|
LeanTween.cancel(cell.gameObject)
|
|
if(cell.Destroy~=nil) then cell:Destroy() end
|
|
if(cell.next~=nil) then
|
|
cell.next.previous = nil
|
|
end
|
|
TableUtil.Remove(self.pushing,cell)
|
|
-- print(#self.pushing)
|
|
cell = nil
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:CheckPush()
|
|
local cell = self.waiting[1]
|
|
if(cell~=nil) then
|
|
-- local lastPush = self.pushing[#self.pushing]
|
|
-- if(not cell.isPushed) then
|
|
-- self.ResetPushTargetPos(self,cell)
|
|
-- end
|
|
self:CheckWaitingShow()
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:StartTimerCheck()
|
|
-- print("StartTimerCheck")
|
|
if(self.checkTimerID ==-1) then
|
|
LuaTimer.Add(0,16,function (id)
|
|
self.checkTimerID = id
|
|
self:CheckPush()
|
|
end)
|
|
end
|
|
end
|
|
|
|
function QueuePusherCtrl:StopTimerCheck()
|
|
-- print(#self.waiting)
|
|
-- print("StopTimerCheck")
|
|
if(self.checkTimerID ~=-1) then
|
|
self.checkTimerID= -1
|
|
LuaTimer.Delete(self.checkTimerID)
|
|
end
|
|
end |