collison.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. "use strict";
  2. var __assign = (this && this.__assign) || Object.assign || function(t) {
  3. for (var s, i = 1, n = arguments.length; i < n; i++) {
  4. s = arguments[i];
  5. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  6. t[p] = s[p];
  7. }
  8. return t;
  9. };
  10. Object.defineProperty(exports, "__esModule", { value: true });
  11. exports.collision = function (a, b) {
  12. if (a.GridX === b.GridX && a.GridY === b.GridY &&
  13. a.w === b.w && a.h === b.h) {
  14. return true;
  15. }
  16. if (a.GridX + a.w <= b.GridX)
  17. return false;
  18. if (a.GridX >= b.GridX + b.w)
  19. return false;
  20. if (a.GridY + a.h <= b.GridY)
  21. return false;
  22. if (a.GridY >= b.GridY + b.h)
  23. return false;
  24. return true;
  25. };
  26. /**获取layout中,item第一个碰撞到的物体 */
  27. exports.getFirstCollison = function (layout, item) {
  28. for (var i = 0, length_1 = layout.length; i < length_1; i++) {
  29. if (exports.collision(layout[i], item)) {
  30. return layout[i];
  31. }
  32. }
  33. return null;
  34. };
  35. exports.layoutCheck = function (layout, layoutItem, key, fristItemkey, moving) {
  36. var i = [], movedItem = []; /**收集所有移动过的物体 */
  37. var newlayout = layout.map(function (item, idx) {
  38. if (item.key !== key) {
  39. if (item.static) {
  40. return item;
  41. }
  42. if (exports.collision(item, layoutItem)) {
  43. i.push(item.key);
  44. /**
  45. * 这里就是奇迹发生的地方,如果向上移动,那么必须注意的是
  46. * 一格一格的移动,而不是一次性移动
  47. */
  48. var offsetY = item.GridY + 1;
  49. /**这一行也非常关键,当向上移动的时候,碰撞的元素必须固定 */
  50. // if (moving < 0 && layoutItem.GridY > 0) offsetY = item.GridY
  51. if (layoutItem.GridY > item.GridY && layoutItem.GridY < item.GridY + item.h) {
  52. /**
  53. * 元素向上移动时,元素的上面空间不足,则不移动这个元素
  54. * 当元素移动到GridY>所要向上交换的元素时,就不会进入这里,直接交换元素
  55. */
  56. offsetY = item.GridY;
  57. }
  58. /**
  59. * 物体向下移动的时候
  60. */
  61. if (moving > 0) {
  62. if (layoutItem.GridY + layoutItem.h < item.GridY) {
  63. var collision_1;
  64. var copy_1 = __assign({}, item);
  65. while (true) {
  66. var newLayout = layout.filter(function (item) {
  67. if (item.key !== key && (item.key !== copy_1.key)) {
  68. return item;
  69. }
  70. });
  71. collision_1 = exports.getFirstCollison(newLayout, copy_1);
  72. if (collision_1) {
  73. offsetY = collision_1.GridY + collision_1.h;
  74. break;
  75. }
  76. else {
  77. copy_1.GridY--;
  78. }
  79. if (copy_1.GridY < 0) {
  80. offsetY = 0;
  81. break;
  82. }
  83. }
  84. }
  85. }
  86. movedItem.push(__assign({}, item, { GridY: offsetY, isUserMove: false }));
  87. return __assign({}, item, { GridY: offsetY, isUserMove: false });
  88. }
  89. }
  90. else if (fristItemkey === key) {
  91. /**永远保持用户移动的块是 isUserMove === true */
  92. return __assign({}, item, { GridX: layoutItem.GridX, GridY: layoutItem.GridY, isUserMove: true });
  93. }
  94. return item;
  95. });
  96. /** 递归调用,将layout中的所有重叠元素全部移动 */
  97. var length = movedItem.length;
  98. for (var c = 0; c < length; c++) {
  99. newlayout = exports.layoutCheck(newlayout, movedItem[c], i[c], fristItemkey, 0);
  100. }
  101. return newlayout;
  102. };