PGRData/Script/matrix/xui/xuirpgmakergame/playmain/XUiRpgMakerGamePlayMain.lua

1111 lines
39 KiB
Lua
Raw Normal View History

local XUiRpgMakerGamePanelWinTip = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGamePanelWinTip")
local XUiRpgMakerGamePanelLoseTip = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGamePanelLoseTip")
local XUiRpgMakerGameUnlockTip = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGameUnlockTip")
local XUiRpgMakerGamePanelDetailTip = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGamePanelDetailTip")
local XUiRpgMakeGamePanelAddBtnTwo = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakeGamePanelAddBtnTwo")
local XUiRpgMakerGameRoleMove = require("XUi/XUiRpgMakerGame/PlayMain/XUiRpgMakerGameRoleMove")
local MaxStarCount = XRpgMakerGameConfigs.MaxStarCount
local IsNumberValid = XTool.IsNumberValid
local Vector3 = CS.UnityEngine.Vector3
local Vector2 = CS.UnityEngine.Vector2
local Vector3Right = Vector3.right
local Vector3Forward = Vector3.forward
local mathAbs = math.abs
local CSXTextManagerGetText = CS.XTextManager.GetText
local CSUiButtonStateSelect = CS.UiButtonState.Select
local CSUiButtonStateNormal = CS.UiButtonState.Normal
local CSUnityEngineObjectInstantiate = CS.UnityEngine.Object.Instantiate
local CSUnityEngineObjectDestroy = CS.UnityEngine.Object.Destroy
local RandomDialogBoxIntervalSecond = CS.XGame.ClientConfig:GetFloat("RpgMakerGameRandomDialogBoxIntervalSecond")
local DownHintStayTime = CS.XGame.ClientConfig:GetInt("RpgMakerGamePlayMainDownHintStayTime")
local MoveRoleAngleOffset = CS.XGame.ClientConfig:GetInt("RpgMakerGameMoveRoleAngleOffset") --移动角色的手势角度偏移
local PLAY_ANIMA_INTERVAL = XRpgMakerGameConfigs.PlayAnimaInterval
--关卡玩法主界面
local XUiRpgMakerGamePlayMain = XLuaUiManager.Register(XLuaUi, "UiRpgMakerGamePlayMain")
function XUiRpgMakerGamePlayMain:OnAwake()
XUiHelper.NewPanelActivityAsset({XDataCenter.ItemManager.ItemId.RpgMakerGameHintCoin}, self.PanelSpecialTool)
self.RpgMakerGamePlayScene = XDataCenter.RpgMakerGameManager.GetCurrentScene()
self:InitGuide()
self:InitUiCameraEffect()
self:AutoAddListener()
self:InitTip()
self:InitPanelAddBtnTwo()
self:InitPanelRoleMoveUI()
self.TextSentryRoandMap = {} --显示哨戒剩余回合数的文本控件字典
self.IsGuideing = false --是否正在功能引导中
self.IsPlayingBackoffEffect = false --是否播放后退特效中
self.IsTriggerDrag = false --是否触发拖拽
self.IsWin = false --是否胜利
self:SetCurrUseBackCount(0) --当前使用后退的次数,重置关卡后,计数重置
self:SetCurrResetCount(0) --当前累计使用重置的次数
self:SetCurrLoseCount(0) --当前累计失败次数,有通关记录则不累计
self.TxtWord.text = CSXTextManagerGetText("RpgMakerGamePlayMainIsUseHintDesc")
self:SetContentAddBtn(false)
self:SetIconChatActive(false)
self:SetContentActive(false)
end
function XUiRpgMakerGamePlayMain:OnStart()
XDataCenter.RpgMakerGameManager.SetClickObjectCallback(function(modelKey, modelName) self:ShowObjectTips(modelKey, modelName) end)
XDataCenter.RpgMakerGameManager.SetPointerDownObjectCallback(function() self.PanelRoleMoveUI:SetIsIgnoreUi(true) end)
XDataCenter.RpgMakerGameManager.SetPointerUpObjectCallback(function() self.PanelRoleMoveUI:SetIsIgnoreUi(false) end)
self:InitTextSentryRoandMap()
self:InitStarCondition()
self:InitMaxChallengeCountDesc()
self.RpgMakerGamePlayScene:PlayAnimation()
end
function XUiRpgMakerGamePlayMain:OnEnable()
if self.RpgMakerGamePlayScene:IsSceneNil() then
return
end
self:Refresh()
self:StartDownHintTimer()
end
function XUiRpgMakerGamePlayMain:OnDisable()
self.IsPlayingAction = false
self:StopCheckShowHintTimer()
self:StopRandomDialogBoxDurationTimer()
self:StopDownHintTimer()
self.DetailTip:Hide()
self.DetailTip:SetActive(false)
end
function XUiRpgMakerGamePlayMain:OnDestroy()
if self.UiCameraEffect and self.UiCameraEffect:Exist() then
CS.UnityEngine.GameObject.Destroy(self.UiCameraEffect)
self.UiCameraEffect = nil
end
self.RpgMakerGamePlayScene:RemoveScene()
XDataCenter.RpgMakerGameManager.ClearStageMap()
self:StopGrowTimer()
end
function XUiRpgMakerGamePlayMain:InitTextSentryRoandMap()
for _, textSentryRoand in pairs(self.TextSentryRoandMap) do
CSUnityEngineObjectDestroy(textSentryRoand)
end
self.TextSentryRoandMap = {}
end
function XUiRpgMakerGamePlayMain:InitPanelRoleMoveUI()
local beginDragCb = function(touchPosition) self:OnPointerDown(touchPosition) end
local onDragCb = function(touchPosition) self:OnDrag(touchPosition) end
local endDragCb = function(touchPosition) self:OnPointerUp(touchPosition) end
self.PanelRoleMoveUI = XUiRpgMakerGameRoleMove.New(self, self.GameObject:GetComponent("RectTransform"), beginDragCb, onDragCb, endDragCb)
end
function XUiRpgMakerGamePlayMain:InitUiCameraEffect()
local camera = CS.XUiManager.Instance.UiCamera
local cameraEffectPath = CS.XGame.ClientConfig:GetString("RpgMakerPlayScreenUiCameraEffect")
local resource = CS.XResourceManager.Load(cameraEffectPath)
if resource == nil or not resource.Asset then
XLog.Error(string.format("XUiRpgMakerGamePlayMain:InitUiCameraEffect() 加载:%s失败", cameraEffectPath))
return
end
self.UiCameraEffect = CS.UnityEngine.Object.Instantiate(resource.Asset, camera.transform)
self.UiCameraEffectStart = XUiHelper.TryGetComponent(self.UiCameraEffect.transform, "Start")
self.UiCameraEffectStart.gameObject:SetActiveEx(false)
end
function XUiRpgMakerGamePlayMain:InitTip()
local tipOutCb = handler(self, self.Close)
local tipNextCb = function()
local stageId = self:GetStageId()
local nextStageId = XRpgMakerGameConfigs.GetRpgMakerGameNextStageId(stageId)
local selectRoleId = self:GetSelectRoleId()
local cb = function()
self:SetIsWin(false)
self:SetCurrUseBackCount(0)
self:SetCurrResetCount(0)
self:SetCurrLoseCount(0)
self:OnStart()
self:Refresh()
end
XDataCenter.RpgMakerGameManager.RequestRpgMakerGameEnterStage(nextStageId, selectRoleId, cb)
end
local tipResetCb = handler(self, self.OnBtnResetClick)
self.WinTip = XUiRpgMakerGamePanelWinTip.New(self.PanelWinTip, tipOutCb, tipNextCb, tipResetCb)
self.LoseTip = XUiRpgMakerGamePanelLoseTip.New(self.PanelLoseTip, tipOutCb, tipResetCb)
self.UnlockTip = XUiRpgMakerGameUnlockTip.New(self.PanelUnlockTip)
self.DetailTip = XUiRpgMakerGamePanelDetailTip.New(self.PanelDetailTip, self)
self.WinTip:Hide()
self.LoseTip:Hide()
self.UnlockTip:Hide()
self.DetailTip:SetActive(false)
end
function XUiRpgMakerGamePlayMain:InitPanelAddBtnTwo()
local closeCb = function()
self:CheckIconChatActive()
self:StartCheckShowHintTimer()
end
local clickHintCb = function()
self:SetIconChatActive(false)
self:ShowHintDialog()
self:StartRandomDialogBoxDurationTimer()
end
self.PanelAddBtnTwo = XUiRpgMakeGamePanelAddBtnTwo.New(self.ContentAddBtnTwo, closeCb, clickHintCb)
self.PanelAddBtnTwo:Hide(true)
end
function XUiRpgMakerGamePlayMain:InitMaxChallengeCountDesc()
local mapId = self:GetMapId()
if not IsNumberValid(mapId) then
return
end
local desc = XRpgMakerGameConfigs.GetRpgMakerGameMaxRound(mapId)
self.TextMaxChallenge.text = "/" .. desc
end
function XUiRpgMakerGamePlayMain:InitStarCondition()
local stageId = self:GetStageId()
if not IsNumberValid(stageId) then
return
end
local starConditionIdList = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionIdList(stageId)
local starConditionDesc
for i, starConditionId in ipairs(starConditionIdList) do
starConditionDesc = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionDesc(starConditionId)
self["Task" .. i]:SetName(starConditionDesc)
self["Task" .. i].gameObject:SetActiveEx(true)
self["Task" .. i]:SetButtonState(CSUiButtonStateNormal)
end
for i = #starConditionIdList + 1, MaxStarCount do
self["Task" .. i].gameObject:SetActiveEx(false)
end
end
function XUiRpgMakerGamePlayMain:AutoAddListener()
self:RegisterClickEvent(self.BtnBack, self.OnBtnCloseClick)
self:RegisterClickEvent(self.BtnReset, handler(self, self.OnBtnResetClick))
self:RegisterClickEvent(self.BtnBackoff, handler(self, self.OnBtnBackoffClick))
self:RegisterClickEvent(self.BtnNo, handler(self, self.OnBtnNoClick))
self:RegisterClickEvent(self.BtnYes, handler(self, self.OnBtnYesClick))
self:RegisterClickEvent(self.BtnHead, handler(self, self.OnBtnHeadClick))
if self.BtnGuideRoleClick then
self:RegisterClickEvent(self.BtnGuideRoleClick, handler(self, self.OnBtnGuideRoleClick))
end
if self.BtnGuideRoadClick then
self:RegisterClickEvent(self.BtnGuideRoadClick, handler(self, self.OnBtnGuideRoadClick))
end
local curChapterGroupId = XDataCenter.RpgMakerGameManager.GetCurChapterGroupId()
self:BindHelpBtn(self.BtnHelp, XRpgMakerGameConfigs.GetChapterGroupHelpKey(curChapterGroupId))
end
function XUiRpgMakerGamePlayMain:Refresh()
self.TextChallenge.text = XDataCenter.RpgMakerGameManager.GetCurrentCount()
self:RefreshHint()
self:RefreshStarCondition()
self:CheckActions()
end
function XUiRpgMakerGamePlayMain:RefreshStarCondition()
local stageId = self:GetStageId()
if not IsNumberValid(stageId) then
return
end
local starConditionIdList = XRpgMakerGameConfigs.GetRpgMakerGameStarConditionIdList(stageId)
local btnState
local playableDirector
local isWin = self:GetIsWin()
for i, starConditionId in ipairs(starConditionIdList) do
btnState = XDataCenter.RpgMakerGameManager.IsStarConditionClear(starConditionId, isWin) and CSUiButtonStateSelect or CSUiButtonStateNormal
--播放动画
if self["Task" .. i].ButtonState ~= btnState then
self["Task" .. i]:SetButtonState(btnState)
if btnState == CS.UiButtonState.Select then
playableDirector = XUiHelper.TryGetComponent(self["Task" .. i].gameObject.transform, "Animation/SleEnable", "PlayableDirector")
if playableDirector then
playableDirector.gameObject:SetActiveEx(false)
playableDirector.gameObject:SetActiveEx(true)
playableDirector:Play()
end
end
end
end
end
function XUiRpgMakerGamePlayMain:RefreshHint()
self.PanelAddBtnTwo:Hide(true)
self:SetContentAddBtn(false)
self:CheckIconChatActive()
self:SetContentActive(false)
self:StartCheckShowHintTimer()
end
--检查播放行动动画
function XUiRpgMakerGamePlayMain:CheckActions()
if self.IsPlayingAction then
return
end
if XDataCenter.RpgMakerGameManager.IsActionsEmpty() then
self:UpdateSentrySign()
self:CheckMonsertViewAreaAndLine()
self:CheckWaterState()
return
end
self.IsPlayingAction = true
local action = XDataCenter.RpgMakerGameManager.GetNextAction()
local actionType = action.ActionType
local cb = handler(self, self.PlayActionEndCallback)
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
local endPointObj = XDataCenter.RpgMakerGameManager.GetEndPointObj()
local monsterObj = XDataCenter.RpgMakerGameManager.GetMonsterObj(action.MonsterId)
local triggerObj = XDataCenter.RpgMakerGameManager.GetTriggerObj(action.TriggerId)
local shadowObj = XDataCenter.RpgMakerGameManager.GetShadowObj(action.ShadowId)
local entityObj = XDataCenter.RpgMakerGameManager.GetEntityObj(action.EntityId)
local gameOverCb = function()
self:GameOver(actionType)
cb()
end
local monsterDeathCb = function()
self:HideSentrySignText(action.MonsterId)
cb()
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerMove then
--角色和影子同时移动
local moveEndCount = 0
local moveEndCb = function()
moveEndCount = moveEndCount + 1
if moveEndCount >= 2 then
cb()
end
end
self:CheckActionShadowMove(moveEndCb)
if playerObj then
playerObj:PlayMoveAction(action, moveEndCb, self:GetMapId())
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionKillMonster then
if playerObj then
playerObj:PlayKillMonsterAction(action, monsterDeathCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionStageWin then
local stageId = self:GetStageId()
self.WinTip:Show(stageId)
self:PlayAnimation("PanelWinTipEnable")
self:SetIsWin(true)
XDataCenter.RpgMakerGameManager.SetCurrClearButtonGroupIndex()
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionEndPointOpen then
if endPointObj then
endPointObj:PlayEndPointStatusChangeAction(action, cb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterRunAway or actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterPatrol then
if monsterObj then
monsterObj:RemoveViewAreaAndLine()
local moveEndCb = function()
monsterObj:SetViewAreaAndLine()
monsterObj:CheckRemoveSentry()
self:UpdateSentrySign(action.MonsterId)
cb()
end
monsterObj:PlayMoveAction(action, moveEndCb, self:GetMapId())
end
return
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterChangeDirection then
if monsterObj then
monsterObj:RemoveViewAreaAndLine()
local endCb = function()
monsterObj:SetViewAreaAndLine()
monsterObj:CheckRemoveSentry()
self:UpdateSentrySign(action.MonsterId)
cb()
end
monsterObj:ChangeDirectionAction(action, endCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterKillPlayer then
if monsterObj then
monsterObj:PlayKillPlayerAction(action, gameOverCb)
end
return
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionTriggerStatusChange then
if triggerObj then
triggerObj:PlayTriggerStatusChangeAction(action, cb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionUnlockRole then
local roleId = action.RoleId
if IsNumberValid(roleId) then
self.UnlockTip:Show(roleId)
self:PlayAnimation("PanelUnlockTipEnable")
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterPatrolLine then
if monsterObj then
monsterObj:SetMoveLine(action)
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionShadowDieByTrap then
if shadowObj then
shadowObj:PlayDieByTrapAnima(cb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerDieByTrap then
if playerObj then
playerObj:PlayDieByTrapAnima(gameOverCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterDieByTrap then
if monsterObj then
monsterObj:PlayDieByTrapAnima(monsterDeathCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionElectricStatusChange then
local electricFenceObjDic = XDataCenter.RpgMakerGameManager.GetElectricFenceObjDic()
for _, obj in pairs(electricFenceObjDic) do
obj:PlayElectricFenceStatusChangeAction()
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerKillByElectricFence then
if playerObj then
playerObj:PlayKillByElectricFenceAnima(gameOverCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterKillByElectricFence then
if monsterObj then
monsterObj:PlayKillByElectricFenceAnima(monsterDeathCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionHumanKill then
if monsterObj then
monsterObj:PlayBeAtkAction(gameOverCb)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionSteelBrokenToTrap
or actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionSteelBrokenToFlat then
if entityObj and entityObj.CheckPlayFlat then
entityObj:CheckPlayFlat()
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerDrown then
playerObj:DieByDrown(self:GetMapId(), playerObj:GetPositionX(), playerObj:GetPositionY())
playerObj:PlayDrownAnima(gameOverCb)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionBurnGrass then
local grassObj
local mapId = self:GetMapId()
local BurnFunc = function(grass)
if not grass then
return
end
grassObj = XDataCenter.RpgMakerGameManager.GetEntityObj(grass.Id)
if grassObj and grassObj.Burn then
grassObj:Burn()
else
self.RpgMakerGamePlayScene:BurnGrass(grass.PositionX, grass.PositionY)
end
end
local grass = table.remove(action.Grass, 1)
BurnFunc(grass)
local loop = #action.Grass
if loop <= 0 then
self.RpgMakerGamePlayScene:UpdateTriggeObjStatus(mapId)
cb()
return
end
self:StopGrowTimer()
--间隔一段时间燃烧
self.GrowTimer = XScheduleManager.Schedule(function()
grass = table.remove(action.Grass, 1)
BurnFunc(grass)
--等最后一个播完再继续
if XTool.IsTableEmpty(action.Grass) then
XScheduleManager.ScheduleOnce(function()
if XTool.UObjIsNil(self.GameObject) then
return
end
self.RpgMakerGamePlayScene:UpdateTriggeObjStatus(mapId)
cb()
end, CS.XGame.ClientConfig:GetInt("RpgMakerGameDieByTrapTime"))
end
end, PLAY_ANIMA_INTERVAL, loop)
return
end
if action.ActionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionGrowGrass then
local grassObj
local GrassFunc = function(grass)
if not grass then
return
end
grassObj = XDataCenter.RpgMakerGameManager.GetEntityObj(grass.Id)
if grassObj then
grassObj:SetActive(true)
else
self.RpgMakerGamePlayScene:GrowGrass(grass.PositionX, grass.PositionY)
end
end
local grass = table.remove(action.Grass, 1)
GrassFunc(grass)
local loop = #action.Grass
if loop <= 0 then
cb()
return
end
self:StopGrowTimer()
--间隔一段时间生长
self.GrowTimer = XScheduleManager.Schedule(function()
grass = table.remove(action.Grass, 1)
GrassFunc(grass)
--等最后一个播完再继续
if XTool.IsTableEmpty(action.Grass) then
XScheduleManager.ScheduleOnce(function()
if XTool.UObjIsNil(self.GameObject) then
return
end
cb()
end, CS.XGame.ClientConfig:GetInt("RpgMakerGameDieByTrapTime"))
end
end, PLAY_ANIMA_INTERVAL, loop)
return
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterDrown then
if monsterObj then
monsterObj:DieByDrown(self:GetMapId(), monsterObj:GetPositionX(), monsterObj:GetPositionY())
monsterObj:PlayDrownAnima(monsterDeathCb, true)
return
end
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionPlayerTransfer then
local nextAction = XDataCenter.RpgMakerGameManager.GetNextAction(true)
local endPosX = nextAction and nextAction.StartPosition.PositionX or action.EndPosition.PositionX
local endPosY = nextAction and nextAction.StartPosition.PositionY or action.EndPosition.PositionY
playerObj:PlayTransfer(action.StartPosition.PositionX,
action.StartPosition.PositionY,
endPosX,
endPosY,
cb)
return
end
if actionType == XRpgMakerGameConfigs.RpgMakerGameActionType.ActionMonsterTransfer then
local nextAction = XDataCenter.RpgMakerGameManager.GetNextAction(true)
local endPosX = nextAction and nextAction.StartPosition.PositionX or action.EndPosition.PositionX
local endPosY = nextAction and nextAction.StartPosition.PositionY or action.EndPosition.PositionY
if monsterObj then
monsterObj:PlayTransfer(action.StartPosition.PositionX,
action.StartPosition.PositionY,
endPosX,
endPosY,
cb)
return
end
return
end
cb()
end
function XUiRpgMakerGamePlayMain:StopGrowTimer()
if self.GrowTimer then
XScheduleManager.UnSchedule(self.GrowTimer)
self.GrowTimer = nil
end
end
--检查水对象的状态,把融化状态设为水
function XUiRpgMakerGamePlayMain:CheckWaterState()
local waterObjDic = XDataCenter.RpgMakerGameManager.GetWaterObjDic()
for _, waterObj in pairs(waterObjDic) do
if waterObj:GetStatus() == XRpgMakerGameConfigs.XRpgMakerGameWaterType.Melt then
waterObj:SetStatus(XRpgMakerGameConfigs.XRpgMakerGameWaterType.Water)
end
end
end
--检查所有怪物的攻击范围和警戒线
function XUiRpgMakerGamePlayMain:CheckMonsertViewAreaAndLine()
local monsterObjDic = XDataCenter.RpgMakerGameManager.GetMonsterObjDic()
for _, monsertObj in pairs(monsterObjDic) do
monsertObj:SetViewAreaAndLine()
end
end
--刷新哨戒停留剩余回合
function XUiRpgMakerGamePlayMain:UpdateSentrySign(monsterId)
if self:UpdateSentrySignText(monsterId) then
return
end
local monsterObjDic = XDataCenter.RpgMakerGameManager.GetMonsterObjDic()
for monsterId in pairs(monsterObjDic or {}) do
self:UpdateSentrySignText(monsterId)
end
end
function XUiRpgMakerGamePlayMain:UpdateSentrySignText(monsterId)
local monsterObj = XDataCenter.RpgMakerGameManager.GetMonsterObj(monsterId)
if not monsterObj then
return false
end
monsterObj:LoadSentrySign()
local textSentryRoand = self.TextSentryRoandMap[monsterId]
if monsterObj:IsSentryShowLastStopRound() and not monsterObj:IsDeath() then
if not textSentryRoand then
textSentryRoand = CSUnityEngineObjectInstantiate(self.TextSentryRoand, self.PanelInfo.transform)
self.TextSentryRoandMap[monsterId] = textSentryRoand
end
textSentryRoand.text = monsterObj:GetSentryLastStopRound()
local objPosition = monsterObj:GetSentryRoandGameObjPosition()
textSentryRoand.transform.localPosition = self:WorldToUILocaPosition(objPosition)
textSentryRoand.gameObject:SetActiveEx(true)
elseif textSentryRoand then
textSentryRoand.gameObject:SetActiveEx(false)
end
return true
end
function XUiRpgMakerGamePlayMain:HideSentrySignText(monsterId)
if not self.TextSentryRoandMap[monsterId] then
return
end
self.TextSentryRoandMap[monsterId].gameObject:SetActiveEx(false)
end
function XUiRpgMakerGamePlayMain:CheckActionShadowMove(moveEndCb)
local actions = XDataCenter.RpgMakerGameManager.GetActions(XRpgMakerGameConfigs.RpgMakerGameActionType.ActionShadowMove)
local moveEndCb = moveEndCb
if XTool.IsTableEmpty(actions) then
moveEndCb()
return
end
local actionCount = #actions
local onceShadowMoveEndCb = function()
actionCount = actionCount - 1
if actionCount <= 0 then
moveEndCb()
end
end
for _, action in ipairs(actions) do
local shadowObj = XDataCenter.RpgMakerGameManager.GetShadowObj(action.ShadowId)
if not shadowObj then
moveEndCb()
return
end
shadowObj:PlayMoveAction(action, onceShadowMoveEndCb, self:GetMapId())
end
end
function XUiRpgMakerGamePlayMain:PlayActionEndCallback()
self.IsPlayingAction = false
self:Refresh()
end
function XUiRpgMakerGamePlayMain:GameOver(actionType)
local stageId = self:GetStageId()
self.LoseTip:Show(stageId, actionType)
self:PlayAnimation("PanelLoseTipEnable")
if not XDataCenter.RpgMakerGameManager.IsStageClear(stageId) then
self:SetCurrLoseCount(self.CurrLoseCount + 1)
end
end
--手指按下
function XUiRpgMakerGamePlayMain:OnPointerDown(position)
self.StartDownPosition = position
end
--拖拽
function XUiRpgMakerGamePlayMain:OnDrag(position)
if not self:IsCanRequest() then
return
end
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
if not playerObj then
return
end
local endDir = position - self.StartDownPosition
if endDir == Vector3.zero then
return
end
self.IsTriggerDrag = true
local angle = self:GetAngle(endDir)
local direction = self:GetDirectionByAngle(angle)
playerObj:ChangeDirectionAction({Direction = direction})
playerObj:SetMoveDirectionEffectActive(true)
end
--手指松开
function XUiRpgMakerGamePlayMain:OnPointerUp(position)
if not self:IsCanRequest() or not self.IsTriggerDrag then
return
end
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
if playerObj then
playerObj:SetMoveDirectionEffectActive(false)
end
self.IsTriggerDrag = false
local endDir = position - self.StartDownPosition
local angle = self:GetAngle(endDir)
local mapId = self:GetMapId()
local direction = self:GetDirectionByAngle(angle)
XDataCenter.RpgMakerGameManager.RequestRpgMakerGameMapMove(mapId, direction, handler(self, self.Refresh))
end
function XUiRpgMakerGamePlayMain:GetAngle(endDir)
local angle = Vector3.SignedAngle(Vector3Right, endDir, Vector3Forward) --向量转角度,范围:-180度 ~ 180度
angle = angle < 0 and 360 + angle or angle --角度范围转换成0~360度
return (angle + MoveRoleAngleOffset) % 360
end
--根据角度返回对应的方向
function XUiRpgMakerGamePlayMain:GetDirectionByAngle(angle)
local direction
if angle >= 315 or angle < 45 then
direction = XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveRight
elseif angle >= 45 and angle < 135 then
direction = XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveUp
elseif angle >= 135 and angle < 225 then
direction = XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveLeft
elseif angle >= 225 and angle < 315 then
direction = XRpgMakerGameConfigs.RpgMakerGameMoveDirection.MoveDown
end
return direction
end
--重置
function XUiRpgMakerGamePlayMain:OnBtnResetClick()
if not self:IsCanRequest() then
return false
end
local curCount = XDataCenter.RpgMakerGameManager.GetCurrentCount()
if XTool.IsNumberValid(curCount) then
self:SetCurrResetCount(self.CurrResetCount + 1)
end
local mapId = self:GetMapId()
local cb = function()
self.IsPlayingAction = false
self.RpgMakerGamePlayScene:Reset()
self:SetIsWin(false)
self:Refresh()
end
XDataCenter.RpgMakerGameManager.RequestRpgMakerGameMapResetGame(mapId, cb)
return true
end
function XUiRpgMakerGamePlayMain:OnBtnBackoffClick()
if not self:IsCanRequest() then
return
end
self:PlayBackoffEffect()
local mapId = self:GetMapId()
local cb = function(currentRound)
self:SetCurrUseBackCount(self.CurrUseBackCount + 1)
self.RpgMakerGamePlayScene:BackUp(currentRound)
self.RpgMakerGamePlayScene:CheckGrowActive(currentRound)
self:Refresh()
end
XDataCenter.RpgMakerGameManager.RequestRpgMakerGameMapBackUp(mapId, cb)
end
function XUiRpgMakerGamePlayMain:OnBtnCloseClick()
local sureCallback = function()
self:Close()
end
XUiManager.DialogTip(CSXTextManagerGetText("TipTitle"), CSXTextManagerGetText("RpgMakerGamePlayMainQuickTipsDesc"), nil, nil, sureCallback)
end
--所有动作播完才能发协议
function XUiRpgMakerGamePlayMain:IsCanRequest()
if not XDataCenter.RpgMakerGameManager.IsActionsEmpty() or self.IsPlayingAction or self.IsPlayingBackoffEffect or self.IsGuideing then
return false
end
return true
end
--------------------------提示相关 begin---------------------------
--确定弹出第二提示窗口
function XUiRpgMakerGamePlayMain:OnBtnYesClick()
self:SetContentAddBtn(false)
self.PanelAddBtnTwo:Show(self:GetStageId())
end
--取消使用提示
function XUiRpgMakerGamePlayMain:OnBtnNoClick()
self:SetContentAddBtn(false)
self:CheckIconChatActive()
self:StartCheckShowHintTimer()
end
function XUiRpgMakerGamePlayMain:OnBtnHeadClick()
self:SetContentAddBtn(true)
self:SetIconChatActive(false)
self:SetContentActive(false)
self:StartCheckShowHintTimer(true)
end
--延迟一段时间显示随机提示语
function XUiRpgMakerGamePlayMain:StartCheckShowHintTimer(isStopShowRandomHint)
self:StopCheckShowHintTimer()
self:StopRandomDialogBoxDurationTimer()
if isStopShowRandomHint or self:IsShowHintDialog() then
return
end
local duration = RandomDialogBoxIntervalSecond
self.CheckShowHintTimer = XScheduleManager.ScheduleForever(function()
duration = duration - 1
if duration <= 0 then
self:StopCheckShowHintTimer()
self:ShowRandomHintDialog()
end
end, XScheduleManager.SECOND)
end
function XUiRpgMakerGamePlayMain:StopCheckShowHintTimer()
if self.CheckShowHintTimer then
XScheduleManager.UnSchedule(self.CheckShowHintTimer)
self.CheckShowHintTimer = nil
end
end
function XUiRpgMakerGamePlayMain:ShowRandomHintDialog()
if XTool.UObjIsNil(self.GameObject) then
return
end
local id = XDataCenter.RpgMakerGameManager.GetRandomDialogBoxId()
local text = XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxText(id)
self.TextHint.text = text
self:SetContentActive(true)
self:StartRandomDialogBoxDurationTimer(id)
end
function XUiRpgMakerGamePlayMain:ShowHintDialog()
local stageId = self:GetStageId()
local text = XRpgMakerGameConfigs.GetRpgMakerGameHintDialogBoxText(stageId)
self.TextHint.text = text
self:SetContentActive(true)
end
function XUiRpgMakerGamePlayMain:SetContentAddBtn(isActive)
self.ContentAddBtn.gameObject:SetActiveEx(isActive)
end
function XUiRpgMakerGamePlayMain:SetContentActive(isActive)
self.Content.gameObject:SetActiveEx(isActive)
if isActive then
self.ContentDynamicGrid:SetAllLayoutDirty()
end
end
function XUiRpgMakerGamePlayMain:SetIconChatActive(isActive)
self.IconChat.gameObject:SetActiveEx(isActive)
end
--显示一段时间的随机提示语
function XUiRpgMakerGamePlayMain:StartRandomDialogBoxDurationTimer(randomdialogBoxId)
self:StopRandomDialogBoxDurationTimer()
local duration = randomdialogBoxId and XRpgMakerGameConfigs.GetRpgMakerGameRandomDialogBoxDuration(randomdialogBoxId) or RandomDialogBoxIntervalSecond
self.RandomDialogBoxDurationTimer = XScheduleManager.ScheduleForever(function()
duration = duration - 1
if duration <= 0 then
self:CheckIconChatActive()
self:SetContentActive(false)
self:StartCheckShowHintTimer()
end
end, XScheduleManager.SECOND)
end
function XUiRpgMakerGamePlayMain:StopRandomDialogBoxDurationTimer()
if self.RandomDialogBoxDurationTimer then
XScheduleManager.UnSchedule(self.RandomDialogBoxDurationTimer)
self.RandomDialogBoxDurationTimer = nil
end
end
--是否停止随机对话,显示通关路线对话
function XUiRpgMakerGamePlayMain:IsShowHintDialog()
local stageId = self:GetStageId()
--使用后退达到指定次数
local currUseBackCount = self:GetCurrUseBackCount()
local backCount = XRpgMakerGameConfigs.GetRpgMakerGameHintDialogBoxBackCount(stageId)
if currUseBackCount >= backCount then
return true
end
--使用重置达到指定次数
local currResetCount = self:GetCurrResetCount()
local resetCount = XRpgMakerGameConfigs.GetRpgMakerGameHintDialogBoxResetCount(stageId)
if currResetCount >= resetCount then
return true
end
--累计失败达到指定次数
local currLoseCount = self:GetCurrLoseCount()
local totalLoseCount = XRpgMakerGameConfigs.GetRpgMakerGameHintDialogBoxTotalLoseCount(stageId)
if currLoseCount >= totalLoseCount then
return true
end
return false
end
function XUiRpgMakerGamePlayMain:SetCurrUseBackCount(currUseBackCount)
self.CurrUseBackCount = currUseBackCount
end
function XUiRpgMakerGamePlayMain:GetCurrUseBackCount()
return self.CurrUseBackCount
end
function XUiRpgMakerGamePlayMain:CheckIconChatActive()
local isShowHintDialog = self:IsShowHintDialog()
self:SetIconChatActive(isShowHintDialog)
end
function XUiRpgMakerGamePlayMain:SetCurrResetCount(currResetCount)
self.CurrResetCount = currResetCount
end
function XUiRpgMakerGamePlayMain:GetCurrResetCount()
return self.CurrResetCount
end
function XUiRpgMakerGamePlayMain:SetCurrLoseCount(currLoseCount)
self.CurrLoseCount = currLoseCount
end
function XUiRpgMakerGamePlayMain:GetCurrLoseCount()
return self.CurrLoseCount
end
--定时切换下方提示语
function XUiRpgMakerGamePlayMain:StartDownHintTimer()
self:StopDownHintTimer()
local duration = DownHintStayTime
local maxCount = XRpgMakerGameConfigs.GetRpgMakerGamePlayMainDownHintConfigMaxCount()
local curId = 1
local desc = XRpgMakerGameConfigs.GetRpgMakerGamePlayMainDownHintText(curId)
self.TipText.text = desc
self.DownHintTimer = XScheduleManager.ScheduleForever(function()
duration = duration - 1
if duration <= 0 then
duration = DownHintStayTime
desc = XRpgMakerGameConfigs.GetRpgMakerGamePlayMainDownHintText(curId)
curId = curId + 1 > maxCount and 1 or curId + 1
self.TipText.text = desc
end
end, XScheduleManager.SECOND)
end
function XUiRpgMakerGamePlayMain:StopDownHintTimer()
if self.DownHintTimer then
XScheduleManager.UnSchedule(self.DownHintTimer)
self.DownHintTimer = nil
end
end
--点击场景对象显示介绍提示窗
function XUiRpgMakerGamePlayMain:ShowObjectTips(modelKey, modelName)
self.DetailTip:Show(modelKey, modelName)
end
--------------------------提示相关 end---------------------------
function XUiRpgMakerGamePlayMain:GetStageId()
local enterStageDb = XDataCenter.RpgMakerGameManager:GetRpgMakerGameEnterStageDb()
return enterStageDb:GetStageId()
end
function XUiRpgMakerGamePlayMain:GetSelectRoleId()
local enterStageDb = XDataCenter.RpgMakerGameManager:GetRpgMakerGameEnterStageDb()
return enterStageDb:GetSelectRoleId()
end
function XUiRpgMakerGamePlayMain:GetMapId()
local enterStageDb = XDataCenter.RpgMakerGameManager:GetRpgMakerGameEnterStageDb()
return enterStageDb:GetMapId()
end
function XUiRpgMakerGamePlayMain:SetIsWin(isWin)
self.IsWin = isWin
end
function XUiRpgMakerGamePlayMain:GetIsWin()
return self.IsWin
end
function XUiRpgMakerGamePlayMain:PlayBackoffEffect()
if XTool.UObjIsNil(self.UiCameraEffectStart) then
return
end
self.IsPlayingBackoffEffect = true
self.UiCameraEffectStart.gameObject:SetActiveEx(false)
self.UiCameraEffectStart.gameObject:SetActiveEx(true)
local time = CS.XGame.ClientConfig:GetInt("RpgMakerPlayScreenPlayUiCameraEffectTime")
XScheduleManager.ScheduleOnce(function()
if XTool.UObjIsNil(self.UiCameraEffectStart) then
self.UiCameraEffectStart.gameObject:SetActiveEx(false)
return
end
self.IsPlayingBackoffEffect = false
end, time)
end
----------------------引导相关 begin-----------------------
function XUiRpgMakerGamePlayMain:InitGuide()
local offsetY = 50
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
local modelPosotion = playerObj and playerObj:GetGameObjPosition()
local localPosition = modelPosotion and self:WorldToUILocaPosition(modelPosotion)
if localPosition then
localPosition.y = localPosition.y + offsetY
end
--设置按钮到角色模型所在的位置
if self.BtnGuideRoleClick and localPosition then
self.BtnGuideRoleClick.transform.localPosition = localPosition
end
if self.BtnGuideRoadClick and localPosition then
self.BtnGuideRoadClick.transform.localPosition = localPosition
end
--设置按钮到终点所在的位置
local endPointObj = XDataCenter.RpgMakerGameManager.GetEndPointObj()
modelPosotion = endPointObj and endPointObj:GetGameObjPosition()
localPosition = modelPosotion and self:WorldToUILocaPosition(modelPosotion)
if self.BtnGuideEndPointClick and localPosition then
self.BtnGuideEndPointClick.transform.localPosition = localPosition
end
--设置按钮到怪物所在的位置
local mapId = self:GetMapId()
local monsterIdList = XRpgMakerGameConfigs.GetRpgMakerGameMapIdToMonsterIdList(mapId)
local monsterId = monsterIdList[1]
local monsterObj = XDataCenter.RpgMakerGameManager.GetMonsterObj(monsterId)
modelPosotion = monsterObj and monsterObj:GetGameObjPosition()
localPosition = modelPosotion and self:WorldToUILocaPosition(modelPosotion)
if localPosition then
localPosition.y = localPosition.y + offsetY
end
if self.BtnGuideMonsterClick and localPosition then
self.BtnGuideMonsterClick.transform.localPosition = localPosition
end
end
function XUiRpgMakerGamePlayMain:OnBtnGuideRoleClick()
self.IsGuideing = true
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
if not playerObj then
return
end
playerObj:ChangeDirectionAction({Direction = XRpgMakerGameConfigs.GetActivityGuideMoveDirection()})
playerObj:SetMoveDirectionEffectActive(true)
end
function XUiRpgMakerGamePlayMain:OnBtnGuideRoadClick()
self.IsGuideing = false
local playerObj = XDataCenter.RpgMakerGameManager.GetPlayerObj()
if playerObj then
playerObj:SetMoveDirectionEffectActive(false)
end
local mapId = self:GetMapId()
local direction = XRpgMakerGameConfigs.GetActivityGuideMoveDirection()
XDataCenter.RpgMakerGameManager.RequestRpgMakerGameMapMove(mapId, direction, handler(self, self.Refresh))
end
--世界坐标-> UGUI坐标
function XUiRpgMakerGamePlayMain:WorldToUILocaPosition(modelPosotion)
local sceneCamera = self.RpgMakerGamePlayScene:GetSceneCamera()
local viewportPos = sceneCamera:WorldToViewportPoint(modelPosotion)
local realScreenWidth = CsXUiManager.RealScreenWidth
local realScreenHeight = CsXUiManager.RealScreenHeight
return CS.UnityEngine.Vector3((viewportPos.x - 0.5) * realScreenWidth, (viewportPos.y - 0.5) * realScreenHeight, 0)
end
----------------------引导相关 end-----------------------