352 lines
No EOL
11 KiB
Lua
352 lines
No EOL
11 KiB
Lua
local XUiPanelGame = XClass(nil, "XUiPanelGame")
|
||
local XUiGridElement = require("XUi/XUiComeAcross/XUiGridElement")
|
||
|
||
function XUiPanelGame:Ctor(ui, rootUi)
|
||
self.GameObject = ui.gameObject
|
||
self.Transform = ui.transform
|
||
self.RootUi = rootUi
|
||
self:InitAutoScript()
|
||
self:Init()
|
||
end
|
||
|
||
function XUiPanelGame:Init()
|
||
self.SmallPool = self.PanelPoolSmall:GetComponent("XUnityPoolSingle")
|
||
self.BigPool = self.PanelAnsPool:GetComponent("XUnityPoolSingle")
|
||
self.QuePanel = {}
|
||
self.QuePanel[1] = self.PanelQue_1
|
||
self.QuePanel[2] = self.PanelQue_2
|
||
self.QuePanel[3] = self.PanelQue_3
|
||
|
||
self.TickPanel = {}
|
||
local XUiPanelTick = require("XUi/XUiComeAcross/XUiPanelTick")
|
||
self.TickPanel[1] = XUiPanelTick.New(self.PanelTick_1)
|
||
self.TickPanel[2] = XUiPanelTick.New(self.PanelTick_2)
|
||
self.TickPanel[3] = XUiPanelTick.New(self.PanelTick_3)
|
||
|
||
self.PanelTime.gameObject:SetActive(false)
|
||
self.PanelReady.gameObject:SetActive(false)
|
||
self.PanelQuestion.gameObject:SetActive(false)
|
||
self.PanelAnswer.gameObject:SetActive(false)
|
||
self.PanelResult.gameObject:SetActive(false)
|
||
self.PanelScore.gameObject:SetActive(false)
|
||
|
||
local gamePlayer = require("XUi/XUiComeAcross/ComeAcrossClickGamePlayer").New()
|
||
|
||
--gamePlayer.OnPlayInit = onPlayInit -- 初始化回调
|
||
gamePlayer.OnPlayNext = handler(self, self.OnPlayNext) -- 下一关回调
|
||
gamePlayer.OnPlayWaitForNext = handler(self, self.OnPlayWaitForNext) -- 等待下一关回调
|
||
gamePlayer.OnPlayUpdate = handler(self, self.OnPlayUpdate) -- 等待下一关回调
|
||
gamePlayer.OnPlayFinish = handler(self, self.OnPlayFinish) -- 完成回调
|
||
gamePlayer.OnPlayStepChange = handler(self, self.OnPlayStepChange) -- 完成一步骤回调
|
||
gamePlayer.OnPlayClick = handler(self, self.OnPlayClick) -- 点击回调
|
||
gamePlayer.OnPlayReadyDelay = handler(self, self.OnPlayReadyDelay) -- 准备步骤回调
|
||
gamePlayer.OnPlayEndingDelay = handler(self, self.OnPlayEndingDelay) -- 结束步骤回调
|
||
|
||
self.GamePlayer = gamePlayer
|
||
|
||
self.CountDown = -1
|
||
end
|
||
|
||
--设置游戏数据
|
||
function XUiPanelGame:SetupGameData(data)
|
||
if not data then
|
||
return
|
||
end
|
||
|
||
self.CurData = data
|
||
end
|
||
|
||
--解释表数据
|
||
function XUiPanelGame:ParserGameData(data)
|
||
local gameLevels = data.TypeOfGames
|
||
|
||
local curGamelevel = {}
|
||
for _, v in ipairs(gameLevels) do
|
||
local game = {}
|
||
game.Question = {}
|
||
local question = v.Question
|
||
local group = string.Split(question, "|")
|
||
if group and #group >= 0 then
|
||
for index, var in ipairs(group) do
|
||
game.Question[index] = {}
|
||
for i = 1, #var, 1 do
|
||
local idx = tonumber(string.sub(var, i, i))
|
||
table.insert(game.Question[index], idx)
|
||
end
|
||
end
|
||
end
|
||
|
||
game.Answer = {}
|
||
local lastAnswer = nil
|
||
for i = 1, #v.Answer, 1 do
|
||
local idx = tonumber(string.sub(v.Answer, i, i))
|
||
local answer = {}
|
||
answer.Index = i
|
||
answer.Type = idx
|
||
if lastAnswer then
|
||
answer.Last = lastAnswer
|
||
lastAnswer.Next = answer
|
||
end
|
||
|
||
lastAnswer = answer
|
||
table.insert(game.Answer, answer)
|
||
end
|
||
|
||
game.Tab = v
|
||
game.Time = v.Time
|
||
table.insert(curGamelevel, game)
|
||
end
|
||
|
||
return curGamelevel
|
||
end
|
||
-------------------------------------------
|
||
--准备阶段
|
||
function XUiPanelGame:OnPlayReadyDelay(IsReady, countDown)
|
||
|
||
if self.CountDown == countDown then
|
||
return
|
||
end
|
||
|
||
self.CountDown = countDown
|
||
|
||
if not IsReady then
|
||
self.PanelTime.gameObject:SetActive(not IsReady)
|
||
self.PanelQuestion.gameObject:SetActive(not IsReady)
|
||
self.PanelAnswer.gameObject:SetActive(not IsReady)
|
||
self.PanelScore.gameObject:SetActive(not IsReady)
|
||
end
|
||
|
||
self.PanelReady.gameObject:SetActive(IsReady)
|
||
if self.CountDown > 1 then
|
||
self.TxtCountDown.text = tostring(countDown - 1)
|
||
else
|
||
self.TxtCountDown.text = CS.XTextManager.GetText("ComeAcrossStart")
|
||
end
|
||
|
||
--XUiHelper.PlayAnimation(self.RootUi, "UiComeAcrossGame1ReadyBegin")
|
||
end
|
||
|
||
|
||
--结束步骤回调
|
||
function XUiPanelGame:OnPlayEndingDelay(isEnding, countDown)
|
||
if self.CountDown == countDown then
|
||
return
|
||
end
|
||
|
||
self.CountDown = countDown
|
||
|
||
self.PanelResult.gameObject:SetActive(isEnding)
|
||
|
||
self.TxtResult.text = CS.XTextManager.GetText("ComeAcrossGameEnd")
|
||
self.TxtResultDesc.text = string.format(CS.XTextManager.GetText("ComeAcrossEnd"), countDown)
|
||
|
||
--XUiHelper.PlayAnimation(self.RootUi, "UiComeAcrossGame1ResultBegin")
|
||
end
|
||
|
||
|
||
--设置Ui
|
||
function XUiPanelGame:OnPlayNext(gameData)
|
||
self.SliderTime.value = 1
|
||
self.SmallPool:DespawnAll()
|
||
self.BigPool:DespawnAll()
|
||
self.AnswerGirds = {}
|
||
self.QuestionGirds = {}
|
||
|
||
local question = gameData.Question
|
||
local questionGirds = {}
|
||
if question then
|
||
for i, v in ipairs(question) do
|
||
if not v or #v <= 0 then
|
||
break
|
||
end
|
||
|
||
questionGirds[i] = {}
|
||
|
||
for _, var in ipairs(v) do
|
||
local grid = self.SmallPool:Spawn()
|
||
grid.transform:SetParent(self.QuePanel[i], false)
|
||
grid:SetActive(true)
|
||
local gridElement = XUiGridElement.New(grid, self, self.RootUi)
|
||
gridElement:SetSmallGridContent(var)
|
||
table.insert(questionGirds[i], gridElement)
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
local answer = gameData.Answer
|
||
local answerGirds = {}
|
||
|
||
if answer then
|
||
for _, var in ipairs(answer) do
|
||
local grid = self.BigPool:Spawn()
|
||
grid.transform:SetParent(self.PanelLayout, false)
|
||
grid:SetActive(true)
|
||
|
||
local gridElement = XUiGridElement.New(grid, self, self.RootUi)
|
||
gridElement:SetBigGridContent(var)
|
||
answerGirds[var.Index] = gridElement
|
||
end
|
||
end
|
||
|
||
self.AnswerGirds = answerGirds
|
||
self.QuestionGirds = questionGirds
|
||
|
||
end
|
||
|
||
--更新进度条
|
||
function XUiPanelGame:OnPlayUpdate(curtime, timeLimit)
|
||
if curtime >= timeLimit then
|
||
curtime = timeLimit
|
||
end
|
||
|
||
self.SliderTime.value = 1 - curtime / timeLimit
|
||
end
|
||
|
||
--完成
|
||
function XUiPanelGame:OnPlayFinish(result)
|
||
self.RootUi:OnFinish(result)
|
||
end
|
||
|
||
--等待下一关
|
||
function XUiPanelGame:OnPlayWaitForNext(IsWait, countDown)
|
||
|
||
if self.CountDown == countDown then
|
||
return
|
||
end
|
||
|
||
self.CountDown = countDown
|
||
|
||
|
||
self.PanelResult.gameObject:SetActive(IsWait)
|
||
self.TxtResultDesc.text = string.format(CS.XTextManager.GetText("ComeAcrossNext"), countDown)
|
||
|
||
end
|
||
|
||
|
||
--完成一个关卡
|
||
function XUiPanelGame:OnPlayStepChange(idx, results, isTimeOut)
|
||
if not results then
|
||
return
|
||
end
|
||
|
||
local result = results[idx]
|
||
if self.TickPanel[idx] then
|
||
self.TickPanel[idx]:SetResult(result)
|
||
end
|
||
|
||
if isTimeOut then
|
||
self.TxtResult.text = CS.XTextManager.GetText("ComeAcrossTimeout")
|
||
else
|
||
self.TxtResult.text = result == 1 and CS.XTextManager.GetText("ComeAcrossRight") or CS.XTextManager.GetText("ComeAcrossWrong")
|
||
end
|
||
|
||
--XUiHelper.PlayAnimation(self.RootUi, "UiComeAcrossGame1ResultBegin")
|
||
end
|
||
|
||
|
||
--点击回调
|
||
function XUiPanelGame:OnPlayClick(success, removeList, step)
|
||
if not removeList then
|
||
return
|
||
end
|
||
|
||
for _, v in ipairs(removeList) do
|
||
local grid = self.AnswerGirds[v.Index]
|
||
if grid then
|
||
grid:OnEliminate(function()
|
||
self.AnswerGirds[v.Index] = nil
|
||
self.BigPool:Despawn(grid.GameObject)
|
||
end)
|
||
end
|
||
end
|
||
|
||
|
||
for i = 1, step, 1 do
|
||
if self.QuestionGirds[i] then
|
||
for _, var in ipairs(self.QuestionGirds[i]) do
|
||
var:SetGray()
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
----------------------------------------------------
|
||
--开始
|
||
function XUiPanelGame:Play()
|
||
self.GameData = self:ParserGameData(self.CurData)
|
||
self.GamePlayer:SetPlayerData(self.GameData)
|
||
self:Reset()
|
||
|
||
self.RootUi:PlayAnimation("UiComeAcrossGame1Begin", function()
|
||
self.GamePlayer:Play()
|
||
end)
|
||
end
|
||
|
||
--更新
|
||
function XUiPanelGame:Update(dt)
|
||
if self.GamePlayer then
|
||
self.GamePlayer:Update(dt)
|
||
end
|
||
end
|
||
|
||
--重置
|
||
function XUiPanelGame:Reset()
|
||
for i, v in ipairs(self.TickPanel) do
|
||
v.GameObject:SetActive(i <= self.CurData.GameConfig.Count)
|
||
v:Reset()
|
||
end
|
||
end
|
||
|
||
-- auto
|
||
-- Automatic generation of code, forbid to edit
|
||
function XUiPanelGame:InitAutoScript()
|
||
self:AutoInitUi()
|
||
self:AutoAddListener()
|
||
end
|
||
|
||
function XUiPanelGame:AutoInitUi()
|
||
self.PanelScore = self.Transform:Find("PanelScore")
|
||
self.Panel = self.Transform:Find("PanelScore/Panel")
|
||
self.PanelTick_1 = self.Transform:Find("PanelScore/Panel/PanelTick_1")
|
||
self.PanelTick_2 = self.Transform:Find("PanelScore/Panel/PanelTick_2")
|
||
self.PanelTick_3 = self.Transform:Find("PanelScore/Panel/PanelTick_3")
|
||
self.PanelResult = self.Transform:Find("PanelScore/PanelResult")
|
||
self.TxtResult = self.Transform:Find("PanelScore/PanelResult/TxtResult"):GetComponent("Text")
|
||
self.TxtResultDesc = self.Transform:Find("PanelScore/PanelResult/TxtResultDesc"):GetComponent("Text")
|
||
self.PanelQuestion = self.Transform:Find("PanelQuestion")
|
||
self.PanelA = self.Transform:Find("PanelQuestion/Panel")
|
||
self.PanelQue_1 = self.Transform:Find("PanelQuestion/Panel/PanelQue_1")
|
||
self.PanelQue_2 = self.Transform:Find("PanelQuestion/Panel/PanelQue_2")
|
||
self.PanelQue_3 = self.Transform:Find("PanelQuestion/Panel/PanelQue_3")
|
||
self.PanelPoolSmall = self.Transform:Find("PanelQuestion/PanelPoolSmall")
|
||
self.PanelAnswer = self.Transform:Find("PanelAnswer")
|
||
self.PanelLayout = self.Transform:Find("PanelAnswer/PanelLayout")
|
||
self.PanelAnsPool = self.Transform:Find("PanelAnswer/PanelAnsPool")
|
||
self.PanelTime = self.Transform:Find("PanelTime")
|
||
self.SliderTime = self.Transform:Find("PanelTime/SliderTime"):GetComponent("Slider")
|
||
self.PanelReady = self.Transform:Find("PanelReady")
|
||
self.TxtCountDown = self.Transform:Find("PanelReady/TxtCountDown"):GetComponent("Text")
|
||
end
|
||
|
||
function XUiPanelGame:RegisterClickEvent(uiNode, func)
|
||
if func == nil then
|
||
XLog.Error("XUiPanelGame:RegisterClickEvent函数参数错误:参数func不能为空")
|
||
return
|
||
end
|
||
|
||
if type(func) ~= "function" then
|
||
XLog.Error("XUiPanelGame:RegisterClickEvent函数错误, 参数func需要是function类型, func的类型是" .. type(func))
|
||
end
|
||
|
||
local listener = function(...)
|
||
func(self, ...)
|
||
end
|
||
|
||
CsXUiHelper.RegisterClickEvent(uiNode, listener)
|
||
end
|
||
|
||
function XUiPanelGame:AutoAddListener()
|
||
end
|
||
-- auto
|
||
return XUiPanelGame |