local tableInsert = table.insert local UICamera = CS.XUiManager.Instance.UiCamera local XUiCoupletRollPanel = XClass(nil, "XUiCoupletRollPanel") -- local XUiGridWordImage = require("XUi/XUiCoupletGame/XUiGridWordImage") local XUiGridWordItem = require("XUi/XUiCoupletGame/XUiGridWordItem") function XUiCoupletRollPanel:Ctor(rootUi, ui) self.GameObject = ui.gameObject self.Transform = ui.transform self.RectTransform = ui self.RootUi = rootUi XTool.InitUiObject(self) self:Init() end function XUiCoupletRollPanel:Init() self.WordMoveLimitX = (self.PanelRightRoll.rect.width - self.DragWordItem.transform.rect.width)/2 self.WordMoveLimitY = (self.PanelRightRoll.rect.height - self.DragWordItem.transform.rect.height)/2 self.CoupletWords = {} self.TopWordImagePool = {} self.DownWordImagePool = {} self.TopWordItemPool = {} self.DownWordItemPool = {} self.DragItem = nil self.CurDragWordIndex = 0 end function XUiCoupletRollPanel:Refresh(coupletId, isSelfChanged) self.CurCoupletId = coupletId self:RefreshUpWords(coupletId) self:RefreshDownWords(coupletId, isSelfChanged) end function XUiCoupletRollPanel:RefreshUpWords(coupletId) -- local upWords = XCoupletGameConfigs.GetCoupletUpWordsId(coupletId) -- local halfCount = #upWords / 2 -- local _, remainder = math.modf(halfCount) -- if remainder > 0 then -- halfCount = math.ceil(halfCount) -- end -- local topDatas = {} -- local downDatas = {} -- for index, wordId in ipairs(upWords) do -- if index <= halfCount then -- tableInsert(topDatas, wordId) -- else -- tableInsert(downDatas, wordId) -- end -- end -- local onCreate = function(item, data) -- item:SetActiveEx(true) -- item:SetData(data) -- end -- XUiHelper.CreateTemplates(self, self.TopWordImagePool, topDatas, XUiGridWordImage.New, self.WordImageItem.gameObject, self.PanelLeftRollTop, onCreate) -- XUiHelper.CreateTemplates(self, self.DownWordImagePool, downDatas, XUiGridWordImage.New, self.WordImageItem.gameObject, self.PanelLeftRollDown, onCreate) self.RImgUp.gameObject:SetActiveEx(true) self.RImgUp:SetRawImage(XCoupletGameConfigs.GetCoupletUpImgUrl(coupletId)) end function XUiCoupletRollPanel:RefreshDownWords(coupletId, isSelfChanged, getWordIndex) if XDataCenter.CoupletGameManager.GetCoupletGameStatus(coupletId) == XCoupletGameConfigs.CouPletStatus.Complete then -- 已经完成 self.PanelRightRollTop.gameObject:SetActiveEx(false) self.PanelRightRollDown.gameObject:SetActiveEx(false) self.RImgDown.gameObject:SetActiveEx(true) self.RImgDown:SetRawImage(XCoupletGameConfigs.GetCoupletDownImgUrl(coupletId)) if isSelfChanged then self.RootUi:PlayAnimation("RImgDownEnable") end else self.PanelRightRollTop.gameObject:SetActiveEx(true) self.PanelRightRollDown.gameObject:SetActiveEx(true) self.RImgDown.gameObject:SetActiveEx(false) local downWords = XDataCenter.CoupletGameManager.GetDownWordsDataById(coupletId) local halfCount = #downWords / 2 local _, remainder = math.modf(halfCount) if remainder > 0 then halfCount = math.ceil(halfCount) end local topDatas = {} local downDatas = {} for index, wordId in ipairs(downWords) do if index <= halfCount then tableInsert(topDatas, {Id = wordId, Index = index}) else tableInsert(downDatas, {Id = wordId, Index = index}) end end local onCreate = function(item, data) item:SetActiveEx(true) item:OnCreate(data) item:SetOnDragCallBack(function() self:OnWordDrag(data) end) item:SetOnDragUpCallBack(function () self:OnWordUp() end) self.CoupletWords[data.Index] = item if getWordIndex and getWordIndex == data.Index then item:PlayGetWordAnimation() end end XUiHelper.CreateTemplates(self, self.TopWordItemPool, topDatas, XUiGridWordItem.New, self.WordItem.gameObject, self.PanelRightRollTop, onCreate) XUiHelper.CreateTemplates(self, self.DownWordItemPool, downDatas, XUiGridWordItem.New, self.WordItem.gameObject, self.PanelRightRollDown, onCreate) end end function XUiCoupletRollPanel:ShowWordEffectError() for _, item in pairs(self.CoupletWords) do if not XDataCenter.CoupletGameManager.CheckWordIsCorrect(self.CurCoupletId, item.Data.Index, item.Data.Id) then item:SetEffectErrorActiveEx(false) item:SetEffectErrorActiveEx(true) end end end function XUiCoupletRollPanel:OnWordDrag(data) if XDataCenter.CoupletGameManager.GetCoupletGameStatus(self.CurCoupletId) == XCoupletGameConfigs.CouPletStatus.Complete or not XDataCenter.CoupletGameManager.CheckCoupletIsCheckComplete(self.CurCoupletId) then return end local wordIndex = data.Index if self.LastClickIndex and self.LastClickIndex ~= wordIndex then self.CoupletWords[self.LastClickIndex].LongClickHandle:Reset() self:RefreshDownWords(self.CurCoupletId) self.LastClickIndex = nil end if not data then return end if not self.DragItem then -- 第一次进入拖拽 没有拖拽的文字 self.CurDragIndex = wordIndex self.NearestIndex = nil self.CoupletWords[wordIndex]:DontShow(false) -- 隐藏该文字 self.DragItem = self.DragWordItem self.DragItem.gameObject:SetActiveEx(true) self.DragItem:SetRawImage(XCoupletGameConfigs.GetCoupletWordImageById(self.CoupletWords[wordIndex].Data.Id)) self.DragItem.gameObject.transform.localPosition = self:GetPosition() self.LastClickIndex = wordIndex else -- 持续更新拖拽的碎片位置 self.DragItem.gameObject.transform.localPosition = self:GetPosition() local nearestIndex = 0 nearestIndex = self:CalculateNearestWordIndex() if not self.NearestIndex then self.NearestIndex = nearestIndex self.CoupletWords[nearestIndex]:SetLight(true) else if self.NearestIndex ~= nearestIndex then self.CoupletWords[self.NearestIndex]:SetLight(false) self.NearestIndex = nearestIndex self.CoupletWords[nearestIndex]:SetLight(true) end end end end function XUiCoupletRollPanel:GetPosition() local screenPoint if CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsEditor or CS.UnityEngine.Application.platform == CS.UnityEngine.RuntimePlatform.WindowsPlayer then screenPoint = CS.UnityEngine.Vector2(CS.UnityEngine.Input.mousePosition.x, CS.UnityEngine.Input.mousePosition.y) else screenPoint = CS.UnityEngine.Input.GetTouch(0).position end -- 设置拖拽 local hasValue, v2 = CS.UnityEngine.RectTransformUtility.ScreenPointToLocalPointInRectangle(self.PanelRightRoll, screenPoint, UICamera) if hasValue then local x = v2.x local y = v2.y if x < -self.WordMoveLimitX then x = -self.WordMoveLimitX elseif x > self.WordMoveLimitX then x = self.WordMoveLimitX end if y < -self.WordMoveLimitY then y = -self.WordMoveLimitY elseif y > self.WordMoveLimitY then y = self.WordMoveLimitY end return CS.UnityEngine.Vector3(x, y, 0) else return CS.UnityEngine.Vector3.zero end end function XUiCoupletRollPanel:OnWordUp() if XDataCenter.CoupletGameManager.GetCoupletGameStatus(self.CurCoupletId) == XCoupletGameConfigs.CouPletStatus.Complete or not XDataCenter.CoupletGameManager.CheckCoupletIsCheckComplete(self.CurCoupletId) then return end if not self.NearestIndex then -- 点击抬起过快可能导致NearestIndex为空 self:RefreshDownWords(self.CurCoupletId) if self.DragItem then self.DragItem.gameObject:SetActiveEx(false) self.DragItem = nil self.LastClickIndex = nil end return end if self.DragItem then self.DragItem.gameObject:SetActiveEx(false) self.DragItem = nil self.LastClickIndex = nil self.CoupletWords[self.NearestIndex]:SetLight(false) XDataCenter.CoupletGameManager.ChangeWord(self.CurDragIndex, self.NearestIndex) self.CurDragIndex = nil self.NearestIndex = nil end end function XUiCoupletRollPanel:CalculateNearestWordIndex() local nearestIndex = 0 local nearestDistance = 0 for index, wordItem in ipairs(self.CoupletWords) do local x1 = self.DragItem.gameObject.transform.position.x local y1 = self.DragItem.gameObject.transform.position.y local x2 = wordItem.Transform.position.x local y2 = wordItem.Transform.position.y local distance = (y2-y1)^2 + (x2-x1)^2 if nearestDistance == 0 then nearestIndex = index nearestDistance = distance else if distance < nearestDistance then nearestIndex = index nearestDistance = distance end end end return nearestIndex end return XUiCoupletRollPanel