GameLogic.ts 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  1. import { CHECKDIR, PROPTYPE, SURPRISETASKTYPE } from "../data/Enum";
  2. import GamePlay from "../GamePlay";
  3. import GameConst from "../data/GameConst";
  4. import PlayerConst from "../data/PlayerConst";
  5. const { ccclass, property } = cc._decorator;
  6. @ccclass
  7. export default class GameLogic extends cc.Component {
  8. /**加载头像
  9. * @param headImgUrl 头像url
  10. * @param headSpr 头像
  11. * @param size 尺寸
  12. */
  13. public static loadHeadImg(headImgUrl: string, headSpr: cc.Sprite, size: number) {
  14. mk.console.log("[LoaderUtil] loadHeadImg ----------------------------------- ", headImgUrl);
  15. mk.loader.loadRemote(`${headImgUrl}+"?aaa=aa.jpg"`, null).then((res) => {
  16. let tex: cc.Texture2D = res as cc.Texture2D;
  17. headSpr.spriteFrame = new cc.SpriteFrame(tex);
  18. headSpr.node.setContentSize(size, size);
  19. })
  20. }
  21. //获取世界坐标------------------------------------------------------------------------------------------------------
  22. public static getWorldPos(node: cc.Node): cc.Vec2 {
  23. let originX = node.x;
  24. let originY = node.y;
  25. let curNode = node;
  26. while (curNode.parent) {
  27. let parent = curNode.parent;
  28. mk.console.log("GameUtil", curNode.parent.name);
  29. if (parent.name == 'Canvas') {
  30. break;
  31. }
  32. originX += parent.x;
  33. originY += parent.y;
  34. curNode = parent;
  35. }
  36. mk.console.log("GameUtil", originX, originY);
  37. return new cc.Vec2(originX, originY);
  38. }
  39. //消除相关算法-------------------------------------------------------------------------------------------------------
  40. /**检测周围的cellItem(该算法有问题 待修正)
  41. *
  42. */
  43. public checkAroundCellItem(checkDir: CHECKDIR, index_x: number, index_y: number, type: number, ifTagRemoved: boolean) {
  44. let x: number = 0;
  45. let y: number = 0;
  46. switch (checkDir) {
  47. case CHECKDIR.Above:
  48. if (index_y <= 0) {
  49. return null;
  50. }
  51. x = index_x;
  52. y = index_y - 1;
  53. break;
  54. case CHECKDIR.Below:
  55. if (index_y >= (GameConst.row_num - 1)) {
  56. return null;
  57. }
  58. x = index_x;
  59. y = index_y + 1;
  60. break;
  61. case CHECKDIR.Left:
  62. if (index_x <= 0) {
  63. return null;
  64. }
  65. x = index_x - 1;
  66. y = index_y;
  67. break;
  68. case CHECKDIR.Right:
  69. if (index_x >= (GameConst.col_num - 1)) {
  70. return null;
  71. }
  72. x = index_x + 1;
  73. y = index_y;
  74. break;
  75. }
  76. let cellItem = GamePlay.Inst.cellItemDic[x][y];
  77. if (cellItem && cellItem.ifRemoved == false && cellItem.type === type) {
  78. if (ifTagRemoved) {
  79. cellItem.ifRemoved = true;
  80. }
  81. return new cc.Vec2(x, y);
  82. }
  83. else {
  84. return null;
  85. }
  86. }
  87. /**检测上边的CellItem
  88. * @param index_x
  89. * @param index_y
  90. * @param type cellItem类型
  91. * @param ifTagRemoved 查找到时是否标记移除
  92. */
  93. public static checkAboveCellItem(index_x: number, index_y: number, type: number, ifTagRemoved: boolean): cc.Vec2 {
  94. if (!GamePlay.Inst || !GamePlay.Inst.cellItemDic) {
  95. return null;
  96. }
  97. if (index_y <= 0) {
  98. return null;
  99. }
  100. //LogUtil.log("index_x", index_x, index_y);
  101. //LogUtil.log("index_y - 1",index_y - 1);
  102. let cellItem = GamePlay.Inst.cellItemDic[index_x][index_y - 1];
  103. if (cellItem && cellItem.ifRemoved == false && cellItem.type === type) {
  104. if (ifTagRemoved) {
  105. cellItem.ifRemoved = true;
  106. }
  107. return new cc.Vec2(index_x, index_y - 1);
  108. }
  109. else {
  110. return null;
  111. }
  112. }
  113. /**检测下边的CellItem
  114. * @param index_x
  115. * @param index_y
  116. * @param type cellItem类型
  117. * @param ifTagRemoved 查找到时是否标记移除
  118. */
  119. public static checkBelowCellItem(index_x: number, index_y: number, type: number, ifTagRemoved: boolean): cc.Vec2 {
  120. if (!GamePlay.Inst || !GamePlay.Inst.cellItemDic) {
  121. return null;
  122. }
  123. if (index_y >= (GameConst.row_num - 1)) {
  124. return null;
  125. }
  126. let cellItem = GamePlay.Inst.cellItemDic[index_x][index_y + 1];
  127. if (cellItem && cellItem.ifRemoved == false && cellItem.type === type) {
  128. if (ifTagRemoved) {
  129. cellItem.ifRemoved = true;
  130. }
  131. return new cc.Vec2(index_x, index_y + 1);
  132. }
  133. else {
  134. return null;
  135. }
  136. }
  137. /**检测左边的CellItem
  138. * @param index_x
  139. * @param index_y
  140. * @param type cellItem类型
  141. * @param ifTagRemoved 查找到时是否标记移除
  142. */
  143. public static checkLeftCellItem(index_x: number, index_y: number, type: number, ifTagRemoved: boolean): cc.Vec2 {
  144. if (!GamePlay.Inst || !GamePlay.Inst.cellItemDic) {
  145. return null;
  146. }
  147. if (index_x <= 0) {
  148. return null;
  149. }
  150. let cellItem = GamePlay.Inst.cellItemDic[index_x - 1][index_y];
  151. if (cellItem && cellItem.ifRemoved == false && cellItem.type === type) {
  152. if (ifTagRemoved) {
  153. cellItem.ifRemoved = true;
  154. }
  155. return new cc.Vec2(index_x - 1, index_y);
  156. }
  157. else {
  158. return null;
  159. }
  160. }
  161. /**检测右边的CellItem
  162. * @param index_x
  163. * @param index_y
  164. * @param type
  165. * @param ifTagRemoved 查找到时是否标记移除
  166. */
  167. public static checkRightCellItem(index_x: number, index_y: number, type: number, ifTagRemoved: boolean): cc.Vec2 {
  168. if (index_x >= (GameConst.col_num - 1)) {
  169. return null;
  170. }
  171. if (!GamePlay.Inst || !GamePlay.Inst.cellItemDic || !GamePlay.Inst.cellItemDic[index_x + 1]) {
  172. return;
  173. }
  174. let cellItem = GamePlay.Inst.cellItemDic[index_x + 1][index_y];
  175. if (cellItem && cellItem.ifRemoved == false && cellItem.type === type) {
  176. if (ifTagRemoved) {
  177. cellItem.ifRemoved = true;
  178. }
  179. return new cc.Vec2(index_x + 1, index_y);
  180. }
  181. else {
  182. return null;
  183. }
  184. }
  185. /**获取同类型cellType
  186. * @param: index_x x索引值
  187. * @param: index_y y索引值
  188. * @param: type 类型
  189. * @param: 查找到之后是否标记移除 默认为 false
  190. */
  191. public static getAroundSameType(index_x: number, index_y: number, type: number, ifTagRemoved: boolean = false): cc.Vec2[] {
  192. return [
  193. GameLogic.checkAboveCellItem(index_x, index_y, type, ifTagRemoved),
  194. GameLogic.checkBelowCellItem(index_x, index_y, type, ifTagRemoved),
  195. GameLogic.checkLeftCellItem(index_x, index_y, type, ifTagRemoved),
  196. GameLogic.checkRightCellItem(index_x, index_y, type, ifTagRemoved)
  197. ].filter((vec) => vec != null);
  198. }
  199. /**获取清理列表
  200. * @param index_x x
  201. * @param index_y y
  202. * @param type 类型
  203. */
  204. public static getCleanedVecList(index_x: number, index_y: number, type: number, ifTagRemoved: boolean = true) {
  205. let aroundSameTypeItem = this.getAroundSameType(index_x, index_y, type, ifTagRemoved);
  206. aroundSameTypeItem.forEach((vec) => {
  207. if (GamePlay.Inst.cleanedVecArr.indexOf(vec) == -1) {
  208. GamePlay.Inst.cleanedVecArr.push(vec);
  209. this.getCleanedVecList(vec.x, vec.y, type, ifTagRemoved);
  210. }
  211. });
  212. }
  213. /**获取能够清理列表
  214. * @param index_x x
  215. * @param index_y y
  216. * @param type 类型
  217. * @param ifTagRemoved: boolean = false 找到之后是否标记移除
  218. */
  219. public static getCouldCleanVecList(index_x: number, index_y: number, type: number, ifTagRemoved: boolean = true) {
  220. let aroundSameTypeItem = this.getAroundSameType(index_x, index_y, type, ifTagRemoved);
  221. aroundSameTypeItem.forEach((vec) => {
  222. if (GamePlay.Inst.couldCleanVecArr.indexOf(vec) == -1) {
  223. GamePlay.Inst.couldCleanVecArr.push(vec);
  224. this.getCouldCleanVecList(vec.x, vec.y, type, ifTagRemoved);
  225. }
  226. });
  227. }
  228. /**获取能够移除的CellItem的位置信息(找到符合条件就return)*/
  229. public static getCouldCleanVec() {
  230. let keys = Object.keys(GamePlay.Inst.cellItemDic);
  231. for (var i = 0; i < keys.length; i++) {
  232. let key = Number(keys[i]);
  233. let colCellItemArr = GamePlay.Inst.cellItemDic[key];
  234. if (colCellItemArr) {
  235. for (var j = 0; j < colCellItemArr.length; j++) {
  236. let cellItem = colCellItemArr[j];
  237. if (cellItem) {
  238. this.getCouldCleanVecList(cellItem.x, cellItem.y, cellItem.type, true)
  239. if (GamePlay.Inst.couldCleanVecArr.length > 0) {
  240. //重置ifRemoved状态
  241. for (var i = 0; i < GamePlay.Inst.couldCleanVecArr.length; i++) {
  242. let vec = GamePlay.Inst.couldCleanVecArr[i];
  243. if (GamePlay.Inst.cellItemDic[vec.x]) {
  244. let cellItem = GamePlay.Inst.cellItemDic[vec.x][vec.y];
  245. if (cellItem) {
  246. cellItem.ifRemoved = false;
  247. }
  248. }
  249. }
  250. return;
  251. }
  252. }
  253. }
  254. }
  255. }
  256. }
  257. /**获取全部移除的XIndex(只针对已经移除得index)
  258. * @param cleanXIndexArr[] 移除操作的index数组
  259. */
  260. public static getAllCleanXIndex(cleanXIndexArr: number[]): number[] {
  261. let allCleadXIndexArr: number[] = [];
  262. //LogUtil.log("Game.Inst.cellItemDic",Game.Inst.cellItemDic);
  263. for (var i = 0; i < cleanXIndexArr.length; i++) {
  264. let xIndex = cleanXIndexArr[i];
  265. let colCellItemArr = GamePlay.Inst.cellItemDic[xIndex];
  266. let ifAllCleaned: boolean = true;
  267. for (var j = GameConst.row_num - 1; j >= 0; j--) {
  268. if (colCellItemArr[j]) {
  269. ifAllCleaned = false;
  270. break;
  271. }
  272. // LogUtil.log("colCellItemArr[j]", j, colCellItemArr[j])
  273. // LogUtil.log("colCellItemArr[j]", j, colCellItemArr)
  274. }
  275. if (ifAllCleaned) {
  276. allCleadXIndexArr.push(xIndex);
  277. }
  278. }
  279. allCleadXIndexArr.sort();
  280. return allCleadXIndexArr;
  281. }
  282. /**获取剩余的xIndexArr */
  283. public static getLeftXIndexArr(): number[] {
  284. let leftXindexArr: number[] = [];
  285. for (var i = 0; i < GameConst.col_num; i++) {
  286. let cellItemArr = GamePlay.Inst.cellItemDic[i];
  287. let leftCellItemArr = cellItemArr.filter((cellItem) => cellItem != null);
  288. if (leftCellItemArr.length > 0) {
  289. leftXindexArr.push(i);
  290. }
  291. }
  292. return leftXindexArr;
  293. }
  294. }