Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

293 рядки
8.5 KiB

  1. require("EditorGlobalFunction")
  2. local MoveTool = class("MoveTool")
  3. function MoveTool:ctor()
  4. self.onSelect = nil;
  5. end
  6. function MoveTool:clear()
  7. self.startPos = nil;
  8. self.originPoies = nil;
  9. if self.selectRectNode then
  10. self.selectRectNode:removeFromParent();
  11. self.selectRectNode = nil;
  12. end
  13. end
  14. -- 计算节点是否跟矩形相交,如果相交,则插入到intersects表中
  15. local function intersectNode(node , rect , intersects , all)
  16. -- 隐藏节点不给选中
  17. if not node:isVisible() then
  18. return;
  19. end
  20. node:sortAllChildren();
  21. -- 递归
  22. local children = node:getChildren();
  23. for i = #children , 1 , -1 do
  24. intersectNode(children[i] , rect , intersects , all)
  25. end
  26. if node:selectTest(rect) then
  27. -- 是否忽略空节点
  28. if app.editor:canSelectNode(all, node) then
  29. table.insert(intersects , node);
  30. end
  31. end
  32. end
  33. function MoveTool:MouseDown(button , x , y)
  34. -- 按下ALT控制相机
  35. if app.cs.getModifierKeys() == Keys.Alt then
  36. return false;
  37. end
  38. -- 不是鼠标左键按下不处理
  39. if button ~= MouseButtons.Left then
  40. if button == MouseButtons.Right then
  41. return true;
  42. end
  43. return false;
  44. end
  45. self.startPos = cc.p(x, y);
  46. self.originPoies = {};
  47. local size = cc.Director:getInstance():getWinSize();
  48. local screenSize = cc.Director:getInstance():getWinSizeInPixels();
  49. local ray = app.mainCamera:pickRay(self.startPos.x / screenSize.width , self.startPos.y / screenSize.height);
  50. --[[local hitTest = cc.PhysicsController:getInstance():rayTest(ray, 100000)
  51. if hitTest == true then
  52. print("击中目标了")
  53. end--]]
  54. -- 计算点选的区域
  55. local rect = cc.Rectangle:new(self.startPos.x / size.width , self.startPos.y / size.height , 1 / size.width , 1 / size.height);
  56. -- 看是否点中的是已选择的,如果是,则只是记录点选位置
  57. local hitNode;
  58. for i , v in pairs(app.editor.SelectedNodes) do
  59. if v:selectTest(rect) then
  60. hitNode = v;
  61. end
  62. end
  63. -- 没选中任何东西
  64. if not hitNode then
  65. if self.selectRectNode then
  66. self.selectRectNode:removeFromParent();
  67. self.selectRectNode = nil;
  68. end
  69. -- 这里需要支持撤销
  70. --[[local commands = {};
  71. -- 有选中的东西则需要通过命令来撤销
  72. if next(app.editor.SelectedNodes) ~= nil then
  73. local command = Commands:unselect(app.editor.SelectedNodes);
  74. table.insert(commands, command);
  75. end--]]
  76. -- 实现Ctrl按住可以多选
  77. if app.cs.getModifierKeys() ~= Keys.Control then
  78. app.editor:clearSelect();
  79. end
  80. local intersects = {};
  81. -- 递归计算哪些节点相交
  82. intersectNode(app.editor.node , rect , intersects);
  83. -- 选中第一个
  84. local selectedNode = intersects[1];
  85. if selectedNode then
  86. -- 选中
  87. app.cs.selectNodes({selectedNode});
  88. app.editor:selectNode(selectedNode);
  89. app.cs.setPropertyObject(selectedNode);
  90. -- 通过命令来选中
  91. --[[local command = Commands:select(intersects);
  92. table.insert(commands, command);--]]
  93. else
  94. self.selectRectNode = cc.BoxNode:create();
  95. self.selectRectNode.startPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y);
  96. self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y);
  97. -- 计算开始点
  98. app.mainLayer:addChild(self.selectRectNode);
  99. end
  100. --app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  101. end
  102. -- 记录下所有节点的位置
  103. for i , v in pairs(app.editor.SelectedNodes) do
  104. -- 如果自己的父节点在这个列表里面则不需要统计了
  105. if not ParentNodeIsInTable(v, app.editor.SelectedNodes) then
  106. self.originPoies[v] =
  107. {
  108. pos = v:getTranslation();
  109. rotate = v:getEulerRotation();
  110. }
  111. end
  112. end
  113. return true;
  114. end
  115. -- 派生类重写
  116. function MoveTool:moveTo(screenX, screenY)
  117. end
  118. -- 派生类重写
  119. function MoveTool:commandMoveTo(screenX, screenY)
  120. end
  121. -- 派生类重写
  122. function MoveTool:commandMoveBy(offset)
  123. end
  124. -- 派生类重写
  125. function MoveTool:MouseMove(button , x , y)
  126. if not self.startPos then return end
  127. -- 计算结束点
  128. if self.selectRectNode then
  129. self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(x, y);
  130. end
  131. self:moveTo(x, y);
  132. end
  133. function MoveTool:MouseUp(button , x , y)
  134. if button == MouseButtons.Right then
  135. local editor = app.editor;
  136. --editor:clearSelect ();
  137. local size = cc.Director:getInstance():getWinSize();
  138. local intersects = {};
  139. local rect = cc.Rectangle:new(x / size.width , y / size.height , 1 / size.width , 1 / size.height);
  140. -- 递归计算哪些节点相交
  141. intersectNode(editor.node ,rect, intersects, true);
  142. local items = {};
  143. for _ , item in pairs(intersects) do
  144. table.insert(items , {
  145. text = item:getName () ;
  146. func = function()
  147. editor:clearSelect ();
  148. editor:selectNode (item);
  149. app.cs.selectNodes ({item});
  150. app.cs.setPropertyObject (item);
  151. end;
  152. });
  153. end
  154. app.cs.popMenu(items,{x=x;y=y;});
  155. return;
  156. end
  157. if not self.startPos then return end
  158. -- 计算结束点
  159. self:commandMoveTo(x, y);
  160. -- 如果没有元素
  161. if next(app.editor.SelectedNodes) == nil then
  162. local startPos = self.startPos;
  163. local endPos = cc.p(x, y);
  164. -- 计算框选的区域
  165. local size = cc.Director:getInstance():getWinSize();
  166. local rect = cc.Rectangle:new(math.min(startPos.x , endPos.x) / size.width
  167. , math.min(startPos.y , endPos.y) / size.height
  168. , math.abs(endPos.x - startPos.x) / size.width
  169. , math.abs(endPos.y - startPos.y) / size.height
  170. );
  171. local intersects = {};
  172. -- 计算哪些节点相交
  173. -- 递归
  174. intersectNode(app.editor.node , rect , intersects);
  175. -- 实现Ctrl按住可以多选
  176. if app.cs.getModifierKeys() ~= Keys.Control then
  177. app.editor:clearSelect();
  178. end
  179. -- 通过命令来选中
  180. --[[local command = Commands:select(intersects);
  181. app.undoRedoManager:doCommand(command);--]]
  182. if intersects[1] then
  183. app.cs.setPropertyObject(intersects[1]);
  184. end
  185. app.cs.selectNodes(intersects);
  186. for i , v in pairs(intersects) do
  187. app.editor:selectNode(v);
  188. end
  189. end
  190. self:clear();
  191. end
  192. function MoveTool:KeyDown(Control, Alt, Shift, KeyCode)
  193. end
  194. function MoveTool:KeyUp(Control, Alt, Shift, KeyCode)
  195. end
  196. function MoveTool:DialogKey(Control, Alt, Shift, KeyCode)
  197. if Alt then
  198. if KeyCode == Keys.Up then
  199. local maxY = 0;
  200. for i , v in pairs(app.editor.SelectedNodes) do
  201. local node = v;
  202. maxY = math.max(maxY , node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height);
  203. end
  204. for i , v in pairs(app.editor.SelectedNodes) do
  205. local node = v;
  206. local offsetY = maxY - (node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height);
  207. node:setPositionY(node:getPositionY() + offsetY);
  208. end
  209. elseif KeyCode == Keys.Down then
  210. local minY = 65536;
  211. for i , v in pairs(app.editor.SelectedNodes) do
  212. local node = v;
  213. minY = math.min(minY , node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height);
  214. end
  215. for i , v in pairs(app.editor.SelectedNodes) do
  216. local node = v;
  217. local offsetY = minY - (node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height);
  218. node:setPositionY(node:getPositionY() + offsetY);
  219. end
  220. elseif KeyCode == Keys.Left then
  221. local minX = 65536;
  222. for i , v in pairs(app.editor.SelectedNodes) do
  223. local node = v;
  224. minX = math.min(minX , node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width);
  225. end
  226. for i , v in pairs(app.editor.SelectedNodes) do
  227. local node = v;
  228. local offsetX = minX - (node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width);
  229. node:setPositionX(node:getPositionX() + offsetX);
  230. end
  231. elseif KeyCode == Keys.Right then
  232. local maxX = 0;
  233. for i , v in pairs(app.editor.SelectedNodes) do
  234. local node = v;
  235. maxX = math.max(maxX , node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width);
  236. end
  237. for i , v in pairs(app.editor.SelectedNodes) do
  238. local node = v;
  239. local offsetX = maxX - (node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width);
  240. node:setPositionX(node:getPositionX() + offsetX);
  241. end
  242. end
  243. else
  244. local offset = cc.p(0,0);
  245. if KeyCode == Keys.Up then
  246. offset.y = 1;
  247. end
  248. if KeyCode == Keys.Down then
  249. offset.y = -1;
  250. end
  251. if KeyCode == Keys.Left then
  252. offset.x = -1;
  253. end
  254. if KeyCode == Keys.Right then
  255. offset.x = 1;
  256. end
  257. self:commandMoveBy(offset);
  258. end
  259. end
  260. return MoveTool;