2025-06-04 05:02:57 +08:00

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