334 lines
No EOL
13 KiB
Lua
334 lines
No EOL
13 KiB
Lua
local XUiPanelFurnitureLike = require("XUi/XUiDormSecond/XUiPanelFurnitureLike")
|
|
local XUiDormCaress = XClass(XLuaBehaviour, "XUiDormCaress")
|
|
|
|
function XUiDormCaress:Ctor(uiRoot, ui)
|
|
self.GameObject = ui.gameObject
|
|
self.Transform = ui.transform
|
|
self.UiRoot = uiRoot
|
|
self.OnBtnBackClickCb = function() self:OnBtnBackClick() end
|
|
|
|
XTool.InitUiObject(self)
|
|
self:RefreshData()
|
|
self:InitAddListen()
|
|
self:InitTabGroup()
|
|
|
|
self.FurnitureLike = XUiPanelFurnitureLike.New(uiRoot, self.PanelFurnitureLike)
|
|
end
|
|
|
|
function XUiDormCaress:InitAddListen()
|
|
self.UiRoot:RegisterClickEvent(self.BtnBack, self.OnBtnBackClickCb)
|
|
end
|
|
|
|
function XUiDormCaress:OnBtnBackClick()
|
|
self.UiRoot:OnCloseedCaress()
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_HIDE)
|
|
XDataCenter.DormManager.SetInTouch(false)
|
|
XDataCenter.DormManager.GetNextShowEvent()
|
|
end
|
|
|
|
function XUiDormCaress:InitTabGroup()
|
|
self.BtnList = {}
|
|
table.insert(self.BtnList, self.BtnCaress)
|
|
table.insert(self.BtnList, self.BtnGun)
|
|
table.insert(self.BtnList, self.BtnPlay)
|
|
|
|
self.PanelParticularCaressGroup:Init(self.BtnList, function(index)
|
|
self.CurTouchState = index
|
|
end)
|
|
end
|
|
|
|
function XUiDormCaress:Show(characterId, curRoomId)
|
|
self.IsTouchCD = false
|
|
self:RefreshData()
|
|
self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchDesc")
|
|
|
|
self.CharacterId = characterId
|
|
self.Camera = XHomeSceneManager.GetSceneCamera()
|
|
self.CurSelectCharacter = XHomeCharManager.GetSelectCharacter()
|
|
self.FurnitureLike:Refresh(characterId, curRoomId)
|
|
self.FurnitureLike.GameObject:SetActiveEx(true)
|
|
|
|
-- 设置默认开启
|
|
self.PanelParticularCaressGroup:SelectIndex(XDormConfig.TouchState.Touch)
|
|
-- 拉近摄像头
|
|
local cameraController = XHomeSceneManager.GetSceneCameraController()
|
|
self.TargetAngleX = cameraController.TargetAngleX
|
|
self.TargetAngleY = cameraController.TargetAngleY
|
|
self.MinDistance = cameraController.MinDistance
|
|
self.Distance = cameraController.Distance
|
|
self.AllowZoom = cameraController.AllowZoom
|
|
|
|
if not XTool.UObjIsNil(cameraController) then
|
|
cameraController:SetWorldOffset(CS.UnityEngine.Vector2(0, -0.39))
|
|
cameraController:SetTartAngle(CS.UnityEngine.Vector2(self.CurSelectCharacter.Transform.eulerAngles.y - 180, 10))
|
|
cameraController:SetMinDistance(XDormConfig.DRAFT_DIS)
|
|
XCameraHelper.SetCameraTarget(cameraController, self.CurSelectCharacter.Transform, XDormConfig.DRAFT_DIS)
|
|
CS.XDofManager.Instance:SetDormitoryDof(self.CurSelectCharacter.Transform)
|
|
cameraController.AllowZoom = false
|
|
end
|
|
|
|
self:ReqFondleData()
|
|
XEventManager.DispatchEvent(XEventId.EVENT_CARESS_SHOW)
|
|
end
|
|
|
|
function XUiDormCaress:ReqFondleData()
|
|
self:RemoveTimer()
|
|
|
|
XDataCenter.DormManager.GetDormFondleData(self.CharacterId, function(fondleData)
|
|
self.FondleConfig = XDormConfig.GetCharacterFondleByCharId(self.CharacterId)
|
|
self.FondleData = fondleData
|
|
|
|
self:SetRecoveryInfo(fondleData.LeftCount, fondleData.LastRecoveryTime)
|
|
self.PanelParticularCaress.gameObject:SetActiveEx(true)
|
|
end)
|
|
end
|
|
|
|
function XUiDormCaress:SetRecoveryInfo(leftCount, recoveryTime)
|
|
self.PanelTimeOut.gameObject:SetActiveEx(leftCount < self.FondleConfig.MaxCount)
|
|
self.TxtTouchCount.text = CS.XTextManager.GetText("DormFondleCount", leftCount, self.FondleConfig.MaxCount)
|
|
|
|
if leftCount >= self.FondleConfig.MaxCount then
|
|
return
|
|
end
|
|
|
|
local now = XTime.GetServerNowTimestamp()
|
|
local leftTime = recoveryTime + self.FondleConfig.RecoveryTime - now
|
|
local timeString = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.CHALLENGE)
|
|
self.TxtTimeOut.text = CS.XTextManager.GetText("DormFondleRecovey", timeString)
|
|
self:RemoveTimer()--临时处理防止定时器注销失败问题
|
|
self.TimerId = XScheduleManager.ScheduleForever(function()
|
|
if XTool.UObjIsNil(self.Transform) or not self.GameObject.activeSelf then
|
|
return
|
|
end
|
|
|
|
leftTime = leftTime - 1
|
|
if leftTime <= 0 then
|
|
self:ReqFondleData()
|
|
return
|
|
end
|
|
|
|
timeString = XUiHelper.GetTime(leftTime, XUiHelper.TimeFormatType.CHALLENGE)
|
|
self.TxtTimeOut.text = CS.XTextManager.GetText("DormFondleRecovey", timeString)
|
|
end, 1000)
|
|
end
|
|
|
|
function XUiDormCaress:RemoveTimer()
|
|
if self.TimerId then
|
|
XScheduleManager.UnSchedule(self.TimerId)
|
|
self.TimerId = nil
|
|
end
|
|
end
|
|
|
|
function XUiDormCaress:RemoveAnimaTimer()
|
|
if self.AnimaTimer then
|
|
XScheduleManager.UnSchedule(self.AnimaTimer)
|
|
self.AnimaTimer = nil
|
|
end
|
|
end
|
|
|
|
function XUiDormCaress:OnClose(curDormId)
|
|
self.FondleData = {}
|
|
self:RemoveTimer()
|
|
self:RemoveAnimaTimer()
|
|
self:RefreshData()
|
|
self.PanelParticularCaress.gameObject:SetActiveEx(false)
|
|
|
|
-- 拉远摄像头
|
|
local cameraController = XHomeSceneManager.GetSceneCameraController()
|
|
if not XTool.UObjIsNil(cameraController) then
|
|
cameraController:SetWorldOffset(CS.UnityEngine.Vector2(0, 0))
|
|
cameraController:SetTartAngle(CS.UnityEngine.Vector2(self.TargetAngleX, self.TargetAngleY))
|
|
local curDormTransform = XHomeDormManager.GetRoom(curDormId).Transform
|
|
cameraController:SetMinDistance(self.MinDistance)
|
|
XCameraHelper.SetCameraTarget(cameraController, curDormTransform, self.Distance)
|
|
CS.XDofManager.Instance:SetDormitoryDof(nil)
|
|
cameraController.AllowZoom = self.AllowZoom
|
|
end
|
|
end
|
|
|
|
function XUiDormCaress:Update()
|
|
if XTool.UObjIsNil(self.Transform) or not self.GameObject.activeSelf then
|
|
return
|
|
end
|
|
|
|
local point = self:GetPisont()
|
|
if not XTool.UObjIsNil(self.Camera) and point then
|
|
local ray = self.Camera:ScreenPointToRay(point)
|
|
local layerMask = CS.UnityEngine.LayerMask.GetMask("HomeCharacter")
|
|
if layerMask then
|
|
local rect, hit = ray:RayCast(layerMask)
|
|
if rect and hit and self.CurSelectCharacter.Transform == hit.transform.parent.transform then
|
|
if not self:JudgeLeftCount() then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hate, self.CharacterId, nil)
|
|
end
|
|
|
|
self:UpdateFondleInfo(point)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function XUiDormCaress:GetPisont()
|
|
local screenPoint
|
|
|
|
local platform = CS.UnityEngine.Application.platform
|
|
local runtimePlatform = CS.UnityEngine.RuntimePlatform
|
|
|
|
if platform == runtimePlatform.WindowsEditor or platform == runtimePlatform.WindowsPlayer then
|
|
if self.CurTouchState == XDormConfig.TouchState.WaterGun then
|
|
if CS.UnityEngine.Input.GetMouseButtonDown(0) then
|
|
screenPoint = CS.UnityEngine.Vector3(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y, 0)
|
|
elseif CS.UnityEngine.Input.GetMouseButtonUp(0) then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil)
|
|
end
|
|
else
|
|
if CS.UnityEngine.Input.GetMouseButtonDown(0) then
|
|
self:RefreshData()
|
|
elseif CS.UnityEngine.Input.GetMouseButtonUp(0) then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil)
|
|
end
|
|
|
|
if CS.UnityEngine.Input.GetMouseButton(0) then
|
|
screenPoint = CS.UnityEngine.Vector3(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y, 0)
|
|
end
|
|
end
|
|
else
|
|
if CS.UnityEngine.Input.touchCount > 0 then
|
|
if self.CurTouchState == XDormConfig.TouchState.WaterGun then
|
|
if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Began then
|
|
local p = CS.UnityEngine.Input.GetTouch(0).position
|
|
screenPoint = CS.UnityEngine.Vector3(p.x, p.y, 0)
|
|
elseif CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Ended then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil)
|
|
end
|
|
else
|
|
if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Began then
|
|
self:RefreshData()
|
|
elseif CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Ended then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Hide, self.CharacterId, nil)
|
|
end
|
|
|
|
if CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Stationary or
|
|
CS.UnityEngine.Input.GetTouch(0).phase == CS.UnityEngine.TouchPhase.Moved then
|
|
local p = CS.UnityEngine.Input.GetTouch(0).position
|
|
screenPoint = CS.UnityEngine.Vector3(p.x, p.y, 0)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
return screenPoint
|
|
end
|
|
|
|
function XUiDormCaress:RefreshData()
|
|
self.TouchLength = 0
|
|
self.PlayTime = 0
|
|
self.LastPoint = nil
|
|
self.PlayTimer = 0
|
|
end
|
|
|
|
-- 每帧更新爱抚滑动详情
|
|
function XUiDormCaress:UpdateFondleInfo(point)
|
|
if self.CurTouchState == XDormConfig.TouchState.Touch then
|
|
-- 判断是否还有次数
|
|
if not self:JudgeLeftCount() then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.TouchHate, self.CharacterId, point)
|
|
return
|
|
end
|
|
|
|
-- 判断是否在CD中
|
|
if self.IsTouchCD then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.Touch, self.CharacterId, point)
|
|
return
|
|
end
|
|
|
|
if self.LastPoint then
|
|
local dis = (self.LastPoint - point).sqrMagnitude
|
|
self.TouchLength = self.TouchLength + dis
|
|
end
|
|
self.LastPoint = point
|
|
|
|
-- 判断前置长度
|
|
local propLength = XDormConfig.TOUCH_LENGTH * XDormConfig.TOUCH_PROP
|
|
local propNum = self.TouchLength / XDormConfig.TOUCH_LENGTH
|
|
if propNum < 0 then
|
|
propNum = 0
|
|
elseif propNum > 1 then
|
|
propNum = 1
|
|
end
|
|
|
|
if self.TouchLength < propLength then
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW_VIEW, XDormConfig.TouchState.Touch, self.CharacterId, point, propNum)
|
|
return
|
|
end
|
|
|
|
-- 达到长度请求抚摸
|
|
if self.TouchLength >= XDormConfig.TOUCH_LENGTH then
|
|
self:RefreshData()
|
|
self:ReqFondle()
|
|
end
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Touch, self.CharacterId, point, propNum)
|
|
elseif self.CurTouchState == XDormConfig.TouchState.WaterGun then
|
|
self:ReqFondle()
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.WaterGun, self.CharacterId, point)
|
|
elseif self.CurTouchState == XDormConfig.TouchState.Play then
|
|
self.PlayTimer = self.PlayTimer + CS.UnityEngine.Time.deltaTime
|
|
if self.PlayTimer >= XDormConfig.PLAY_TIME then
|
|
self:RefreshData()
|
|
self:ReqFondle()
|
|
end
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, XDormConfig.TouchState.Play, self.CharacterId, point)
|
|
end
|
|
end
|
|
|
|
-- 请求爱抚
|
|
function XUiDormCaress:ReqFondle()
|
|
-- 次数不足
|
|
if self.FondleData.LeftCount <= 0 then
|
|
return
|
|
end
|
|
|
|
XDataCenter.DormManager.DoFondleReq(self.CharacterId, self.CurTouchState, function()
|
|
local state = XDormConfig.TouchState.Hide
|
|
if self.CurTouchState == XDormConfig.TouchState.Touch then
|
|
state = XDormConfig.TouchState.TouchSuccess
|
|
elseif self.CurTouchState == XDormConfig.TouchState.WaterGun then
|
|
state = XDormConfig.TouchState.WaterGunSuccess
|
|
elseif self.CurTouchState == XDormConfig.TouchState.Play then
|
|
state = XDormConfig.TouchState.PlaySuccess
|
|
end
|
|
|
|
if self.CurTouchState == XDormConfig.TouchState.Touch then
|
|
self.IsTouchCD = true
|
|
local time = XDormConfig.TOUCH_CD
|
|
|
|
self.AnimaTimer = XUiHelper.Tween(time, function(f)
|
|
if not self.GameObject.activeSelf or XTool.UObjIsNil(self.Transform) then
|
|
return
|
|
end
|
|
|
|
local timeStr = string.format("%.1f", time - f * time)
|
|
self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchTimeOut", timeStr)
|
|
end, function()
|
|
self:RemoveAnimaTimer()
|
|
self.IsTouchCD = false
|
|
self.TxtTouchDesc.text = CS.XTextManager.GetText("DormTouchDesc")
|
|
end)
|
|
end
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DORM_TOUCH_SHOW, state, self.CharacterId, nil)
|
|
self:ReqFondleData()
|
|
end)
|
|
end
|
|
|
|
-- 判断是否还有次数
|
|
function XUiDormCaress:JudgeLeftCount()
|
|
if self.FondleData and self.FondleData.LeftCount then
|
|
return self.FondleData.LeftCount > 0
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
return XUiDormCaress |