MoveLockedMode = { no = 0; x = 1; y = 2; } -- 2D平移工具功能 local Move2DTool = class("Move2DTool", require("MoveTool")) function Move2DTool:ctor() -- 当前锁定模式 self.lockedMode = MoveLockedMode.no; self.super.ctor(self); end function Move2DTool:clear() self.super.clear(self); end function Move2DTool:MouseDown(button , x , y) self.super.MouseDown(self, button, x, y) end local function roundVec3(vec) vec.x = math.floor(vec.x + 0.5) vec.y = math.floor(vec.y + 0.5) vec.z = math.floor(vec.z + 0.5) return vec; end -- 根据Shift键决定锁定哪个轴,并返回移动目标 function Move2DTool:getMoveEndPos(screenX , screenY) -- 转换坐标,将屏幕坐标转换成GLView的坐标 local startPos = app.visibleRect:convertScreenToGLView(self.startPos.x , self.startPos.y); local endPos = app.visibleRect:convertScreenToGLView(screenX , screenY); local key = app.cs.getModifierKeys(); -- Shift锁定横竖移动 if key == Keys.Shift then if self.lockedMode == MoveLockedMode.no then -- x 方向移动的距离更远 if math.abs(endPos.x - startPos.x) > math.abs(endPos.y - startPos.y) then self.lockedMode = MoveLockedMode.x; else self.lockedMode = MoveLockedMode.y; end end -- x 方向移动的距离更远 if self.lockedMode == MoveLockedMode.x then endPos.y = startPos.y; else endPos.x = startPos.x; end else self.lockedMode = MoveLockedMode.no; end return {startPos = startPos , endPos =endPos}; end function Move2DTool:moveTo(screenX, screenY) -- 转换坐标,将屏幕坐标转换成GLView的坐标 local startEndPos = self:getMoveEndPos(screenX , screenY); local startPos = startEndPos.startPos; local endPos = startEndPos.endPos; -- 通过命令来移动 local scale = app.setting.ScreenScale; local scale = app.setting.ScreenScale; local offset = cc.pSub(endPos , startPos) -- 增量 local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0); for i , v in pairs(self.originPoies) do local originWorld = i:getParent():convertToWorldSpace(v.pos); local newWorld = cc.vec3Add(originWorld , targetOffset); local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld)); i:setTranslation(newLocal); end end function Move2DTool:commandMoveTo(screenX, screenY) -- 转换坐标,将屏幕坐标转换成GLView的坐标 local startEndPos = self:getMoveEndPos(screenX , screenY); local startPos = startEndPos.startPos; local endPos = startEndPos.endPos; -- 如果没有发生偏移则不需要移动 if cc.pEqual(endPos, startPos) then return; end -- 通过命令来移动 local commands = {}; local scale = app.setting.ScreenScale; local offset = cc.pSub(endPos , startPos); -- 增量 local targetOffset = cc.vec3(offset.x / scale, offset.y / scale, 0); for i , v in pairs(self.originPoies) do local originWorld = i:getParent():convertToWorldSpace(v.pos); local newWorld = cc.vec3Add(originWorld , targetOffset); local newLocal = roundVec3(i:getParent():convertToNodeSpace(newWorld)); -- 将节点的位置恢复到原始位置 i:setTranslation(v.pos); table.insert(commands, Commands:moveNode(i, newLocal)); end app.undoRedoManager:doCommand(Commands:batchCommand(commands)); end function Move2DTool:commandMoveBy(offset) -- 如果没有发生偏移则不需要移动 if cc.pEqual(offset, {x = 0, y = 0}) then return; end -- 增量 local scale = app.setting.ScreenScale; local targetOffset = cc.vec3(offset.x, offset.y, 0); -- 通过命令来移动 local commands = {}; for i , v in pairs(app.editor.SelectedNodes) do local originWorld = v:getParent():convertToWorldSpace(v:getPosition()); local newWorld = cc.vec3Add(originWorld , targetOffset); local newLocal = roundVec3(v:getParent():convertToNodeSpace(newWorld)); -- v:setPosition(newLocal); table.insert(commands, Commands:moveNode(v, newLocal)); end app.undoRedoManager:doCommand(Commands:batchCommand(commands)); end return Move2DTool;