334 lines
No EOL
8.7 KiB
Lua
334 lines
No EOL
8.7 KiB
Lua
local ComeAcrossGamePlayer = XClass(nil, "ComeAcrossGamePlayer")
|
|
|
|
ComeAcrossGamePlayer.PlayerState = {
|
|
STOP = 0,
|
|
READY = 1,
|
|
WAIT = 2,
|
|
PLAYING = 3,
|
|
CHANGING = 4,
|
|
PAUSE = 5,
|
|
ELIMINATE = 6,
|
|
ENDING = 7,
|
|
END = 8
|
|
|
|
}
|
|
|
|
local ELIMINATE_TIME = 0.3
|
|
|
|
function ComeAcrossGamePlayer:Ctor()
|
|
|
|
-- -----Ui回调
|
|
-- self.OnPlayInit = onPlayInit -- 初始化回调
|
|
-- self.OnPlayNext = onPlayNext -- 下一关回调
|
|
-- self.OnPlayWaitForNext = onPlayWaitForNext -- 等待下一关回调
|
|
-- self.OnPlayUpdate = onPlayUpdate -- 等待下一关回调
|
|
-- self.OnPlayFinish = onPlayFinish -- 完成回调
|
|
-- self.OnPlayStepChange = onPlayStepChange -- 完成一步骤回调
|
|
-- self.OnPlayClick = onPlayClick -- 点击回调
|
|
-- self.OnPlayReadyDelay = onPlayReadyDelay -- 准备步骤回调
|
|
-- self.OnPlayEndingDelay = onPlayEndingDelay -- 结束步骤回调
|
|
|
|
self:Init()
|
|
end
|
|
|
|
function ComeAcrossGamePlayer:Init()
|
|
self.Time = 0 --时间线
|
|
self.LevelIndex = 0 --当前关卡
|
|
self.Step = 0 --当前关卡步数
|
|
self.PlayResult = {} --关卡结果
|
|
self.ReadyDelay = -1 --准备延迟
|
|
self.State = ComeAcrossGamePlayer.PlayerState.STOP --状态
|
|
self.PlayData = nil -- 游戏数据
|
|
self.LevelChangeWaitTime = 0 --关卡变更的等待时间
|
|
self.LastEliminate = 0 -- 上次消除的时间
|
|
|
|
self:OnPlayerInit()
|
|
end
|
|
|
|
------------------需要重写的方法--------------------------------
|
|
--初始化
|
|
function ComeAcrossGamePlayer:OnPlayerInit()
|
|
if self.OnPlayInit then
|
|
self.OnPlayInit()
|
|
end
|
|
end
|
|
|
|
--播放下一关
|
|
function ComeAcrossGamePlayer:OnPlayerNextLevel()
|
|
if self.OnPlayNext then
|
|
self.OnPlayNext(self.GameData)
|
|
end
|
|
end
|
|
|
|
--等待开始
|
|
function ComeAcrossGamePlayer:OnPlayerReadyDelay(isReadyDelay, delayTime)
|
|
if self.OnPlayReadyDelay then
|
|
self.OnPlayReadyDelay(isReadyDelay, delayTime)
|
|
end
|
|
end
|
|
|
|
--等待下关
|
|
function ComeAcrossGamePlayer:OnPlayerWaitForNext(isWaiting, waitTime)
|
|
if self.OnPlayWaitForNext then
|
|
self.OnPlayWaitForNext(isWaiting, waitTime,self.PlayResult[self.LevelIndex])
|
|
end
|
|
end
|
|
|
|
--等待结束
|
|
function ComeAcrossGamePlayer:OnPlayerWaitForEnding(isEnding, delayTime)
|
|
if self.OnPlayEndingDelay then
|
|
self.OnPlayEndingDelay(isEnding, delayTime)
|
|
end
|
|
end
|
|
|
|
--更新
|
|
function ComeAcrossGamePlayer:OnPlayerUpdate(dt, time)
|
|
if self.OnPlayUpdate then
|
|
self.OnPlayUpdate(dt, time)
|
|
end
|
|
end
|
|
|
|
--开始游戏
|
|
function ComeAcrossGamePlayer:OnPlayerStart()
|
|
|
|
end
|
|
|
|
--停止回调
|
|
function ComeAcrossGamePlayer:OnPlayerStop()
|
|
|
|
end
|
|
|
|
--完成回调
|
|
function ComeAcrossGamePlayer:OnPlayerFinish()
|
|
if self.OnPlayFinish then
|
|
self.OnPlayFinish(self.PlayResult)
|
|
end
|
|
end
|
|
|
|
--每一步骤回调
|
|
function ComeAcrossGamePlayer:OnPlayerStepChanged()
|
|
if self.OnPlayStepChange then
|
|
self.OnPlayStepChange(self.LevelIndex,self.PlayResult)
|
|
end
|
|
end
|
|
|
|
|
|
--处理消除的元素
|
|
function ComeAcrossGamePlayer:OnPlayerDealClick(id)
|
|
|
|
local target = nil
|
|
local targetIndex = -1
|
|
for i, v in ipairs(self.GameData.Answer) do
|
|
if v.Index == id then
|
|
target = v
|
|
targetIndex = i
|
|
break
|
|
end
|
|
end
|
|
|
|
if not target then
|
|
XLog.Error("ComeAcrossClickGamePlayer:OnClick 找不到Id", id)
|
|
return
|
|
end
|
|
|
|
local removeList = {}
|
|
local last = target.Last
|
|
local next = target.Next
|
|
|
|
table.insert(removeList, target)
|
|
removeList = self:FindNeighborRecursion(removeList, target.Type, targetIndex, last, next, true)
|
|
local success = false
|
|
|
|
if self.OnPlayClick then
|
|
self.OnPlayClick(success, removeList)
|
|
end
|
|
end
|
|
|
|
--检测当前关卡是否完成
|
|
function ComeAcrossGamePlayer:OnPlayerCheckLevelFinish()
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------
|
|
--设置数据
|
|
function ComeAcrossGamePlayer:SetPlayerData(playData)
|
|
self.PlayData = playData
|
|
end
|
|
|
|
--开始
|
|
function ComeAcrossGamePlayer:Play()
|
|
self.Time = 0
|
|
self.LevelIndex = 0
|
|
self.Step = 0
|
|
self.LastEliminate = 0
|
|
self.PlayResult = {}
|
|
self.ReadyDelay = CS.XGame.Config:GetInt("TrustGameReadySecond")
|
|
self.LevelChangeWaitTime = CS.XGame.Config:GetInt("TrustGameWaitForNextSecond")
|
|
self.EndingDelay = CS.XGame.Config:GetInt("TrustGameWaitForEnding")
|
|
self.State = ComeAcrossGamePlayer.PlayerState.READY
|
|
|
|
self:OnPlayerStart()
|
|
end
|
|
|
|
--开始下一关
|
|
function ComeAcrossGamePlayer:PlayNextLevel()
|
|
if not self.PlayData or #self.PlayData <= 0 then
|
|
return
|
|
end
|
|
|
|
if self:CheckGameFinish() then
|
|
self:Finish()
|
|
return
|
|
end
|
|
|
|
self.LevelIndex = self.LevelIndex + 1
|
|
self.Step = 1
|
|
|
|
self.GameData = self.PlayData[self.LevelIndex]
|
|
self.Time = 0
|
|
self:OnPlayerNextLevel()
|
|
|
|
if self.State ~= ComeAcrossGamePlayer.PlayerState.READY then
|
|
self.State = ComeAcrossGamePlayer.PlayerState.PLAYING
|
|
end
|
|
end
|
|
|
|
--等待下一关开启
|
|
function ComeAcrossGamePlayer:WaitForNext(dt)
|
|
if self.LevelChangeWaitTime > 0 then
|
|
self:OnPlayerWaitForNext(true, math.ceil(self.LevelChangeWaitTime))
|
|
self.LevelChangeWaitTime = self.LevelChangeWaitTime - dt
|
|
else
|
|
self.LevelChangeWaitTime = 0
|
|
self:OnPlayerWaitForNext(false, math.ceil(self.LevelChangeWaitTime))
|
|
self.State = ComeAcrossGamePlayer.PlayerState.PLAYING
|
|
self:PlayNextLevel()
|
|
end
|
|
end
|
|
|
|
--等待开始
|
|
function ComeAcrossGamePlayer:WaitForStart(dt)
|
|
if self.ReadyDelay > 0 then
|
|
self:OnPlayerReadyDelay(true, math.ceil(self.ReadyDelay))
|
|
self.ReadyDelay = self.ReadyDelay - dt
|
|
else
|
|
self.ReadyDelay = 0
|
|
self.State = ComeAcrossGamePlayer.PlayerState.PLAYING
|
|
self:OnPlayerReadyDelay(false, math.ceil(self.ReadyDelay))
|
|
self:PlayNextLevel()
|
|
end
|
|
end
|
|
|
|
--等待结束
|
|
function ComeAcrossGamePlayer:WaitForEnding(dt)
|
|
if self.EndingDelay > 0 then
|
|
self:OnPlayerWaitForEnding(true, math.ceil(self.EndingDelay))
|
|
self.EndingDelay = self.EndingDelay - dt
|
|
else
|
|
self.EndingDelay = 0
|
|
self.State = ComeAcrossGamePlayer.PlayerState.END
|
|
self:OnPlayerWaitForEnding(false, math.ceil(self.EndingDelay))
|
|
self:OnPlayerFinish()
|
|
self:Stop()
|
|
end
|
|
end
|
|
|
|
--更新
|
|
function ComeAcrossGamePlayer:Update(dt)
|
|
if self.State == ComeAcrossGamePlayer.PlayerState.STOP or self.State == ComeAcrossGamePlayer.PlayerState.END then
|
|
return
|
|
end
|
|
|
|
|
|
if self.State == ComeAcrossGamePlayer.PlayerState.ENDING then
|
|
self:WaitForEnding(dt)
|
|
return
|
|
end
|
|
|
|
if self:CheckGameFinish() and self.State ~= ComeAcrossGamePlayer.PlayerState.ENDING then
|
|
self:Finish()
|
|
return
|
|
end
|
|
|
|
if self.State == ComeAcrossGamePlayer.PlayerState.WAIT then
|
|
self:WaitForNext(dt)
|
|
return
|
|
end
|
|
|
|
if self.State == ComeAcrossGamePlayer.PlayerState.READY then
|
|
self:WaitForStart(dt)
|
|
return
|
|
end
|
|
|
|
if self.State ~= ComeAcrossGamePlayer.PlayerState.PLAYING and self.State ~= ComeAcrossGamePlayer.PlayerState.ELIMINATE then
|
|
return
|
|
end
|
|
|
|
--消除的时间
|
|
if self.State == ComeAcrossGamePlayer.PlayerState.ELIMINATE and self.LastEliminate + ELIMINATE_TIME <= self.Time then
|
|
self.State = ComeAcrossGamePlayer.PlayerState.PLAYING
|
|
end
|
|
|
|
self.Time = self.Time + dt
|
|
self:OnPlayerUpdate(dt, self.Time)
|
|
end
|
|
|
|
--完成
|
|
function ComeAcrossGamePlayer:Finish()
|
|
self.State = ComeAcrossGamePlayer.PlayerState.ENDING
|
|
end
|
|
|
|
--停止
|
|
function ComeAcrossGamePlayer:Stop()
|
|
self.Time = 0
|
|
self.LevelIndex = 0
|
|
self.Step = 0
|
|
self.PlayResult = {}
|
|
self.State = ComeAcrossGamePlayer.PlayerState.STOP
|
|
|
|
self:OnPlayerStop()
|
|
end
|
|
|
|
--点击到消除
|
|
function ComeAcrossGamePlayer:OnClick(id)
|
|
if not self.GameData then
|
|
return
|
|
end
|
|
|
|
if self.State ~= ComeAcrossGamePlayer.PlayerState.PLAYING then
|
|
return
|
|
end
|
|
|
|
self:OnPlayerDealClick(id)
|
|
end
|
|
|
|
--检测完成
|
|
function ComeAcrossGamePlayer:CheckGameFinish()
|
|
return #self.PlayData == #self.PlayResult
|
|
end
|
|
|
|
--消球规则
|
|
function ComeAcrossGamePlayer:FindNeighborRecursion(removeList, type, targetIndex, left, right, isNext)
|
|
if #removeList >= 3 then
|
|
return removeList, left, right, targetIndex
|
|
end
|
|
|
|
if (not right or right.Type ~= type) and (not left or left.Type ~= type) then
|
|
return removeList, left, right, targetIndex
|
|
end
|
|
|
|
|
|
if isNext and right and right.Type == type then
|
|
table.insert(removeList, right)
|
|
right = right.Next
|
|
elseif left and left.Type == type then
|
|
table.insert(removeList, left)
|
|
left = left.Last
|
|
targetIndex = targetIndex - 1
|
|
end
|
|
|
|
return self:FindNeighborRecursion(removeList, type, targetIndex, left, right, not isNext)
|
|
end
|
|
|
|
|
|
return ComeAcrossGamePlayer |