PGRData/Script/matrix/xui/xuicomeacross/ComeAcrossGamePlayer.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