Area2D_Tips.lua 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. ---@class Area2D @二维坐标分块,适用于静态坐标数据的遍历
  2. ---@field blockDatas table<number,any[]>
  3. Area2D = class()
  4. local this = Area2D
  5. local dir9 =
  6. {
  7. {0,0},
  8. {-1,1},
  9. {0,1},
  10. {1,1},
  11. {-1,0},
  12. {1,0},
  13. {-1,-1},
  14. {0,-1},
  15. {1,-1},
  16. }
  17. ---左下角为起始点
  18. function this:ctor(orginX,orginZ, cellX,cellZ)
  19. self.orginX = orginX
  20. self.orginZ = orginZ
  21. self.cellX = cellX
  22. self.cellZ = cellZ
  23. self.blockDatas = {}
  24. self.checkKey = -1
  25. self.isOpenCheck = true
  26. self.lastNearlyEightDatas = {}
  27. self.nearlyEightDatas = {}
  28. self.returnData = {}
  29. end
  30. ---@param obj any
  31. ---@return void @不要重复添加,内部没有判断重复
  32. function this:Add(x,z,obj)
  33. local key = self:GetKey(x,z)
  34. if not self.blockDatas[key] then
  35. self.blockDatas[key] = {}
  36. self.blockDatas[key].key = key
  37. self.blockDatas[key].datas = {}
  38. end
  39. --for k, v in pairs(self.blockDatas[key].datas) do
  40. -- if v == obj then
  41. -- logError('samle = '.. table.toStringJsonFormat(obj))
  42. -- end
  43. --end
  44. table.insert(self.blockDatas[key].datas,obj)
  45. end
  46. function this:GetKey(x,z)
  47. local indexX = Mathf.Floor((x - self.orginX)/self.cellX)
  48. local indexZ = Mathf.Floor((z - self.orginZ)/self.cellZ)
  49. return indexX*10000+indexZ
  50. end
  51. function this:GetKeyByAreaIndex(areaIndexX,areaIndexZ)
  52. return areaIndexX*10000+areaIndexZ
  53. end
  54. function this:SplitKey(key)
  55. local indexX = Mathf.Floor(key/10000)
  56. local indexZ = Mathf.Floor(key%10000)
  57. return indexX,indexZ
  58. end
  59. ---@return any[]
  60. function this:GetData(x,z)
  61. local key = self:GetKey(x,z)
  62. return self.blockDatas[key]
  63. end
  64. function this:IsExist(key)
  65. return self.blockDatas[key]~=nil
  66. end
  67. ---@return any[]
  68. function this:GetDataByKey(key)
  69. return self.blockDatas[key]
  70. end
  71. function this:SetOpenCheck(b)
  72. self.isOpenCheck = b
  73. end
  74. function this:GetNearlyDatas(blockx, blockz, func, funcData)
  75. local index = 1
  76. for k, v in pairs(dir9) do
  77. local nx = blockx+v[1]
  78. local nz = blockz+v[2]
  79. local key = self:GetKeyByAreaIndex(nx,nz)
  80. self.nearlyEightDatas[index] = self:GetDataByKey(key)
  81. index = index+1
  82. end
  83. return self.nearlyEightDatas
  84. end
  85. function this:GetNearlyDatasByKey(key)
  86. local blockx,blockz = self:SplitKey(key)
  87. return self:GetNearlyDatas(blockx,blockz)
  88. end
  89. function this:CheckBlack(x,z,func,funcData)
  90. if not self.isOpenCheck then
  91. return
  92. end
  93. local checkKey = self:GetKey(x,z)
  94. if self.checkKey == checkKey then
  95. return
  96. end
  97. self.checkKey = checkKey
  98. --if not self:IsExist(checkKey) then
  99. -- table.clear(lastNearlyEightDatas)
  100. -- table.copyFrom(lastNearlyEightDatas,nearlyEightDatas)
  101. -- table.clear(nearlyEightDatas)
  102. -- if table.count(lastNearlyEightDatas)~=0 then
  103. -- local removeDatas = {}
  104. -- table.copyFrom(removeDatas,lastNearlyEightDatas)
  105. -- returnData[1] = checkKey
  106. -- returnData[2] = removeDatas --移除的块
  107. -- returnData[3] = nil --新增的块
  108. -- if func then
  109. -- func(funcData,returnData)
  110. -- end
  111. -- end
  112. -- return
  113. --end
  114. table.clear(self.lastNearlyEightDatas)
  115. table.copyFrom(self.lastNearlyEightDatas,self.nearlyEightDatas)
  116. self.nearlyEightDatas = self:GetNearlyDatasByKey(checkKey)
  117. local removeDatas = nil
  118. local addDatas = nil
  119. for k, v in pairs(self.lastNearlyEightDatas) do
  120. local isFind = false
  121. for k2, v2 in pairs(self.nearlyEightDatas) do
  122. if v.key == v2.key then
  123. isFind = true
  124. break
  125. end
  126. end
  127. if not isFind then
  128. if not removeDatas then
  129. removeDatas = {}
  130. end
  131. table.insert(removeDatas,v)
  132. end
  133. end
  134. for k, v in pairs(self.nearlyEightDatas) do
  135. local isFind = false
  136. for k2, v2 in pairs(self.lastNearlyEightDatas) do
  137. if v.key == v2.key then
  138. isFind = true
  139. break
  140. end
  141. end
  142. if not isFind then
  143. if not addDatas then
  144. addDatas = {}
  145. end
  146. table.insert(addDatas,v)
  147. end
  148. end
  149. self.returnData[1] = checkKey
  150. self.returnData[2] = removeDatas --移除的块
  151. self.returnData[3] = addDatas --新增的块
  152. if func then
  153. func(funcData,self.returnData)
  154. end
  155. end