require("EditorGlobalFunction") local MoveTool = class("MoveTool") function MoveTool:ctor() self.onSelect = nil; end function MoveTool:clear() self.startPos = nil; self.originPoies = nil; if self.selectRectNode then self.selectRectNode:removeFromParent(); self.selectRectNode = nil; end end -- 计算节点是否跟矩形相交,如果相交,则插入到intersects表中 local function intersectNode(node , rect , intersects , all) -- 隐藏节点不给选中 if not node:isVisible() then return; end node:sortAllChildren(); -- 递归 local children = node:getChildren(); for i = #children , 1 , -1 do intersectNode(children[i] , rect , intersects , all) end if node:selectTest(rect) then -- 是否忽略空节点 if app.editor:canSelectNode(all, node) then table.insert(intersects , node); end end end function MoveTool:MouseDown(button , x , y) -- 按下ALT控制相机 if app.cs.getModifierKeys() == Keys.Alt then return false; end -- 不是鼠标左键按下不处理 if button ~= MouseButtons.Left then if button == MouseButtons.Right then return true; end return false; end self.startPos = cc.p(x, y); self.originPoies = {}; local size = cc.Director:getInstance():getWinSize(); local screenSize = cc.Director:getInstance():getWinSizeInPixels(); local ray = app.mainCamera:pickRay(self.startPos.x / screenSize.width , self.startPos.y / screenSize.height); --[[local hitTest = cc.PhysicsController:getInstance():rayTest(ray, 100000) if hitTest == true then print("击中目标了") end--]] -- 计算点选的区域 local rect = cc.Rectangle:new(self.startPos.x / size.width , self.startPos.y / size.height , 1 / size.width , 1 / size.height); -- 看是否点中的是已选择的,如果是,则只是记录点选位置 local hitNode; for i , v in pairs(app.editor.SelectedNodes) do if v:selectTest(rect) then hitNode = v; end end -- 没选中任何东西 if not hitNode then if self.selectRectNode then self.selectRectNode:removeFromParent(); self.selectRectNode = nil; end -- 这里需要支持撤销 --[[local commands = {}; -- 有选中的东西则需要通过命令来撤销 if next(app.editor.SelectedNodes) ~= nil then local command = Commands:unselect(app.editor.SelectedNodes); table.insert(commands, command); end--]] -- 实现Ctrl按住可以多选 if app.cs.getModifierKeys() ~= Keys.Control then app.editor:clearSelect(); end local intersects = {}; -- 递归计算哪些节点相交 intersectNode(app.editor.node , rect , intersects); -- 选中第一个 local selectedNode = intersects[1]; if selectedNode then -- 选中 app.cs.selectNodes({selectedNode}); app.editor:selectNode(selectedNode); app.cs.setPropertyObject(selectedNode); -- 通过命令来选中 --[[local command = Commands:select(intersects); table.insert(commands, command);--]] else self.selectRectNode = cc.BoxNode:create(); self.selectRectNode.startPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y); self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(self.startPos.x, self.startPos.y); -- 计算开始点 app.mainLayer:addChild(self.selectRectNode); end --app.undoRedoManager:doCommand(Commands:batchCommand(commands)); end -- 记录下所有节点的位置 for i , v in pairs(app.editor.SelectedNodes) do -- 如果自己的父节点在这个列表里面则不需要统计了 if not ParentNodeIsInTable(v, app.editor.SelectedNodes) then self.originPoies[v] = { pos = v:getTranslation(); rotate = v:getEulerRotation(); } end end return true; end -- 派生类重写 function MoveTool:moveTo(screenX, screenY) end -- 派生类重写 function MoveTool:commandMoveTo(screenX, screenY) end -- 派生类重写 function MoveTool:commandMoveBy(offset) end -- 派生类重写 function MoveTool:MouseMove(button , x , y) if not self.startPos then return end -- 计算结束点 if self.selectRectNode then self.selectRectNode.endPos = app.visibleRect:convertScreenToGLView(x, y); end self:moveTo(x, y); end function MoveTool:MouseUp(button , x , y) if button == MouseButtons.Right then local editor = app.editor; --editor:clearSelect (); local size = cc.Director:getInstance():getWinSize(); local intersects = {}; local rect = cc.Rectangle:new(x / size.width , y / size.height , 1 / size.width , 1 / size.height); -- 递归计算哪些节点相交 intersectNode(editor.node ,rect, intersects, true); local items = {}; for _ , item in pairs(intersects) do table.insert(items , { text = item:getName () ; func = function() editor:clearSelect (); editor:selectNode (item); app.cs.selectNodes ({item}); app.cs.setPropertyObject (item); end; }); end app.cs.popMenu(items,{x=x;y=y;}); return; end if not self.startPos then return end -- 计算结束点 self:commandMoveTo(x, y); -- 如果没有元素 if next(app.editor.SelectedNodes) == nil then local startPos = self.startPos; local endPos = cc.p(x, y); -- 计算框选的区域 local size = cc.Director:getInstance():getWinSize(); local rect = cc.Rectangle:new(math.min(startPos.x , endPos.x) / size.width , math.min(startPos.y , endPos.y) / size.height , math.abs(endPos.x - startPos.x) / size.width , math.abs(endPos.y - startPos.y) / size.height ); local intersects = {}; -- 计算哪些节点相交 -- 递归 intersectNode(app.editor.node , rect , intersects); -- 实现Ctrl按住可以多选 if app.cs.getModifierKeys() ~= Keys.Control then app.editor:clearSelect(); end -- 通过命令来选中 --[[local command = Commands:select(intersects); app.undoRedoManager:doCommand(command);--]] if intersects[1] then app.cs.setPropertyObject(intersects[1]); end app.cs.selectNodes(intersects); for i , v in pairs(intersects) do app.editor:selectNode(v); end end self:clear(); end function MoveTool:KeyDown(Control, Alt, Shift, KeyCode) end function MoveTool:KeyUp(Control, Alt, Shift, KeyCode) end function MoveTool:DialogKey(Control, Alt, Shift, KeyCode) if Alt then if KeyCode == Keys.Up then local maxY = 0; for i , v in pairs(app.editor.SelectedNodes) do local node = v; maxY = math.max(maxY , node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height); end for i , v in pairs(app.editor.SelectedNodes) do local node = v; local offsetY = maxY - (node:getPositionY() + node:getAnchorPoint().y * node:getContentSize().height); node:setPositionY(node:getPositionY() + offsetY); end elseif KeyCode == Keys.Down then local minY = 65536; for i , v in pairs(app.editor.SelectedNodes) do local node = v; minY = math.min(minY , node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height); end for i , v in pairs(app.editor.SelectedNodes) do local node = v; local offsetY = minY - (node:getPositionY() - node:getAnchorPoint().y * node:getContentSize().height); node:setPositionY(node:getPositionY() + offsetY); end elseif KeyCode == Keys.Left then local minX = 65536; for i , v in pairs(app.editor.SelectedNodes) do local node = v; minX = math.min(minX , node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width); end for i , v in pairs(app.editor.SelectedNodes) do local node = v; local offsetX = minX - (node:getPositionX() - node:getAnchorPoint().x * node:getContentSize().width); node:setPositionX(node:getPositionX() + offsetX); end elseif KeyCode == Keys.Right then local maxX = 0; for i , v in pairs(app.editor.SelectedNodes) do local node = v; maxX = math.max(maxX , node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width); end for i , v in pairs(app.editor.SelectedNodes) do local node = v; local offsetX = maxX - (node:getPositionX() + node:getAnchorPoint().x * node:getContentSize().width); node:setPositionX(node:getPositionX() + offsetX); end end else local offset = cc.p(0,0); if KeyCode == Keys.Up then offset.y = 1; end if KeyCode == Keys.Down then offset.y = -1; end if KeyCode == Keys.Left then offset.x = -1; end if KeyCode == Keys.Right then offset.x = 1; end self:commandMoveBy(offset); end end return MoveTool;