require("UIWidget"); require("CCRectNode"); local NodeEditor = class("NodeEditor" , require("Editor")); function NodeEditor:ctor() self.SelectedNodes = {} -- 节点计数器 self.NodeCount = 1 self.SelectedIndex = 1; end function NodeEditor:activate() -- 恢复场景的位置 app.mainScene:setPosition(cc.p(0,0)); -- 恢复下场景的缩放 app.setting.ScreenScale = 1; app.mainScene:setScale(app.setting.ScreenScale); end function NodeEditor:unactivate() self:closeNode(); end function NodeEditor:play() if self.node then self.node:playCurveAnimation(); if self.node.stop then self.node:stop(); end if self.node.play then self.node:play(); end end end -- 是否可以选中此节点 function NodeEditor:canSelectNode(flag, node) -- 忽略空节点 if not flag and table.valueOfItem({"Layout", "GridLine" , "Scaler" , "Node" , "Scene"} , node.ClassName) then return false; end return true; end function NodeEditor:stop() if self.node then self.node:stopCurveAnimation(); if self.node.stop then self.node:stop(); end end end -- 各个派生类可以重写这个函数 function NodeEditor:save(filename) NodeEditor.super.save(self, filename); --self.node:save(filename); self.node:saveToFile(filename); -- 清空undoredoManager app.undoRedoManager:clear(); end -- 关闭光效 function NodeEditor:closeNode() if self.node then self.node:removeFromParent(); self.node = nil; end self:clearSelect(); end -- 初始化光效,添加到场景中 function NodeEditor:initNode(node) self.node = node app.mainLayer:addChild(self.node) end function NodeEditor:createNode(nodeType) local node = cc[nodeType]:createNode() -- 设置节点的名字 node:setName(nodeType) if type(node.setDefaults) == "function" then node:setDefaults(); end self:autoSetNodeName(node); return node; end -- 从文件载入节点 function NodeEditor:loadNode(nodeFile) self:closeNode(); --self.node = createNodeFromFile(nodeFile); self.node = tolua.cast(cc.StreamObject:loadFromFile(nodeFile) , "cc.Node3D"); self:initNode(self.node); return self.node; end -- 清除所有选择 function NodeEditor:clearSelect() for i , v in pairs(self.SelectedNodes) do v.selectedNode:removeFromParent(); v.selectedNode = nil; end self.SelectedNodes = {}; end --[[-- 通过命令清除所有选择 function NodeEditor:commandClearSelect() if table.nums(self.SelectedNodes) <= 0 then return; end -- 通过command来清空选择 local command = Commands:unselect(self.SelectedNodes); app.undoRedoManager:doCommand(command); end--]] -- 取消选择一个节点 function NodeEditor:unSelectNode(node) if not self.SelectedNodes[node] then return end -- 去掉选择框 local curNode = self.SelectedNodes[node]; curNode.selectedNode:removeFromParent(); curNode.selectedNode = nil; -- 从列表中去掉 self.SelectedNodes[node] = nil; end -- 通过命令取消选择一个节点 --[[function NodeEditor:commandUnselectNode(node) local nodes = {}; table.insert(nodes, node); local command = Commands:unselect(nodes); app.undoRedoManager:doCommand(command); end--]] -- 选择一个节点 function NodeEditor:selectNode(node) if self.SelectedNodes[node] then return; end self.SelectedNodes[node] = node; -- 保存计数值,记录选中的顺序 node.SelectedIndex = self.SelectedIndex; self.SelectedIndex = self.SelectedIndex + 1; local rectNode = cc.RectNode:create(node); node.selectedNode = rectNode; app.mainLayer:addChild(rectNode); end -- 通过命令选择一个节点 --[[function NodeEditor:commandSelectNode(node) local nodes = {}; table.insert(nodes, node); local command = Commands:select(nodes); app.undoRedoManager:doCommand(command); end--]] -- 删除选中的节点 function NodeEditor:deleteNode(node) -- 不在选中队列里不能删除 if not self.SelectedNodes[node] then return; end -- 去掉选择框 local curNode = self.SelectedNodes[node]; curNode.selectedNode:removeFromParent(); curNode.selectedNode = nil; -- 从列表中去掉 self.SelectedNodes[node] = nil; node:removeFromParent(); end -- 通过命令删除一个节点 function NodeEditor:commandDeleteNode(node) local command = Commands:deleteNode(node); app.undoRedoManager:doCommand(command); end -- 删除所有选中的节点 function NodeEditor:commandDeleteSelectNodes() if next(self.SelectedNodes) == nil then return; end -- 如果子节点和父节点都在删除的范围里面则只删除父节点就可以了 local deleteNodes = {}; for i, v in pairs(self.SelectedNodes) do if not ParentNodeIsInTable(v, self.SelectedNodes) then table.insert(deleteNodes, v); end end local commands = {}; for i, v in pairs(deleteNodes) do local command = Commands:deleteNode(v); table.insert(commands, command); end -- 清空所有选中 self:clearSelect(); app.undoRedoManager:doCommand(Commands:batchCommand(commands)); end -- 改变节点的父子关系 function NodeEditor:commandModityNode(node, newParent) local command = Commands:modifyNode(node, newParent); app.undoRedoManager:doCommand(command); end -- 复制节点到另一个节点下面 function NodeEditor:commandCopyNode(node, parentNode) local command = Commands:addNode(node, parentNode); app.undoRedoManager:doCommand(command); end -- 复制一个节点的动画到另一个节点下面 function NodeEditor:commandCopyNodeAnim(node, parentNode) local command = Commands:copyNodeAnim(node, parentNode); app.undoRedoManager:doCommand(command); end function NodeEditor:sceneToMouse(x , y) return app.mainLayer:convertToWorldSpace(cc.p(x,y)); end function NodeEditor:mouseToScene(x , y) return app.mainLayer:convertToNodeSpace(cc.p(x,y)); end -- 摆放一个节点到场景中 -- @nodeType 节点类型名字 -- @parentNode 父节点 -- @posWithMouse 鼠标的窗口位置 function NodeEditor:placeNode(nodeType , parentNode , posWithMouse) local node = self:createNode(nodeType); local pNode = nil; if parentNode then pNode = parentNode; else pNode = self.node; end -- 设置世界坐标 if posWithMouse then local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y); local nodePos = pNode:convertToNodeSpace(worldPos); node:setTranslation(nodePos); end -- 通过命令添加到节点树里面 local command = Commands:addNode(node, pNode); app.undoRedoManager:doCommand(command); return node; end return NodeEditor;