UIWorldMapView.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. local UIWorldMapView = require("UIBigMap/UIWorldMapView_Generate")
  2. local DOTween = DG.Tweening.DOTween
  3. local MAINLAND_KEY = "MainLand"
  4. local MAP_KEY = "map"
  5. function UIWorldMapView:OnAwake(data)
  6. self.controller = require("UIBigMap/UIWorldMapCtr"):new()
  7. self.controller:Init(self)
  8. self.controller:SetData(data)
  9. end
  10. function UIWorldMapView:AddEventListener()
  11. ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name, UIEventNames.BIGMAP_TOPPLAYER_RANK_CHANGED, self, self.RefreshTopPlayerRankAndPos)
  12. end
  13. function UIWorldMapView:FillContent(data, uiBase)
  14. self.uiBase = uiBase
  15. local gameObject = self.uiBase:GetRoot()
  16. if gameObject ~= nil then
  17. self.gameObject = gameObject
  18. self.transform = gameObject.transform
  19. end
  20. self:InitGenerate(self.transform, data)
  21. self:Init()
  22. end
  23. function UIWorldMapView:Init()
  24. self:RefreshMapLit()
  25. self:RefreshTopPlayerRank()
  26. self:RefreshSelfPos()
  27. self:RefreshOnePos()
  28. self:AlginCenter()
  29. self.selected:SetActive(false)
  30. self.inputMask:SetActive(false)
  31. end
  32. function UIWorldMapView:RemoveEventListener()
  33. ManagerContainer.LuaEventMgr:Unregister(self.uiData.name)
  34. end
  35. function UIWorldMapView:AddUIEventListener()
  36. ManagerContainer.LuaEventMgr:RegisterUIEvent(self.uiData.name)
  37. for i = 1, 3 do
  38. local topRank = self.rankContainer['topRank' .. i]
  39. if topRank then
  40. self.uiBase:AddButtonUniqueEventListener(topRank.button, self, self.OnClickBtnTopRank, i)
  41. end
  42. end
  43. self.uiBase:AddButtonUniqueEventListener(self.onePos.button, self, self.OnClickOnePos)
  44. self.uiBase:AddButtonUniqueEventListener(self.btnBack.button, self, self.OnClickBtnBack)
  45. self.uiBase:AddButtonUniqueEventListener(self.selected.button, self, self.OnClickSelected)
  46. end
  47. function UIWorldMapView:OnHide()
  48. end
  49. function UIWorldMapView:OnShow(data)
  50. self.controller:SetData(data)
  51. self:Init()
  52. end
  53. function UIWorldMapView:OnClose()
  54. end
  55. function UIWorldMapView:OnDispose()
  56. self.selectedMapLastPos = nil
  57. self.selectedSignLastPos = nil
  58. self:StopMoveToNextMap()
  59. end
  60. function UIWorldMapView:OnPageInEnd()
  61. self.super.OnPageInEnd(self)
  62. self:PlayMoveToNextMap()
  63. end
  64. function UIWorldMapView:RefreshMapLit()
  65. local curMapId = self.controller:GetCurMapId()
  66. local showMapId = self.controller:GetShowMapId()
  67. for i = curMapId, 1, -1 do
  68. local mapLua = self:GetMapLua(i)
  69. if mapLua then
  70. mapLua.map:SetActive(i <= showMapId)
  71. self.uiBase:AddButtonUniqueEventListener(mapLua.map.image.button, self, self.OnClickMap, i)
  72. end
  73. end
  74. end
  75. function UIWorldMapView:RefreshTopPlayerRankAndPos()
  76. self:RefreshTopPlayerRank()
  77. self:RefreshOnePos()
  78. end
  79. function UIWorldMapView:RefreshTopPlayerRank()
  80. local playerList = self.controller:GetTopRankPlayerList()
  81. LogError("===================="..Inspect(playerList))
  82. self.rankContainer:SetActive(true)
  83. local length = playerList and #playerList or 0
  84. for i = 3, 1, -1 do
  85. local keyName = 'topRank' .. i
  86. local topRank = self.rankContainer[keyName]
  87. if length < i then
  88. topRank:SetActive(false)
  89. else
  90. topRank:SetActive(true)
  91. local playerInfo = playerList[i]
  92. local mapId = playerInfo.mapId
  93. local mapLevel = playerInfo.mapLevel
  94. local useName = playerInfo.nickName
  95. local headId = playerInfo.headId
  96. topRank.nameTxt.text.text = useName
  97. topRank.orderTxt.text.text = self.controller:GetMapName(mapId, mapLevel)
  98. local roleId = CommonUtil.JobIdToRoleId(playerInfo.jobId,playerInfo.sex)
  99. local roleCfg = ManagerContainer.CfgMgr:GetRoleDataById(roleId)
  100. local headIcon = (roleCfg and roleCfg.HeadId or '')
  101. local jobCfg = ManagerContainer.CfgMgr:GetJobDataById(playerInfo.jobId)
  102. local _fakerData = {Level = playerInfo.level, ProfessionIcon = jobCfg.JobIcon, HeadIcon = headIcon, IsHero = true}
  103. topRank.headNode.headItem.head.button.enabled = false
  104. CommonUtil.SetPlayerHeadAndFrame(self, topRank.headNode.headItem, _fakerData, false, playerInfo.headFrameId)
  105. end
  106. end
  107. end
  108. function UIWorldMapView:RefreshSelfPos()
  109. local contentStr = self.controller:GetShowMapName()
  110. self.selfPos.dscLeft.desTxt.text.text = contentStr
  111. self.selfPos.dscRight.desTxt.text.text = contentStr
  112. if self:RectTransformContain(self.scrollView.scrollRect.content, self.selfPos.dscLeft.rectTransform) then
  113. self.selfPos.dscLeft:SetActive(true)
  114. self.selfPos.dscRight:SetActive(false)
  115. else
  116. self.selfPos.dscLeft:SetActive(false)
  117. self.selfPos.dscRight:SetActive(true)
  118. end
  119. local curMapId = self.controller:GetShowMapId()
  120. local mapLua = self:GetMapLua(curMapId)
  121. if not mapLua then
  122. self.selfPos:SetActive(false)
  123. return
  124. end
  125. self.selfPos:SetActive(true)
  126. self.selfPos.transform.position = mapLua.pos.transform.position
  127. end
  128. function UIWorldMapView:RefreshOnePos()
  129. local playerList = self.controller:GetTopRankPlayerList()
  130. if not playerList or not playerList[1] then
  131. self.onePos:SetActive(false)
  132. return
  133. end
  134. local mapId = playerList[1].mapId
  135. local mapLua = self:GetMapLua(mapId)
  136. if not mapLua then
  137. self.onePos:SetActive(false)
  138. return
  139. end
  140. self.onePos:SetActive(true)
  141. -- local curMapId = self.controller:GetCurMapId()
  142. -- local pos
  143. -- if curMapId == mapId then
  144. -- pos = Vector3.zero
  145. -- if self.selfPos.dscLeft.activeSelf then
  146. -- pos.x = pos.x + 100
  147. -- else
  148. -- pos.x = pos.x - 100
  149. -- end
  150. -- pos = mapLua.pos.transform:TransformPoint(pos)
  151. -- else
  152. -- pos = mapLua.pos.transform.position
  153. -- end
  154. -- self.onePos.transform.position = pos
  155. self.onePos.transform.position = mapLua.pos.transform.position
  156. end
  157. function UIWorldMapView:AlginCenter()
  158. local curMapId = self.controller:GetShowMapId()
  159. local mapLua = self:GetMapLua(curMapId)
  160. if mapLua then
  161. local scrollRect = self.scrollView.scrollRect
  162. local viewport = scrollRect.viewport
  163. local content = scrollRect.content
  164. local viewportW = viewport.rect.width
  165. local contentW = content.rect.width
  166. local vaildW = contentW - viewportW
  167. local pos = content:InverseTransformPoint(mapLua.pos.transform.position)
  168. local val = Mathf.Clamp01((pos.x - viewportW * 0.5) / vaildW)
  169. scrollRect.horizontalNormalizedPosition = val
  170. end
  171. end
  172. function UIWorldMapView:OnClickOnePos()
  173. -- 显示玩家详细信息
  174. local playerList = self.controller:GetTopRankPlayerList()
  175. if not playerList then
  176. return
  177. end
  178. local playerInfo = playerList[1]
  179. if not playerInfo then return end
  180. local uid = playerInfo.uid
  181. if not uid then return end
  182. local curUserId = ManagerContainer.DataMgr.UserData:GetUserId()
  183. if int64.equals(curUserId, uid) then
  184. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("ChatError1")
  185. else
  186. ManagerContainer.LuaUIMgr:OpenRoleMessagePanel(uid)
  187. end
  188. end
  189. function UIWorldMapView:OnClickBtnTopRank(btn, params)
  190. local i = params[0]
  191. -- 显示玩家详细信息
  192. local playerList = self.controller:GetTopRankPlayerList()
  193. if not playerList then
  194. return
  195. end
  196. local playerInfo = playerList[i]
  197. if not playerInfo then return end
  198. local uid = playerInfo.uid
  199. if not uid then return end
  200. local curUserId = ManagerContainer.DataMgr.UserData:GetUserId()
  201. if int64.equals(curUserId, uid) then
  202. ManagerContainer.LuaUIMgr:ErrorNoticeDisplay("ChatError1")
  203. else
  204. ManagerContainer.LuaUIMgr:OpenRoleMessagePanel(uid)
  205. end
  206. end
  207. function UIWorldMapView:OnClickBtnBack()
  208. self:UIClose()
  209. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIBigMap, {id = self.controller:GetCurMapId()}, nil, nil, false)
  210. end
  211. function UIWorldMapView:OnClickMap(btn, params)
  212. local mapId = params[0]
  213. local mapLua = self:GetMapLua(mapId)
  214. if not mapLua then return end
  215. if self.lastSelectMapId == mapId then
  216. self:OnClickSelected()
  217. self:UIClose()
  218. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIBigMap, {id = mapId}, nil, nil, false)
  219. return
  220. end
  221. self.lastSelectMapId = mapId
  222. self.selected:SetActive(true)
  223. self.selectedMapLastPos = mapLua.map.transform.localPosition
  224. self.selectedSignLastPos = self.sign.transform.localPosition
  225. mapLua.map.transform:SetParent(self.selected.transform)
  226. self.sign.transform:SetParent(self.selected.transform)
  227. mapLua.map.animator:Play("MapSelected")
  228. end
  229. function UIWorldMapView:OnClickSelected()
  230. local mapId = self.lastSelectMapId
  231. if not mapId then return end
  232. local mapLua = self:GetMapLua(mapId)
  233. if not mapLua then return end
  234. self.lastSelectMapId = nil
  235. mapLua.map.animator:Play("MapActived")
  236. mapLua.map.transform:SetParent(mapLua.transform)
  237. mapLua.map.transform:SetAsFirstSibling()
  238. self.sign.transform:SetParent(self.scrollView.scrollRect.content.transform)
  239. self.sign.transform:SetAsLastSibling()
  240. self.selected:SetActive(false)
  241. if self.selectedMapLastPos then
  242. mapLua.map.transform.localPosition = self.selectedMapLastPos
  243. self.selectedMapLastPos = nil
  244. end
  245. if self.selectedSignLastPos then
  246. self.sign.transform.localPosition = self.selectedSignLastPos
  247. self.selectedSignLastPos = nil
  248. end
  249. end
  250. function UIWorldMapView:PlayMoveToNextMap()
  251. local isChangeMap = self.controller:IsChangeMap()
  252. if not isChangeMap then
  253. self:StopMoveToNextMap()
  254. return
  255. end
  256. -- 判断新区域是否在屏幕内
  257. local scrollRect = self.scrollView.scrollRect
  258. local viewport = scrollRect.viewport
  259. local content = scrollRect.content
  260. local viewportW = viewport.rect.width
  261. local contentW = content.rect.width
  262. local vaildW = contentW - viewportW
  263. local curMapId = self.controller:GetCurMapId()
  264. local mapLua = self:GetMapLua(curMapId)
  265. if not mapLua then
  266. self:StopMoveToNextMap()
  267. return
  268. end
  269. self:OnClickSelected()
  270. self.inputMask:SetActive(true)
  271. local seq = DOTween.Sequence()
  272. self.mtnmSeq = seq
  273. self.selfPos.dscLeft:SetActive(false)
  274. self.selfPos.dscRight:SetActive(false)
  275. mapLua.map:SetActive(true)
  276. mapLua.map.animator:Play("MapUnlock")
  277. local time1 = 0.5
  278. local time2 = 0.2
  279. local time3 = 0.5
  280. local time4 = 0.1
  281. local timeCfg = GlobalConfig.Instance:GetConfigStrValue(145)
  282. if timeCfg then
  283. local timeArr = string.split(timeCfg, ';')
  284. if timeArr then
  285. time1 = timeArr[1] and tonumber(timeArr[1]) or time1
  286. time2 = timeArr[2] and tonumber(timeArr[2]) or time2
  287. time3 = timeArr[3] and tonumber(timeArr[3]) or time3
  288. time4 = timeArr[4] and tonumber(timeArr[4]) or time4
  289. end
  290. end
  291. seq:AppendInterval(time1)
  292. if self:RectTransformContain(viewport, mapLua.transform) then
  293. seq:Append(self.selfPos.transform:DOMove(mapLua.pos.transform.position, time2))
  294. else
  295. local targetPos = content:InverseTransformPoint(mapLua.pos.transform.position)
  296. local curPos = content:InverseTransformPoint(self.selfPos.transform.position)
  297. local val = scrollRect.horizontalNormalizedPosition
  298. scrollRect.horizontalNormalizedPosition = Mathf.Clamp01((targetPos.x - viewportW * 0.5) / vaildW)
  299. seq:AppendCallback(function()
  300. scrollRect.horizontalNormalizedPosition = val
  301. end)
  302. local tweener = DOTween.To(DG.Tweening.Core.DOGetter_UnityEngine_Vector3(function()
  303. return curPos
  304. end), DG.Tweening.Core.DOSetter_UnityEngine_Vector3(function (value)
  305. curPos = value
  306. scrollRect.horizontalNormalizedPosition = Mathf.Clamp01((curPos.x - viewportW * 0.5) / vaildW)
  307. self.selfPos.transform.position = content:TransformPoint(curPos)
  308. end), targetPos, time3)
  309. seq:Append(tweener)
  310. end
  311. seq:AppendInterval(time4)
  312. seq:AppendCallback(function()
  313. self:StopMoveToNextMap()
  314. end)
  315. end
  316. function UIWorldMapView:StopMoveToNextMap()
  317. if self.mtnmSeq then
  318. self.mtnmSeq:Kill()
  319. self.mtnmSeq = nil
  320. end
  321. self.inputMask:SetActive(false)
  322. if self.controller:IsChangeMap() then
  323. self:UIClose()
  324. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.BIGMAP_ENTER_NEXTMAP_END)
  325. end
  326. end
  327. function UIWorldMapView:GetMapLua(mapId)
  328. local key = MAP_KEY .. tostring(mapId)
  329. local mapLua = self[key]
  330. if mapLua then
  331. return mapLua
  332. else
  333. LogError("Not Find Map's transform. mapId : " .. tostring(mapId))
  334. return nil
  335. end
  336. end
  337. --- 是否a 包含 b
  338. function UIWorldMapView:RectTransformContain(a, b)
  339. local rectA = a.rect
  340. local minA = a:TransformPoint(rectA.min)
  341. local maxA = a:TransformPoint(rectA.max)
  342. local rectB = b.rect
  343. local minB = b:TransformPoint(rectB.min)
  344. local maxB = b:TransformPoint(rectB.max)
  345. return (minB.x >= minA.x and minB.x < maxA.x and minB.y >= minA.y and minB.y < maxA.y
  346. and maxB.x >= minA.x and maxB.x < maxA.x and maxB.y >= minA.y and maxB.y < maxA.y)
  347. end
  348. return UIWorldMapView