PGRData/Script/matrix/xui/xuigoldenminer/XUiGoldenMinerBattle.lua

1314 lines
No EOL
48 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local XGoldenMinerBaseObj = require("XEntity/XGoldenMiner/Object/XGoldenMinerBaseObj")
local XGoldenMinerBoom = require("XEntity/XGoldenMiner/Object/XGoldenMinerBoom")
local XGoldenMinerMouse = require("XEntity/XGoldenMiner/Object/XGoldenMinerMouse")
local XGoldenMinerRedEnvelope = require("XEntity/XGoldenMiner/Object/XGoldenMinerRedEnvelope")
local XGoldenMinerItemChangeInfo = require("XEntity/XGoldenMiner/Settle/XGoldenMinerItemChangeInfo")
local XGoldenMinerSettlementInfo = require("XEntity/XGoldenMiner/Settle/XGoldenMinerSettlementInfo")
local XUiItemPanel = require("XUi/XUiGoldenMiner/Panel/XUiItemPanel")
local XUiBuffPanel = require("XUi/XUiGoldenMiner/Panel/XUiBuffPanel")
--绳子状态
local RopeState = {
Rock = 1, --常态摇摆
Stretch = 2, --拉伸
Shorten = 3, --回收
Stop = 4, --停止动作
}
--矿工状态
local HumenState = {
Idle = 1, --常态
MoveLeft = 2, --向左移动中
MoveRight = 3, --向右移动中
}
--玩法倒计时颜色
local TxtTimeColor = {
[true] = CS.UnityEngine.Color.white,
[false] = CS.UnityEngine.Color.red
}
local MILLISECOND = 1000 --毫秒
local PERCENT = XGoldenMinerConfigs.Percent --倍率
local ROLE_MOVE_RANGE_PERCENT = XGoldenMinerConfigs.GetRoleMoveRangePercent() --角色移动范围百分比
local GAME_NEAR_END_TIME = XGoldenMinerConfigs.GetGameNearEndTime() --临近结束的时间(单位:秒)
local GAME_STOP_COUNTDOWN = XGoldenMinerConfigs.GetGameStopCountdown() --暂停倒计时(单位:秒)
local SHORTEN_SPEED_PARAMETER = XGoldenMinerConfigs.GetShortenSpeedParameter()
local SHORTEN_MIN_SPEED = XGoldenMinerConfigs.GetShortenMinSpeed()
local ROLE_GRAP_SUCCESS_TIME = XGoldenMinerConfigs.GetRoleGrapSuccessTime() --抓到物品切换回默认表情的时间(毫秒)
local USE_ITEM_SPEED = XGoldenMinerConfigs.GetUseItemSpeed() --使用道具到抓取物的速度
local USE_BOOM_EFFECT = XGoldenMinerConfigs.GetUseBoomEffect() --使用炸弹特效
local FINAL_SHIP_MAX_COUNT = XGoldenMinerConfigs.GetFinalShipMaxCount() --显示完全体的飞船需要升满的升级项
local CSUnityEngineTime = CS.UnityEngine.Time
local CSXResourceManagerLoad = CS.XResourceManager.Load
local CSUiButtonStateNormal = CS.UiButtonState.Normal
local CSUiButtonStateSelect = CS.UiButtonState.Select
local MathFloor = math.floor
local MahtAbs = math.abs
local TableInsert = table.insert
--黄金矿工玩法界面
local XUiGoldenMinerBattle = XLuaUiManager.Register(XLuaUi, "UiGoldenMinerBattle")
function XUiGoldenMinerBattle:OnAwake()
self:InitObj()
self.CurFaceId = nil --当前使用的表情Id
self.SettlementInfo = XGoldenMinerSettlementInfo.New()
self.DataDb = XDataCenter.GoldenMinerManager.GetGoldenMinerDataDb()
self.HumenPosY = self.Humen.transform.localPosition.y --矿工Y轴位置
self.RopeRockDir = Vector3.back --绳子摇摆的方向
self.PreFaceUrlPath = nil --上一个表情的路径
self.CurNearEndTime = 0 --当前临近结束时间
self.IsCloseBattle = false --游戏结束等后端传来数据再关闭界面
self.IsFinishSuccess = true --通关请求服务器是否返回成功
self:SetIsPlayRopeOpenAnima(true)
self:SetNotActiveBoomTimes(0)
self:SetCurShortenSpeed(0) --抓到东西时回收的速度
self.ResourcePool = {}
self.EffectPool = {}
self.CurTriggerObjDic = {} --钩子抓到的对象字典
self.CurTriggerObjSettleList = {} --钩子抓到并结算成得分的对象列表
self:RegisterButtonEvent()
self.ItemPanel = XUiItemPanel.New(self.PanelSkillParent, handler(self, self.UseItem))
self.BuffPanel = XUiBuffPanel.New(self.PanelBuffParent, self)
self:HideCurScoreChange()
end
function XUiGoldenMinerBattle:OnStart()
local dataDb = self.DataDb
local characterId = XDataCenter.GoldenMinerManager.GetUseCharacterId()
self.CurStageId, self.CurStageIndex = dataDb:GetCurStageId()
self.MapId = dataDb:GetStageMapId(self.CurStageId)
self.LastTime = XGoldenMinerConfigs.GetMapTime(self.MapId)
self.BeforeScore = dataDb:GetStageScores()
self.CurMapScore = self.BeforeScore --在当前地图中的得分
self.SettlementItems = dataDb:GetItemColumns()
self.DefaultFaceImgPath = XGoldenMinerConfigs.GetCharacterDefaultFace(characterId) --角色默认表情资源路径
self.IsPlayNearEndAnima = true --是否播放临近结束时的动画
--飞碟特效首次打开界面隐藏,等倒计时结束后再显示
self:SetHumenEffectActive(false)
--背景的Canvas层级大于0会挡住特效强制设为0
if self.FullScreenBackground then
self.FullScreenBackground.sortingOrder = 0
end
--目标得分
self.TargetScoreData = dataDb:GetCurStageTargetScore()
self.TargetScore.text = XUiHelper.GetText("GoldenMinerPlayTargetScore", self.TargetScoreData)
self.TxtNumber.text = XUiHelper.GetText("GoldenMinerCurStage", self.CurStageIndex)
--设置发射钩爪按钮音效的音量为原大小
self.BtnChange.transform:GetComponent("XUguiPlaySound").VolumePercent = 100
end
function XUiGoldenMinerBattle:OnEnable()
XUiGoldenMinerBattle.Super.OnEnable(self)
XEventManager.AddEventListener(XEventId.EVENT_APPLICATION_PAUSE, self.ApplicationPause, self)
self:Init()
end
function XUiGoldenMinerBattle:Init()
--等异形屏适配宽度后再计算
XScheduleManager.ScheduleOnce(function()
if XTool.UObjIsNil(self.GameObject) then
return
end
local areaPanel = XUiHelper.TryGetComponent(self.Ui.Transform, "SafeAreaContentPane")
self.RectSize = areaPanel:GetComponent("RectTransform").rect.size
self.RoleMoveRange = self.RectSize.x * ROLE_MOVE_RANGE_PERCENT
self:UpdateCurScore()
self:InitMap(self.MapId)
self:SetHumenCurState(HumenState.Idle)
self:SetTxtTime(self.LastTime)
self:InitEdgeTriggerEnter()
self:InitTimes()
self:SetRoleDefaultFace()
self:InitHumenAppearance()
self.ItemPanel:UpdateItemColumns()
self:UpdateBuff()
self:InitRope()
self:SetCurState(RopeState.Rock)
self:StartGameStopCountdown()
end, 10)
end
function XUiGoldenMinerBattle:OnDisable()
XUiGoldenMinerBattle.Super.OnDisable(self)
XEventManager.RemoveEventListener(XEventId.EVENT_APPLICATION_PAUSE, self.ApplicationPause, self)
self:StopTimer()
self:StopGameStopCountdown()
self:StopCurScoreChangeAnima()
end
function XUiGoldenMinerBattle:OnDestroy()
for _, resource in pairs(self.ResourcePool) do
resource:Release()
end
if not XTool.UObjIsNil(self.GoInputHandler) then
self.GoInputHandler:RemoveAllListeners()
end
self.GoInputHandler = nil
self:StopRopeSoundPlay()
end
function XUiGoldenMinerBattle:InitObj()
self.FullScreenBackground = XUiHelper.TryGetComponent(self.Transform, "FullScreenBackground", "Canvas")
end
--初始化飞船外观
function XUiGoldenMinerBattle:InitHumenAppearance()
local humenImageObj = XUiHelper.TryGetComponent(self.Humen.transform, "Humen", "RawImage")
if not humenImageObj then
return
end
local dataDb = self.DataDb
local upgradeList = dataDb:GetAllUpgradeStrengthenList()
local totalNum = 0
local shipKey = XGoldenMinerConfigs.ShipAppearanceKey.DefaultShip
--设置飞船外观
for _, strengthenDb in ipairs(upgradeList) do
if not string.IsNilOrEmpty(strengthenDb:GetLvMaxShipKey()) and strengthenDb:IsMaxLv() then
totalNum = totalNum + 1
shipKey = strengthenDb:GetLvMaxShipKey()
end
end
if totalNum >= FINAL_SHIP_MAX_COUNT then
shipKey = XGoldenMinerConfigs.ShipAppearanceKey.FinalShip
end
humenImageObj:SetRawImage(XGoldenMinerConfigs.GetShipImagePath(shipKey))
--设置飞船大小
local shipSizeWidth, shipSizeHeight
if shipKey == XGoldenMinerConfigs.ShipAppearanceKey.MaxSpeedShip then
shipSizeWidth, shipSizeHeight = XGoldenMinerConfigs.GetShipSize(XGoldenMinerConfigs.ShipAppearanceSizeKey.MaxSpeedShipSize)
elseif shipKey == XGoldenMinerConfigs.ShipAppearanceKey.MaxClampShip then
shipSizeWidth, shipSizeHeight = XGoldenMinerConfigs.GetShipSize(XGoldenMinerConfigs.ShipAppearanceSizeKey.MaxClampShipSize)
elseif shipKey == XGoldenMinerConfigs.ShipAppearanceKey.FinalShip then
shipSizeWidth, shipSizeHeight = XGoldenMinerConfigs.GetShipSize(XGoldenMinerConfigs.ShipAppearanceSizeKey.FinalShipSize)
else
shipSizeWidth, shipSizeHeight = XGoldenMinerConfigs.GetShipSize(XGoldenMinerConfigs.ShipAppearanceSizeKey.DefaultShipSize)
end
humenImageObj.transform:GetComponent("RectTransform").rect.size = Vector2(shipSizeWidth, shipSizeHeight)
end
--初始化当前使用类型的钩爪
function XUiGoldenMinerBattle:InitRope()
local falculaType = self:GetFalculaType()
self.NormalRope.gameObject:SetActiveEx(falculaType == XGoldenMinerConfigs.FalculaType.Normal)
self.MagneticRope.gameObject:SetActiveEx(falculaType == XGoldenMinerConfigs.FalculaType.Magnetic)
self.BigRope.gameObject:SetActiveEx(falculaType == XGoldenMinerConfigs.FalculaType.Big)
self.Rope = (falculaType == XGoldenMinerConfigs.FalculaType.Magnetic and self.MagneticRope) or
(falculaType == XGoldenMinerConfigs.FalculaType.Big and self.BigRope) or
self.NormalRope
--普通和电磁钩爪的触发器
self.RopeCordCollider = (falculaType == XGoldenMinerConfigs.FalculaType.Magnetic and self.MagneticRopeCordCollider) or self.NormalCordCollider
--绳子Trans
self.RopeTrans = self.Rope.transform
self.RopeRectTrans = self.Rope.gameObject:GetComponent("RectTransform")
--绳子最短长度
self.RopeMinLength = self.RopeRectTrans.sizeDelta.y
--绳子最长长度
self.RopeMaxLength = math.ceil(math.sqrt(self.RectSize.x ^ 2 + self.RectSize.y ^ 2))
--钩爪
local ropeCord = XUiHelper.TryGetComponent(self.RopeTrans, "RopeCord")
self.RopeCordTrans = ropeCord.transform
self.RopeCordOriginPosY = self.RopeCordTrans.localPosition.y
--左钩子
local ropeCordLeft = XUiHelper.TryGetComponent(self.RopeTrans, "RopeCordLeft")
self.RopeCordLeftTrans = ropeCordLeft and ropeCordLeft.transform
self.RopeCordLeftOriginPosY = self.RopeCordLeftTrans and self.RopeCordLeftTrans.localPosition.y
--右钩子
local ropeCordRight = XUiHelper.TryGetComponent(self.RopeTrans, "RopeCordRight")
self.RopeCordRightTrans = ropeCordRight and ropeCordRight.transform
self.RopeCordRightOriginPosY = self.RopeCordRightTrans and self.RopeCordRightTrans.localPosition.y
--电磁类型的钩子
local ropeCordMagnetic = XUiHelper.TryGetComponent(self.RopeTrans, "RopeCordMagnetic")
self.RopeCordMagneticTrans = ropeCordMagnetic and ropeCordMagnetic.transform
self.RopeCordMagneticOriginPosY = self.RopeCordMagneticTrans and self.RopeCordMagneticTrans.localPosition.y
--钩环
local shackle = XUiHelper.TryGetComponent(self.RopeTrans, "Shackle")
self.ShackleTrans = shackle and shackle.transform
self.ShackleOriginPosY = self.ShackleTrans and self.ShackleTrans.localPosition.y
--抓取到的对象的父节点
self.TriggerObjs = XUiHelper.TryGetComponent(self.RopeCordTrans, "TriggerObjs")
self:InitAim()
self:SetRopeLength(self.RopeMinLength)
end
--初始化瞄准线
function XUiGoldenMinerBattle:InitAim()
self.Aim = XUiHelper.TryGetComponent(self.RopeCordTrans, "Aim")
local length = math.ceil(math.sqrt(self.RectSize.x ^ 2 + self.RectSize.y ^ 2))
local sizeDelta = self.Aim.gameObject:GetComponent("RectTransform").sizeDelta
self.Aim.gameObject:GetComponent("RectTransform").sizeDelta = Vector2(sizeDelta.x, length)
end
function XUiGoldenMinerBattle:InitTimes()
self:SetAutoCloseInfo(XDataCenter.GoldenMinerManager.GetActivityEndTime(), function(isClose)
if isClose then
XDataCenter.GoldenMinerManager.HandleActivityEndTime()
return
end
end, nil, 0)
end
--初始化地图边界触发器
function XUiGoldenMinerBattle:InitEdgeTriggerEnter()
self.EdgeLeft:AddTriggerEnter2DCallback(function(collider) self:OnEdgeTriggerEnter(collider) end)
self.EdgeRight:AddTriggerEnter2DCallback(function(collider) self:OnEdgeTriggerEnter(collider) end)
self.EdgeTop:AddTriggerEnter2DCallback(function(collider) self:OnEdgeTriggerEnter(collider) end)
self.EdgeBottom:AddTriggerEnter2DCallback(function(collider) self:OnEdgeTriggerEnter(collider) end)
local rectSizeX, rectSizeY = self.RectSize.x, self.RectSize.y
self.EdgeLeftBox.size = Vector2(self.EdgeLeftBox.size.x, rectSizeY)
self.EdgeRightBox.size = Vector2(self.EdgeRightBox.size.x, rectSizeY)
self.EdgeTopBox.size = Vector2(rectSizeX, self.EdgeTopBox.size.y)
self.EdgeBottomBox.size = Vector2(rectSizeX, self.EdgeBottomBox.size.y)
end
--初始化地图中的抓取物
function XUiGoldenMinerBattle:InitMap(mapId)
self.MouseObjList = {}
self.BoomObjList = {}
local stoneIdList = XGoldenMinerConfigs.GetMapStoneId(mapId)
local grapObj
local triggerCb = handler(self, self.TrigerCallback)
local resourceManagerLoadFunc = handler(self, self.ResourceManagerLoad)
for i, stoneId in ipairs(stoneIdList) do
local resource = self:ResourceManagerLoad(XGoldenMinerConfigs.GetStonePrefab(stoneId))
local obj = XUiHelper.Instantiate(resource.Asset)
local stoneType = XGoldenMinerConfigs.GetStoneType(stoneId)
if stoneType == XGoldenMinerConfigs.StoneType.Boom then
grapObj = XGoldenMinerBoom.New(obj, stoneId, i, triggerCb, resourceManagerLoadFunc)
grapObj:InitTriggerBoomFunc(handler(self, self.TriggerBoom))
TableInsert(self.BoomObjList, grapObj)
elseif stoneType == XGoldenMinerConfigs.StoneType.Mouse then
grapObj = XGoldenMinerMouse.New(obj, stoneId, i, triggerCb, resourceManagerLoadFunc)
TableInsert(self.MouseObjList, grapObj)
elseif stoneType == XGoldenMinerConfigs.StoneType.RedEnvelope then
grapObj = XGoldenMinerRedEnvelope.New(obj, stoneId, i, triggerCb, resourceManagerLoadFunc)
else
grapObj = XGoldenMinerBaseObj.New(obj, stoneId, i, triggerCb, resourceManagerLoadFunc)
end
obj.transform:SetParent(self.PanelStone, false)
grapObj:Init(self.MapId, self.RectSize, self.PanelStone)
end
end
-----------------使用道具 begin--------------------
function XUiGoldenMinerBattle:UseItem(itemGrid)
local itemColumn = itemGrid:GetItemColumn()
local itemGridIndex = itemColumn:GetGridIndex()
if not XDataCenter.GoldenMinerManager.IsUseItem(itemGridIndex) then
return
end
local itemId = itemColumn:GetItemId()
local buffId = XGoldenMinerConfigs.GetItemBuffId(itemId)
local buffType = XGoldenMinerConfigs.GetBuffType(buffId)
local params = XGoldenMinerConfigs.GetBuffParams(buffId)
if buffType == XGoldenMinerConfigs.BuffType.GoldenMinerBoom then
--绳子回收且有抓取物时,使用炸弹消灭抓取物
if self:GetCurState() ~= RopeState.Shorten or XTool.IsTableEmpty(self.CurTriggerObjDic) then
return
end
self:UseBoom()
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerStoneChangeGold then
--正在拉回的物品变为同样重量的金块
if self:GetCurState() ~= RopeState.Shorten or XTool.IsTableEmpty(self.CurTriggerObjDic) then
return
end
for k, goldenMinerObject in pairs(self.CurTriggerObjDic) do
goldenMinerObject:ChangeToGold()
end
self:SetRoleFaceByGroup(XGoldenMinerConfigs.FaceGroup.RoleUseStoneChangeGold, self:GetCurTriggerObjTotalScore())
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerMouseStop then
--所有的鼬鼠停止移动一段时间
for _, mouseObj in ipairs(self.MouseObjList) do
mouseObj:StopMoveTime(tonumber(params[1]))
end
--鼬鼠恢复移动的时间
self.MouseRecoverMoveTime = self.LastTime - tonumber(params[1])
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerNotActiveBoom then
--不激活炸弹箱
local curNotActiveBoomTimes = self:GetNotActiveBoomTimes()
self:SetNotActiveBoomTimes(curNotActiveBoomTimes + tonumber(params[1]))
self:SetIsActiveBoom(false)
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleUseNotActiveBoom)
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerShortenSpeed then
--拉回速度变为N倍
if self:GetCurState() == RopeState.Shorten then
self:UpdateCurShortenSpeed(self.ShortenSpeed * tonumber(params[1]) / PERCENT)
end
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleUseShortenSpeed)
else
return
end
self:PlayUseItemSound(itemId)
itemGrid:SetRImgIconActive(false)
self.DataDb:UseItem(itemGridIndex)
self:UpdateItemChangeInfo(itemGridIndex, XGoldenMinerConfigs.ItemChangeType.OnUse)
end
--播放使用道具音效
function XUiGoldenMinerBattle:PlayUseItemSound(itemId)
local soundId = XGoldenMinerConfigs.GetItemUseSoundId(itemId)
if not XTool.IsNumberValid(soundId) then
return
end
XSoundManager.PlaySoundByType(soundId, XSoundManager.SoundType.Sound)
end
--使用炸弹
function XUiGoldenMinerBattle:UseBoom()
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleUseBoom)
local triggerObjsPos = self.PanelPlay.transform:InverseTransformPoint(self.TriggerObjs.transform.position)
self:LoadEffect(USE_BOOM_EFFECT, self.PanelPlay, triggerObjsPos)
local score = self:GetCurTriggerObjTotalScore()
local boomAfterScore = XGoldenMinerConfigs.GetFaceScore(XGoldenMinerConfigs.FaceId.RoleUseBoomAfter)
self:SetRoleFace(score >= boomAfterScore and XGoldenMinerConfigs.FaceId.RoleUseBoomAfter or XGoldenMinerConfigs.FaceId.RoleUseBoom)
self:RemoveCurTriggerObjDic(true)
end
function XUiGoldenMinerBattle:UpdateItemChangeInfo(itemGridIndex, status)
local itemChangeInfo = XGoldenMinerItemChangeInfo.New()
local itemDb = self.DataDb:GetItemColumnByIndex(itemGridIndex)
itemChangeInfo:UpdateData({
ItemId = itemDb:GetClientItemId(),
Status = status,
GridIndex = itemGridIndex
})
self.SettlementInfo:InsertSettlementItem(itemChangeInfo)
end
-----------------使用道具 end--------------------
function XUiGoldenMinerBattle:StartTimer()
self:StopTimer()
self.Timer = XScheduleManager.ScheduleForeverEx(handler(self, self.Update), 0)
self:CheckRopeSoundPlay()
end
function XUiGoldenMinerBattle:StopTimer()
if self.Timer then
XScheduleManager.UnSchedule(self.Timer)
self.Timer = nil
end
self:StopRopeSoundPlay()
end
function XUiGoldenMinerBattle:RegisterButtonEvent()
self:RegisterClickEvent(self.BtnStop, self.OnBtnStopClick)
self:RegisterClickEvent(self.BtnChange, self.OnBtnChangeClick)
self.GoInputHandler:AddPointerDownListener(function(eventData) self:OnPointerDown(eventData) end)
self.GoInputHandler:AddPointerUpListener(function(eventData) self:OnPointerUp(eventData) end)
end
--抛出绳子
function XUiGoldenMinerBattle:OnBtnChangeClick()
if self:GetCurState() ~= RopeState.Rock then
return
end
self:OnPointerUp()
self:SetCurState(RopeState.Stretch)
self.SettlementInfo:AddLaunchingClawCount()
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetStretchSound(), XSoundManager.SoundType.Sound)
end
---------------暂停相关 begin--------------------
function XUiGoldenMinerBattle:OnBtnStopClick()
self.BtnStop:SetButtonState(CSUiButtonStateSelect)
self:StopTimer()
local title = XUiHelper.GetText("GoldenMinerStopTipsTitle")
local closeCallback = function()
self.BtnStop:SetButtonState(CSUiButtonStateNormal)
self:StartGameStopCountdown()
end
local sureCallback = handler(self, self.QuickDialog)
local extraData = {
sureText = XUiHelper.GetText("GoldenMinerStopTipsCloseText"),
closeText = XUiHelper.GetText("GoldenMinerStopTipsSureText")
}
XLuaUiManager.Open("UiGoldenMinerDialog", title, "", closeCallback, sureCallback, extraData)
end
--二次确认退出弹窗
function XUiGoldenMinerBattle:QuickDialog()
local title = XUiHelper.GetText("GoldenMinerQuickTipsTitle")
local desc = XUiHelper.GetText("GoldenMinerQuickTipsDesc")
local closeCallback = handler(self, self.OnBtnStopClick)
local sureCallback = function()
self:UpdateSettlementInfo()
XDataCenter.GoldenMinerManager.RequestGoldenMinerExitGame(self.CurStageId, function()
XLuaUiManager.PopThenOpen("UiGoldenMinerMain")
end, self.SettlementInfo, self.CurMapScore, self.BeforeScore)
end
XLuaUiManager.Open("UiGoldenMinerDialog", title, desc, closeCallback, sureCallback)
end
--解除暂停倒计时
function XUiGoldenMinerBattle:StartGameStopCountdown()
self:StopGameStopCountdown()
local time = GAME_STOP_COUNTDOWN
self.GameStopTimer = XScheduleManager.ScheduleForeverEx(function()
if time <= 0 then
self.PanelGuide.gameObject:SetActiveEx(false)
self:SetHumenEffectActive(true)
self:StopGameStopCountdown()
self:StartTimer()
return
end
self.TxtCountdown.text = string.format("%02d", time)
self.PanelGuide.gameObject:SetActiveEx(true)
time = time - 1
end, XScheduleManager.SECOND)
end
function XUiGoldenMinerBattle:StopGameStopCountdown()
if self.GameStopTimer then
XScheduleManager.UnSchedule(self.GameStopTimer)
self.GameStopTimer = nil
end
end
--程序暂停
function XUiGoldenMinerBattle:ApplicationPause(isPause)
if isPause then
self:OnBtnStopClick()
end
end
---------------暂停相关 end--------------------
local _IsNearEnd
local _IsPlayTimeEnable
function XUiGoldenMinerBattle:SetTxtTime(time)
if not XTool.IsNumberValid(self.CurNearEndTime) then
self.CurNearEndTime = time - 1
end
_IsPlayTimeEnable = time - self.CurNearEndTime < 0
_IsNearEnd = time <= GAME_NEAR_END_TIME
--临近结束时间后每隔1秒播放一次动画
if _IsNearEnd and _IsPlayTimeEnable then
self.CurNearEndTime = time - 1
self:PlayAnimation("TimeEnable")
end
self.TxtTime.text = XUiHelper.GetTime(time, XUiHelper.TimeFormatType.ESCAPE_REMAIN_TIME)
self.TxtTime.color = TxtTimeColor[not _IsNearEnd]
end
--更新Buff
function XUiGoldenMinerBattle:UpdateBuff()
self.BuffPanel:UpdateBuff()
self:SetFalculaType(XGoldenMinerConfigs.FalculaType.Normal)
self:SetStretchSpeed(XGoldenMinerConfigs.GetRopeStretchSpeed()) --绳子伸长基本速度
self:SetShortenSpeed(XGoldenMinerConfigs.GetRopeShortenSpeed()) --绳子拉回基本速度
self:SetHumenMoveSpeed(XGoldenMinerConfigs.GetHumenMoveSpeed()) --飞碟移动速度
self:SetRopeRockSpeed(XGoldenMinerConfigs.GetRopeRockSpeed()) --绳子摇摆速度
self.StoneUpScoreDic = {} --抓取物获得的分数变为原本的X倍默认为1
local ownBuffDic = XDataCenter.GoldenMinerManager.GetOwnBuffDic()
local stoneScoreBuffs = ownBuffDic[XGoldenMinerConfigs.BuffType.GoldenMinerStoneScore]
if not XTool.IsTableEmpty(stoneScoreBuffs) then
for goldenMinerStoneType, params in pairs(stoneScoreBuffs) do
self.StoneUpScoreDic[goldenMinerStoneType] = params[2] --各个不同类型的抓取物对应的倍率
end
end
for buffType, params in pairs(ownBuffDic) do
if buffType == XGoldenMinerConfigs.BuffType.GoldenMinerShortenSpeed then
self:SetShortenSpeed(self.ShortenSpeed * params[1] / PERCENT)
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerNotActiveBoom then
local curNotActiveBoomTimes = self:GetNotActiveBoomTimes()
self:SetNotActiveBoomTimes(curNotActiveBoomTimes + params[1])
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerHumenSpeed then
self:SetHumenMoveSpeed(self.HumenMoveSpeed * params[1] / PERCENT)
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerStretchSpeed then
self:SetStretchSpeed(self.StretchSpeed * params[1] / PERCENT)
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerCordMode then
self:SetFalculaType(params[1])
elseif buffType == XGoldenMinerConfigs.BuffType.GoldenMinerAim then
self:SetIsShowAim(true)
end
end
end
local _DeltaTime
local _CurState
function XUiGoldenMinerBattle:Update()
_DeltaTime = self:GetDeltaTime()
self.LastTime = self.LastTime - _DeltaTime
self:SetTxtTime(self.LastTime)
if MathFloor(self.LastTime) <= 0 then
self:GameOver()
return
end
_CurState = self:GetCurState()
if _CurState == RopeState.Rock then
self:Rock()
self:SetRoleDefaultFace()
elseif _CurState == RopeState.Stretch then
self:Stretch()
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleStretch)
elseif _CurState == RopeState.Shorten then
self:Shorten()
end
if self.HumenCurState == HumenState.MoveLeft then
self:HumenMoveLeft()
elseif self.HumenCurState == HumenState.MoveRight then
self:HumenMoveRight()
end
for _, mouseObj in ipairs(self.MouseObjList) do
mouseObj:Move(_DeltaTime)
end
end
-----------Buff相关 begin---------------
--设置回收绳子基本速度
function XUiGoldenMinerBattle:SetShortenSpeed(speed)
self.ShortenSpeed = speed
end
--设置当前回收绳子的速度
function XUiGoldenMinerBattle:SetCurShortenSpeed(speed)
self.CurShortenSpeed = speed
end
--更新当前正在回收绳子时的速度
function XUiGoldenMinerBattle:UpdateCurShortenSpeed(speed)
local baseSpeed = speed or self.ShortenSpeed or 0
local totalWeight = self:GetCurTriggerObjTotalWeight()
local denominator = totalWeight + SHORTEN_SPEED_PARAMETER
denominator = XTool.IsNumberValid(denominator) and denominator or 1
baseSpeed = baseSpeed * (1 - (totalWeight / denominator))
self:SetCurShortenSpeed(math.max(SHORTEN_MIN_SPEED, baseSpeed))
end
--设置绳子伸长速度
function XUiGoldenMinerBattle:SetStretchSpeed(speed)
self.StretchSpeed = speed
end
--设置角色移动速度
function XUiGoldenMinerBattle:SetHumenMoveSpeed(speed)
self.HumenMoveSpeed = speed
end
--设置绳子摇摆速度
function XUiGoldenMinerBattle:SetRopeRockSpeed(speed)
self.RopeRockSpeed = speed
end
--设置钩爪类型
function XUiGoldenMinerBattle:SetFalculaType(type)
self.FalculaType = type
end
function XUiGoldenMinerBattle:GetFalculaType()
return self.FalculaType
end
--是否显示瞄准线
function XUiGoldenMinerBattle:SetIsShowAim(isShow)
self.IsShowAim = isShow
end
--获得抓取物分数上升倍率默认1
function XUiGoldenMinerBattle:GetStoneUpScoreMultiple(goldenMinerStoneType)
local multiple = self.StoneUpScoreDic[goldenMinerStoneType]
return multiple and multiple / PERCENT or 1
end
--获得抓取物分数
function XUiGoldenMinerBattle:GetStoneScore(goldenMinerObject)
local goldenMinerStoneType = goldenMinerObject:GetType()
local score = 0
--鼬鼠需要额外算上携带物的倍率
if goldenMinerStoneType == XGoldenMinerConfigs.StoneType.Mouse then
local carryStoneId = goldenMinerObject:GetCurCarryStoneId()
if XTool.IsNumberValid(carryStoneId) then
local stoneType = XGoldenMinerConfigs.GetStoneType(carryStoneId)
score = score + goldenMinerObject:GetCarryStoneScore() * self:GetStoneUpScoreMultiple(stoneType)
end
end
score = score + goldenMinerObject:GetScore() * self:GetStoneUpScoreMultiple(goldenMinerStoneType)
return score
end
-----------Buff相关 end-----------------
-----------角色状态 begin---------------
--按下屏幕,角色左右移动
local _Screen = CS.UnityEngine.Screen
function XUiGoldenMinerBattle:OnPointerDown(eventData)
if self:GetCurState() ~= RopeState.Rock then
return
end
local eventPosX = eventData.position.x
if eventPosX < _Screen.width / 2 then
--向左移动
self:SetHumenCurState(HumenState.MoveLeft)
else
--向右移动
self:SetHumenCurState(HumenState.MoveRight)
end
end
function XUiGoldenMinerBattle:OnPointerUp()
self:SetHumenCurState(HumenState.Idle)
end
function XUiGoldenMinerBattle:HumenMoveLeft()
local changePosX = self.Humen.transform.localPosition.x - self:GetDeltaTime() * self.HumenMoveSpeed
if not self:CheckHumenMove(changePosX) then
return
end
self.Humen.transform.localPosition = Vector3(changePosX, self.HumenPosY, 0)
end
function XUiGoldenMinerBattle:HumenMoveRight()
local changePosX = self.Humen.transform.localPosition.x + self:GetDeltaTime() * self.HumenMoveSpeed
if not self:CheckHumenMove(changePosX) then
return
end
self.Humen.transform.localPosition = Vector3(changePosX, self.HumenPosY, 0)
end
function XUiGoldenMinerBattle:SetHumenCurState(state)
self.HumenCurState = state
end
local _HumenCurPosX
function XUiGoldenMinerBattle:CheckHumenMove(changePosX)
_HumenCurPosX = self.Humen.transform.localPosition.x
--锚点在中间
if MahtAbs(changePosX * 2) >= self.RoleMoveRange then
self:SetHumenCurState(HumenState.Idle)
return false
end
return true
end
-----------角色状态 end---------------
-----------绳子状态 begin---------------
local _RopeLength
local _Scale
function XUiGoldenMinerBattle:Rock()
if self.RopeTrans.localRotation.z <= -0.5 then
self.RopeRockDir = Vector3.forward
elseif self.RopeTrans.localRotation.z >= 0.5 then
self.RopeRockDir = Vector3.back
end
self.RopeTrans:Rotate(self.RopeRockDir * self.RopeRockSpeed * self:GetDeltaTime())
end
function XUiGoldenMinerBattle:Stretch()
_RopeLength = self.RopeLength + self:GetDeltaTime() * self.StretchSpeed
self:SetRopeLength(_RopeLength)
self:SetRopeCordPosY(self.RopeMinLength - self.RopeRectTrans.sizeDelta.y)
if _RopeLength >= self.RopeMaxLength then
self:SetCurState(RopeState.Shorten)
end
end
function XUiGoldenMinerBattle:Shorten()
if self.RopeLength <= self.RopeMinLength then
self:SetRopeLength(self.RopeMinLength)
self:SetRopeCordPosY(0)
self:CheckRoleGrapSuccess()
self:UpdateCurScore()
self:SetCurState(RopeState.Rock)
return
end
_RopeLength = self.RopeLength - self:GetDeltaTime() * self.CurShortenSpeed
self:SetRopeLength(_RopeLength)
self:SetRopeCordPosY(self.RopeMinLength - self.RopeRectTrans.sizeDelta.y)
end
--设置绳子高度
function XUiGoldenMinerBattle:SetRopeHeight(height)
self.RopeRectTrans.sizeDelta = Vector2(self.RopeRectTrans.sizeDelta.x, height)
end
--设置绳子节点下的Y轴
--ropeLengthLerp当前绳子长度和原始长度的差值
local _localPosition
function XUiGoldenMinerBattle:SetRopeCordPosY(ropeLengthLerp)
if self.RopeCordLeftTrans then
_localPosition = self.RopeCordLeftTrans.localPosition
self.RopeCordLeftTrans.localPosition = Vector3(_localPosition.x, self.RopeCordLeftOriginPosY + ropeLengthLerp, _localPosition.z)
end
if self.RopeCordRightTrans then
_localPosition = self.RopeCordRightTrans.localPosition
self.RopeCordRightTrans.localPosition = Vector3(_localPosition.x, self.RopeCordRightOriginPosY + ropeLengthLerp, _localPosition.z)
end
if self.RopeCordMagneticTrans then
_localPosition = self.RopeCordMagneticTrans.localPosition
self.RopeCordMagneticTrans.localPosition = Vector3(_localPosition.x, self.RopeCordMagneticOriginPosY + ropeLengthLerp, _localPosition.z)
end
if self.ShackleTrans then
_localPosition = self.ShackleTrans.localPosition
self.ShackleTrans.localPosition = Vector3(_localPosition.x, self.ShackleOriginPosY + ropeLengthLerp, _localPosition.z)
end
_localPosition = self.RopeCordTrans.localPosition
self.RopeCordTrans.localPosition = Vector3(_localPosition.x, self.RopeCordOriginPosY + ropeLengthLerp, _localPosition.z)
end
function XUiGoldenMinerBattle:SetRopeLength(length)
self.RopeLength = length
self:SetRopeHeight(length)
end
--设置当前绳子的状态
--boomObj在地图中的炸弹对象
function XUiGoldenMinerBattle:SetCurState(state, boomObj)
local falculaType = self:GetFalculaType()
--电磁钩爪不播放夹子动画,直接回收
if state == RopeState.Stop and falculaType == XGoldenMinerConfigs.FalculaType.Magnetic then
state = RopeState.Shorten
if boomObj then
self:TriggerBoom(boomObj)
end
end
--播放和停止音效
if state == RopeState.Stretch then
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetStretchSound(), XSoundManager.SoundType.Sound)
else
XSoundManager.Stop(XGoldenMinerConfigs.GetStretchSound())
end
if state == RopeState.Shorten then
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetShortenSound(), XSoundManager.SoundType.Sound)
else
XSoundManager.Stop(XGoldenMinerConfigs.GetShortenSound())
end
local isPlayRopeAnima = self.CurState ~= state
self.CurState = state
if isPlayRopeAnima then
self:PlayRopeAnima(state, boomObj)
end
if state == RopeState.Stop then
--普通钩爪停止移动播放动画时,关闭触发器检测
if falculaType == XGoldenMinerConfigs.FalculaType.Normal then
self:SetRopeCordColliderActive(false)
end
return
end
local notActiveBoomTimes = self:GetNotActiveBoomTimes()
if state == RopeState.Shorten and notActiveBoomTimes > 0 then
self:SetNotActiveBoomTimes(notActiveBoomTimes - 1)
end
self:SetIsActiveBoom(state == RopeState.Stretch and notActiveBoomTimes <= 0)
self:UpdateCurShortenSpeed()
self:SetAimActive(state == RopeState.Rock and self.IsShowAim)
self:SetRopeCordColliderActive(state == RopeState.Stretch)
if state == RopeState.Shorten then
self:CheckRoleGrapingFace()
end
if state == RopeState.Rock then
self:CheckGameOver()
end
end
--播放夹子动画
function XUiGoldenMinerBattle:PlayRopeAnima(state, boomObj)
--未抓到物品碰到边界回到摇摆状态时,不播放夹子打开的动画
if state == RopeState.Stretch then
self:SetIsPlayRopeOpenAnima(false)
elseif state == RopeState.Rock and not self:GetIsPlayRopeOpenAnima() then
self:SetIsPlayRopeOpenAnima(true)
return
end
local animaName
local falculaType = self:GetFalculaType()
if falculaType == XGoldenMinerConfigs.FalculaType.Normal then
animaName = (state == RopeState.Rock and "NormalRopeOpen") or (state == RopeState.Stop and "NormalRopeClose")
elseif falculaType == XGoldenMinerConfigs.FalculaType.Big then
animaName = (state == RopeState.Rock and "BigRopeOpen") or (state == RopeState.Stop and "BigRopeClose")
end
if state == RopeState.Stop then
self:SetIsPlayRopeOpenAnima(true)
end
if animaName then
self:PlayAnimation(animaName, function()
if state == RopeState.Stop then
if not boomObj then
self:SetObjToTriggerParent()
else
self:TriggerBoom(boomObj)
end
self:SetCurState(RopeState.Shorten)
end
end)
end
end
function XUiGoldenMinerBattle:SetIsPlayRopeOpenAnima(isPlay)
self.IsPlayRopeAnima = isPlay
end
function XUiGoldenMinerBattle:GetIsPlayRopeOpenAnima()
return self.IsPlayRopeAnima
end
function XUiGoldenMinerBattle:GetCurState()
return self.CurState
end
--设置不激活炸药箱的次数
function XUiGoldenMinerBattle:SetNotActiveBoomTimes(times)
self.NotActiveBoomTimes = times
end
function XUiGoldenMinerBattle:GetNotActiveBoomTimes()
return self.NotActiveBoomTimes
end
function XUiGoldenMinerBattle:SetIsActiveBoom(isActive)
for _, boomObj in ipairs(self.BoomObjList) do
boomObj:SetGoInputHandlerActive(isActive)
end
end
function XUiGoldenMinerBattle:SetAimActive(isActive)
self.Aim.gameObject:SetActiveEx(isActive)
end
-----------绳子状态 end---------------
-----------钩子触发器相关 begin------------
function XUiGoldenMinerBattle:SetRopeCordColliderActive(isActive)
if self:GetFalculaType() == XGoldenMinerConfigs.FalculaType.Big then
self.BigRopeCordLeftCollider.enabled = isActive
self.BigRopeCordRightCollider.enabled = isActive
return
end
if XTool.UObjIsNil(self.RopeCordCollider) then
XLog.Error("黄金矿工钩子上的触发器不存在")
return
end
self.RopeCordCollider.enabled = isActive
end
function XUiGoldenMinerBattle:TrigerCallback(goldenMinerObject)
local stoneType = goldenMinerObject:GetType()
local falculaType = self:GetFalculaType()
if stoneType ~= XGoldenMinerConfigs.StoneType.Boom then
self.CurTriggerObjDic[goldenMinerObject:GetIndex()] = goldenMinerObject
end
if stoneType == XGoldenMinerConfigs.StoneType.Boom then
self:SetCurState(RopeState.Stop, goldenMinerObject)
return
elseif falculaType == XGoldenMinerConfigs.FalculaType.Magnetic then
goldenMinerObject:SetObjToTriggerParent(self.TriggerObjs)
return
end
self:SetCurState(RopeState.Stop)
end
function XUiGoldenMinerBattle:OnEdgeTriggerEnter(collider)
self:SetCurState(RopeState.Shorten)
end
function XUiGoldenMinerBattle:SetObjToTriggerParent()
for _, v in pairs(self.CurTriggerObjDic) do
v:SetObjToTriggerParent(self.TriggerObjs)
end
end
--碰到炸弹
function XUiGoldenMinerBattle:TriggerBoom(boomObj)
if (boomObj) and not XTool.UObjIsNil(boomObj.GameObject) then
local effect = XGoldenMinerConfigs.GetStoneCatchEffect(boomObj:GetId())
local boomObjPos = self.PanelPlay.transform:InverseTransformPoint(boomObj.Transform.position)
self:LoadEffect(effect, self.PanelPlay, boomObjPos)
boomObj:SetObjToTriggerParent()
end
self:RemoveCurTriggerObjDic()
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleGrapBoom)
end
-----------钩子触发器相关 end--------------
-----------表情相关 begin------------
--检查表情,返回是否可切换表情
function XUiGoldenMinerBattle:CheckFace()
if XTool.IsNumberValid(self.MouseRecoverMoveTime) and self.MouseRecoverMoveTime <= self.LastTime then
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleUseMouseStop)
return false
end
self.MouseRecoverMoveTime = 0
if XTool.IsNumberValid(self.RoleGrapSuccessTime) and self.RoleGrapSuccessTime <= self.LastTime then
return false
end
self.RoleGrapSuccessTime = 0
return true
end
--检查角色成功拉回表情
function XUiGoldenMinerBattle:CheckRoleGrapSuccess()
local score = self:GetCurTriggerObjTotalScore()
self:SetRoleFaceByGroup(XGoldenMinerConfigs.FaceGroup.RoleGrapSuccess, score)
self.RoleGrapSuccessTime = self.LastTime - ROLE_GRAP_SUCCESS_TIME / MILLISECOND
end
--检查角色拉回的表情
function XUiGoldenMinerBattle:CheckRoleGrapingFace()
--没抓到任何东西
if XTool.IsTableEmpty(self.CurTriggerObjDic) then
self:SetRoleFace(XGoldenMinerConfigs.FaceId.RoleCantGrap)
return
end
local weight = self:GetCurTriggerObjTotalWeight()
self:SetRoleFaceByGroup(XGoldenMinerConfigs.FaceGroup.RoleGraping, weight)
end
--策划需求:不显示默认表情了
function XUiGoldenMinerBattle:SetRoleDefaultFace()
if not self:CheckFace() then
return
end
if self.PreFaceUrlPath == self.DefaultFaceImgPath then
return
end
self:PlayAnimation("PanelEmoticonDisable")
self.PreFaceUrlPath = self.DefaultFaceImgPath
end
function XUiGoldenMinerBattle:SetRoleFace(faceId)
if self.CurFaceId == faceId then
return
end
local img = XGoldenMinerConfigs.GetFaceImage(faceId)
if self.PreFaceUrlPath == img then
return
end
local isPlayDisable = self.DefaultFaceImgPath ~= self.PreFaceUrlPath
self.PreFaceUrlPath = img
if isPlayDisable then
self:PlayAnimation("PanelEmoticonDisable", function()
if not XTool.UObjIsNil(self.RImgHate) then
self.RImgHate:SetRawImage(img)
end
self:PlayAnimation("PanelEmoticonEnable")
end)
else
if not XTool.UObjIsNil(self.RImgHate) then
self.RImgHate:SetRawImage(img)
end
self:PlayAnimation("PanelEmoticonEnable")
end
self.CurFaceId = faceId
self:CheckFace()
end
function XUiGoldenMinerBattle:SetRoleFaceByGroup(groupId, value)
local faceId = XGoldenMinerConfigs.GetFaceIdByGroup(groupId, value)
self:SetRoleFace(faceId)
end
-----------表情相关 end--------------
--获得拉取中的物品总积分
function XUiGoldenMinerBattle:GetCurTriggerObjTotalScore()
local score = 0
for _, obj in pairs(self.CurTriggerObjDic) do
score = score + self:GetStoneScore(obj)
end
return score
end
--获得拉取中的物品总重量
function XUiGoldenMinerBattle:GetCurTriggerObjTotalWeight()
local weight = 0
for _, obj in pairs(self.CurTriggerObjDic) do
weight = weight + obj:GetWeight()
end
return weight
end
function XUiGoldenMinerBattle:UpdateCurScore()
local score
for _, goldenMinerObject in pairs(self.CurTriggerObjDic) do
score = self:GetStoneScore(goldenMinerObject)
self:AddCurMapScore(score)
self:CheckRedEnvelopeItem(goldenMinerObject)
TableInsert(self.CurTriggerObjSettleList, goldenMinerObject)
end
self:RemoveCurTriggerObjDic()
self:UpdateTextCurScore()
end
function XUiGoldenMinerBattle:UpdateTextCurScore()
local score = self.CurMapScore
if not self.OriginScore then
self.OriginScore = score
self.CurScore.text = XUiHelper.GetText("GoldenMinerPlayCurScore", self.CurMapScore)
elseif self.OriginScore ~= score then
self:PlayCurScoreChangeAnima(score - self.OriginScore, self.OriginScore)
self.OriginScore = score
end
end
--检查红包箱是否能获得道具
function XUiGoldenMinerBattle:CheckRedEnvelopeItem(goldenMinerObject)
local dataDb = self.DataDb
local itemColumnIndex = dataDb:GetEmptyItemIndex()
if not goldenMinerObject.GetItemId or not itemColumnIndex then
return
end
local itemId = goldenMinerObject:GetItemId()
if not XTool.IsNumberValid(itemId) then
return
end
dataDb:UpdateItemColumn(itemId, itemColumnIndex)
self.ItemPanel:UpdateItemColumns()
self:UpdateItemChangeInfo(itemColumnIndex, XGoldenMinerConfigs.ItemChangeType.OnGet)
end
function XUiGoldenMinerBattle:AddCurMapScore(score)
if XTool.IsNumberValid(score) then
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetAddScoreSound(), XSoundManager.SoundType.Sound)
end
self.CurMapScore = math.floor(self.CurMapScore + score)
end
function XUiGoldenMinerBattle:RemoveCurTriggerObjDic(isBoom)
self:DestroyAllChildObj(isBoom)
self:UpdateCurShortenSpeed()
end
function XUiGoldenMinerBattle:DestroyAllChildObj(isBoom)
for _, v in pairs(self.CurTriggerObjDic) do
v:DestroySelf(isBoom)
end
self.CurTriggerObjDic = {}
end
--没物品可以抓时直接游戏结束
function XUiGoldenMinerBattle:CheckGameOver()
local transform = self.PanelStone.transform
if not XTool.IsNumberValid(transform.childCount) then
self:GameOver()
end
end
function XUiGoldenMinerBattle:GameOver()
self:StopTimer()
self:UpdateSettlementInfo()
local curMapScore = self.CurMapScore
local mapId = self.MapId
local curStageId = self.CurStageId
self.IsWin = curMapScore >= self.TargetScoreData
local closeCb = handler(self, self.CheckGameState)
local isCloseFunc = handler(self, self.GetIsCloseBattle)
local data = {
CurStageId = curStageId,
CurMapId = mapId,
CurStageIndex = self.CurStageIndex,
BeforeScore = self.BeforeScore,
CurMapScore = curMapScore,
GoldenMinerObjectList = self.CurTriggerObjSettleList,
TargetScore = self.TargetScoreData,
}
XLuaUiManager.Open("UiGoldenMinerReport", data, closeCb, isCloseFunc)
XDataCenter.GoldenMinerManager.RequestGoldenMinerFinishStage(curStageId, self.SettlementInfo, curMapScore, function(isFinishSuccess)
self.IsCloseBattle = true
self.IsFinishSuccess = isFinishSuccess
end, self.IsWin)
end
function XUiGoldenMinerBattle:GetIsCloseBattle()
return self.IsCloseBattle
end
--刷新发给后端的关卡结算数据
function XUiGoldenMinerBattle:UpdateSettlementInfo()
local mapId = self.MapId
local mapTime = XGoldenMinerConfigs.GetMapTime(mapId)
self.SettlementInfo:SetScores(self.CurMapScore - self.BeforeScore)
self.SettlementInfo:SetCostTime(MathFloor(mapTime - self.LastTime))
self.SettlementInfo:UpdateGrabDataInfos(self.CurTriggerObjSettleList)
end
function XUiGoldenMinerBattle:ResourceManagerLoad(path)
local resource = self.ResourcePool[path]
if resource then
return resource
end
resource = CSXResourceManagerLoad(path)
if resource == nil or not resource.Asset then
XLog.Error(string.format("XUiGoldenMinerBattle:ResourceManagerLoad加载资源路径%s", path))
return
end
self.ResourcePool[path] = resource
return resource
end
--加载特效
function XUiGoldenMinerBattle:LoadEffect(path, parent, localPosition)
if XTool.UObjIsNil(parent) then
return
end
local model = self.EffectPool[path]
if XTool.UObjIsNil(model) then
local resource = self:ResourceManagerLoad(path)
model = XUiHelper.Instantiate(resource.Asset, parent)
self.EffectPool[path] = model
end
model.transform.localPosition = localPosition or Vector3.zero
model.gameObject:SetActiveEx(false)
model.gameObject:SetActiveEx(true)
return model
end
function XUiGoldenMinerBattle:CheckGameState()
local nextStageId = self.DataDb:GetCurStageId()
if (not self.IsWin or not nextStageId) or (not self.IsFinishSuccess and self.CurStageIndex == 1) then
XLuaUiManager.PopThenOpen("UiGoldenMinerMain")
return
end
XLuaUiManager.PopThenOpen("UiGoldenMinerShop")
end
function XUiGoldenMinerBattle:SetHumenEffectActive(isActive)
if self.HumenEffect then
self.HumenEffect.gameObject:SetActiveEx(isActive)
end
end
function XUiGoldenMinerBattle:GetBoomObj(index)
for _, boomObj in ipairs(self.BoomObjList) do
if boomObj:GetIndex() == index then
return boomObj
end
end
end
local _deltaTime
function XUiGoldenMinerBattle:GetDeltaTime()
_deltaTime = CSUnityEngineTime.deltaTime
--防止卡顿跳帧
if _deltaTime > 0.05 then
_deltaTime = 0.05
end
return _deltaTime
end
--检查绳子的音效播放
function XUiGoldenMinerBattle:CheckRopeSoundPlay()
local curState = self:GetCurState()
if curState == RopeState.Stretch then
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetStretchSound(), XSoundManager.SoundType.Sound)
elseif curState == RopeState.Shorten then
XSoundManager.PlaySoundByType(XGoldenMinerConfigs.GetShortenSound(), XSoundManager.SoundType.Sound)
end
end
function XUiGoldenMinerBattle:StopRopeSoundPlay()
XSoundManager.Stop(XGoldenMinerConfigs.GetShortenSound())
XSoundManager.Stop(XGoldenMinerConfigs.GetStretchSound())
end
---------------抓取成功播放动画 begin----------------
function XUiGoldenMinerBattle:PlayCurScoreChangeAnima(changeScore, originScore)
self:ShowCurScoreChange("+" .. changeScore)
self:StopCurScoreChangeAnima()
local scores = self.DataDb:GetStageScores()
self.CurScoreChangeAnima = XUiHelper.Tween(1, function(f)
self:ShowCurScoreChange("+" .. changeScore)
self.CurScore.text = XUiHelper.GetText("GoldenMinerPlayCurScore", math.floor(originScore + changeScore * f))
end, function()
self.CurScore.text = XUiHelper.GetText("GoldenMinerPlayCurScore", self.CurMapScore)
end)
if self.PanelCurScoreChange then
self.PanelCurScoreChange.gameObject:SetActiveEx(true)
self:PlayAnimation("BubbleEnable")
end
end
function XUiGoldenMinerBattle:StopCurScoreChangeAnima()
if self.CurScoreChangeAnima then
XScheduleManager.UnSchedule(self.CurScoreChangeAnima)
self.CurScoreChangeAnima = nil
end
end
function XUiGoldenMinerBattle:ShowCurScoreChange(score)
if self.TxtCurScoreChange then
self.TxtCurScoreChange.text = score
end
end
function XUiGoldenMinerBattle:HideCurScoreChange()
if self.PanelCurScoreChange then
self.PanelCurScoreChange.gameObject:SetActiveEx(false)
end
end
---------------抓取成功播放动画 end------------------