forked from endernon/PGRData
201 lines
No EOL
6.2 KiB
Lua
201 lines
No EOL
6.2 KiB
Lua
local CsTime = CS.UnityEngine.Time
|
||
|
||
local LOCK_COUNT = 3 --密码锁数量,1是最内层的锁
|
||
local ANGLE = 45 --每个锁之间的角度
|
||
local OriginCenterX = CS.XResolutionManager.OriginWidth / 2
|
||
local OriginCenterY = CS.XResolutionManager.OriginHeight / 2
|
||
local OriginCenter = Vector2(OriginCenterX, OriginCenterY)
|
||
local AUTO_ROTATE_SPEED = 100
|
||
|
||
--旋转方向
|
||
local RotateDirection = {
|
||
Clockwise = -1, --顺时针
|
||
AntiClockwise = 1 --逆时针
|
||
}
|
||
|
||
|
||
local XUiPanelDisc = XClass(nil, "XUiPanelDisc")
|
||
|
||
function XUiPanelDisc:Ctor(circleGoInputHandler, circle, parent, index)
|
||
self.Index = index
|
||
self.Circle = circle
|
||
self.Parent = parent
|
||
circleGoInputHandler:AddBeginDragListener(function(eventData) self:OnBeginDrag(eventData) end)
|
||
circleGoInputHandler:AddDragListener(function(eventData) self:OnDrag(eventData) end)
|
||
circleGoInputHandler:AddEndDragListener(function(eventData) self:OnEndDrag(eventData) end)
|
||
end
|
||
|
||
function XUiPanelDisc:Init()
|
||
self.Circle.transform.eulerAngles = Vector3.zero
|
||
self:SetCurSlot(0)
|
||
self:ResetAutoData()
|
||
end
|
||
|
||
function XUiPanelDisc:ResetAutoData()
|
||
self.CurAutoRotateAngleZ = 0
|
||
self.DifferAngleZ = 0
|
||
self.IsAutoRotate = false
|
||
self.CurPlaySoundAngle = 0
|
||
end
|
||
|
||
function XUiPanelDisc:OnBeginDrag(eventData)
|
||
if self.Parent:GetIsPass() then
|
||
return
|
||
end
|
||
self.StartPosition = eventData.position
|
||
self.StartDir = self.StartPosition - OriginCenter --某一点到中心的向量
|
||
self.StartAngleZ = self.Circle.transform.eulerAngles.z
|
||
self.LastEulerAngleZ = self.StartAngleZ
|
||
self:SetCurSlot(0)
|
||
self:ResetAutoData()
|
||
end
|
||
|
||
function XUiPanelDisc:OnDrag(eventData)
|
||
if self.Parent:GetIsPass() then
|
||
return
|
||
end
|
||
|
||
local eventPos = eventData.position - OriginCenter
|
||
local angle = Vector2.SignedAngle(self.StartDir, eventPos)
|
||
self.Circle.transform.eulerAngles = Vector3(0, 0, self.StartAngleZ + angle)
|
||
|
||
--每有一个格位的转动播放音效
|
||
local curPlaySoundAngle = math.abs(self.CurPlaySoundAngle + angle)
|
||
if curPlaySoundAngle >= ANGLE then
|
||
self:PlaySound()
|
||
self.CurPlaySoundAngle = -angle
|
||
end
|
||
|
||
--缓存当前旋转方向
|
||
self.AutoRotateDirection = angle < self.LastEulerAngleZ and RotateDirection.Clockwise or RotateDirection.AntiClockwise
|
||
self.LastEulerAngleZ = angle
|
||
end
|
||
|
||
function XUiPanelDisc:OnEndDrag(eventData)
|
||
if self.Parent:GetIsPass() then
|
||
return
|
||
end
|
||
local curAngle = self.Circle.transform.eulerAngles
|
||
local curAngleZ = curAngle.z
|
||
self.CurAngleZ = curAngleZ
|
||
self.DifferAngleZ = curAngleZ % ANGLE
|
||
|
||
if self.AutoRotateDirection == RotateDirection.AntiClockwise then
|
||
self.DifferAngleZ = ANGLE - self.DifferAngleZ
|
||
end
|
||
self.IsAutoRotate = true
|
||
end
|
||
|
||
function XUiPanelDisc:RefreshCurSlot()
|
||
local curAngleZ = math.floor(self.Circle.transform.eulerAngles.z)
|
||
curAngleZ = curAngleZ < 360 and curAngleZ or curAngleZ % 360
|
||
self:SetCurSlot(math.floor(curAngleZ / ANGLE) + 1)
|
||
end
|
||
|
||
function XUiPanelDisc:SetCurSlot(slot)
|
||
self.CurSlot = slot
|
||
end
|
||
|
||
function XUiPanelDisc:IsUnlock()
|
||
return self.CurSlot == self.Parent:GetUnlockSlot(self.Index)
|
||
end
|
||
|
||
function XUiPanelDisc:Update()
|
||
if not self.IsAutoRotate then
|
||
return
|
||
end
|
||
|
||
self.CurAutoRotateAngleZ = math.min(self.CurAutoRotateAngleZ + CsTime.deltaTime * AUTO_ROTATE_SPEED, self.DifferAngleZ)
|
||
local curAngle = self.Circle.transform.eulerAngles
|
||
self.Circle.transform.eulerAngles = Vector3(curAngle.x, curAngle.y, self.CurAngleZ + self.CurAutoRotateAngleZ * self.AutoRotateDirection)
|
||
|
||
if self.CurAutoRotateAngleZ == self.DifferAngleZ then
|
||
self:ResetAutoData()
|
||
self:PlaySound()
|
||
self:RefreshCurSlot()
|
||
self.Parent:CheckGame()
|
||
end
|
||
end
|
||
|
||
function XUiPanelDisc:PlaySound()
|
||
XSoundManager.PlaySoundByType(XSoundManager.UiBasicsMusic.FightMovieBagua, XSoundManager.SoundType.Sound)
|
||
end
|
||
|
||
|
||
--八卦转盘密码锁界面
|
||
local XUiFightMovieBagua = XLuaUiManager.Register(XLuaUi, "UiFightMovieBagua")
|
||
|
||
function XUiFightMovieBagua:OnAwake()
|
||
self:RegisterClickEvent(self.BtnTanchuangCloseBig, self.OnClose)
|
||
self.PanelDiscList = {}
|
||
for i = 1, LOCK_COUNT do
|
||
self.PanelDiscList[i] = XUiPanelDisc.New(self["CircleGoInputHandler" .. i], self["Circle" .. i], self, i)
|
||
end
|
||
end
|
||
|
||
function XUiFightMovieBagua:OnEnable()
|
||
self.AnimationEnable.gameObject:SetActiveEx(true)
|
||
self:PlayAnimation("AnimationEnable", function()
|
||
self.AnimationEnable.gameObject:SetActiveEx(false)
|
||
end)
|
||
self.Timer = XScheduleManager.ScheduleForeverEx(handler(self, self.Update), 0, 0)
|
||
for _, panelRight in ipairs(self.PanelDiscList) do
|
||
panelRight:Init()
|
||
end
|
||
self.PanelRight.gameObject:SetActiveEx(false)
|
||
self.IsPass = false
|
||
end
|
||
|
||
function XUiFightMovieBagua:OnDisable()
|
||
if self.Timer then
|
||
XScheduleManager.UnSchedule(self.Timer)
|
||
self.Timer = nil
|
||
end
|
||
end
|
||
|
||
--CSCallLua
|
||
function XUiFightMovieBagua:Init(id)
|
||
self.UnlockSlots = {}
|
||
for index = 1, LOCK_COUNT do
|
||
self.UnlockSlots[index] = XFightPasswordConfigs.GetCorrectPassword(id, index)
|
||
end
|
||
end
|
||
|
||
function XUiFightMovieBagua:GetUnlockSlot(index)
|
||
return self.UnlockSlots[index]
|
||
end
|
||
|
||
function XUiFightMovieBagua:Update()
|
||
for _, panelDisc in ipairs(self.PanelDiscList) do
|
||
panelDisc:Update()
|
||
end
|
||
end
|
||
|
||
function XUiFightMovieBagua:CheckGame()
|
||
for _, panelDisc in ipairs(self.PanelDiscList) do
|
||
if not panelDisc:IsUnlock() then
|
||
return
|
||
end
|
||
end
|
||
|
||
self.IsPass = true
|
||
self.PanelRight.gameObject:SetActiveEx(true)
|
||
local fight = CS.XFight.Instance
|
||
if fight then
|
||
fight.InputControl:OnClick(CS.XNpcOperationClickKey.CommonMiniGameWin, CS.XOperationClickType.KeyDown)
|
||
fight.InputControl:OnClick(CS.XNpcOperationClickKey.CommonMiniGameWin, CS.XOperationClickType.KeyUp)
|
||
end
|
||
end
|
||
|
||
function XUiFightMovieBagua:GetIsPass()
|
||
return self.IsPass
|
||
end
|
||
|
||
function XUiFightMovieBagua:OnClose()
|
||
local fight = CS.XFight.Instance
|
||
if fight then
|
||
fight.InputControl:OnClick(CS.XNpcOperationClickKey.CommonUiClose, CS.XOperationClickType.KeyDown)
|
||
fight.InputControl:OnClick(CS.XNpcOperationClickKey.CommonUiClose, CS.XOperationClickType.KeyUp)
|
||
end
|
||
self:Close()
|
||
end |