Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

140 řádky
3.7 KiB

  1. MoveLockedMode =
  2. {
  3. no = 0;
  4. x = 1;
  5. y = 2;
  6. }
  7. -- 2D平移工具功能
  8. local Move2DTool = class("Move2DTool", require("MoveTool"))
  9. function Move2DTool:ctor()
  10. -- 当前锁定模式
  11. self.lockedMode = MoveLockedMode.no;
  12. self.super.ctor(self);
  13. end
  14. function Move2DTool:clear()
  15. self.super.clear(self);
  16. end
  17. function Move2DTool:MouseDown(button , x , y)
  18. self.super.MouseDown(self, button, x, y)
  19. end
  20. local function roundVec3(vec)
  21. vec.x = math.floor(vec.x + 0.5)
  22. vec.y = math.floor(vec.y + 0.5)
  23. vec.z = math.floor(vec.z + 0.5)
  24. return vec;
  25. end
  26. -- 根据Shift键决定锁定哪个轴,并返回移动目标
  27. function Move2DTool:getMoveEndPos(screenX , screenY)
  28. -- 转换坐标,将屏幕坐标转换成GLView的坐标
  29. local startPos = app.visibleRect:convertScreenToGLView(self.startPos.x , self.startPos.y);
  30. local endPos = app.visibleRect:convertScreenToGLView(screenX , screenY);
  31. local key = app.cs.getModifierKeys();
  32. -- Shift锁定横竖移动
  33. if key == Keys.Shift then
  34. if self.lockedMode == MoveLockedMode.no then
  35. -- x 方向移动的距离更远
  36. if math.abs(endPos.x - startPos.x) > math.abs(endPos.y - startPos.y) then
  37. self.lockedMode = MoveLockedMode.x;
  38. else
  39. self.lockedMode = MoveLockedMode.y;
  40. end
  41. end
  42. -- x 方向移动的距离更远
  43. if self.lockedMode == MoveLockedMode.x then
  44. endPos.y = startPos.y;
  45. else
  46. endPos.x = startPos.x;
  47. end
  48. else
  49. self.lockedMode = MoveLockedMode.no;
  50. end
  51. return {startPos = startPos , endPos =endPos};
  52. end
  53. function Move2DTool:moveTo(screenX, screenY)
  54. -- 转换坐标,将屏幕坐标转换成GLView的坐标
  55. local startEndPos = self:getMoveEndPos(screenX , screenY);
  56. local startPos = startEndPos.startPos;
  57. local endPos = startEndPos.endPos;
  58. -- 通过命令来移动
  59. local scale = app.setting.ScreenScale;
  60. local scale = app.setting.ScreenScale;
  61. local offset = cc.pSub(endPos , startPos)
  62. -- 增量
  63. local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0);
  64. for i , v in pairs(self.originPoies) do
  65. local originWorld = i:getParent():convertToWorldSpace(v.pos);
  66. local newWorld = cc.vec3Add(originWorld , targetOffset);
  67. local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld));
  68. i:setTranslation(newLocal);
  69. end
  70. end
  71. function Move2DTool:commandMoveTo(screenX, screenY)
  72. -- 转换坐标,将屏幕坐标转换成GLView的坐标
  73. local startEndPos = self:getMoveEndPos(screenX , screenY);
  74. local startPos = startEndPos.startPos;
  75. local endPos = startEndPos.endPos;
  76. -- 如果没有发生偏移则不需要移动
  77. if cc.pEqual(endPos, startPos) then
  78. return;
  79. end
  80. -- 通过命令来移动
  81. local commands = {};
  82. local scale = app.setting.ScreenScale;
  83. local offset = cc.pSub(endPos , startPos);
  84. -- 增量
  85. local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0);
  86. for i , v in pairs(self.originPoies) do
  87. local originWorld = i:getParent():convertToWorldSpace(v.pos);
  88. local newWorld = cc.vec3Add(originWorld , targetOffset);
  89. local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld));
  90. -- 将节点的位置恢复到原始位置
  91. i:setTranslation(v.pos);
  92. table.insert(commands, Commands:moveNode(i, newLocal));
  93. end
  94. app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  95. end
  96. function Move2DTool:commandMoveBy(offset)
  97. -- 如果没有发生偏移则不需要移动
  98. if cc.pEqual(offset, {x = 0, y = 0}) then
  99. return;
  100. end
  101. -- 增量
  102. local scale = app.setting.ScreenScale;
  103. local targetOffset = cc.vec3(offset.x, offset.y, 0);
  104. -- 通过命令来移动
  105. local commands = {};
  106. for i , v in pairs(app.editor.SelectedNodes) do
  107. local originWorld = v:getParent():convertToWorldSpace(v:getPosition());
  108. local newWorld = cc.vec3Add(originWorld , targetOffset);
  109. local newLocal = roundVec3(v:getParent():convertToNodeSpace(newWorld));
  110. -- v:setPosition(newLocal);
  111. table.insert(commands, Commands:moveNode(v, newLocal));
  112. end
  113. app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  114. end
  115. return Move2DTool;