UIWorldMapView.lua 12 KB

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