|
-
- 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;
|