collison.js 3.5 KB

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