Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

270 Zeilen
6.3 KiB

  1. require("UIWidget");
  2. require("CCRectNode");
  3. local NodeEditor = class("NodeEditor" , require("Editor"));
  4. function NodeEditor:ctor()
  5. self.SelectedNodes = {}
  6. -- 节点计数器
  7. self.NodeCount = 1
  8. self.SelectedIndex = 1;
  9. end
  10. function NodeEditor:activate()
  11. -- 恢复场景的位置
  12. app.mainScene:setPosition(cc.p(0,0));
  13. -- 恢复下场景的缩放
  14. app.setting.ScreenScale = 1;
  15. app.mainScene:setScale(app.setting.ScreenScale);
  16. end
  17. function NodeEditor:unactivate()
  18. self:closeNode();
  19. end
  20. function NodeEditor:play()
  21. if self.node then
  22. self.node:playCurveAnimation();
  23. if self.node.stop then
  24. self.node:stop();
  25. end
  26. if self.node.play then
  27. self.node:play();
  28. end
  29. end
  30. end
  31. -- 是否可以选中此节点
  32. function NodeEditor:canSelectNode(flag, node)
  33. -- 忽略空节点
  34. if not flag and table.valueOfItem({"Layout", "GridLine" , "Scaler" , "Node" , "Scene"} , node.ClassName) then
  35. return false;
  36. end
  37. return true;
  38. end
  39. function NodeEditor:stop()
  40. if self.node then
  41. self.node:stopCurveAnimation();
  42. if self.node.stop then
  43. self.node:stop();
  44. end
  45. end
  46. end
  47. -- 各个派生类可以重写这个函数
  48. function NodeEditor:save(filename)
  49. NodeEditor.super.save(self, filename);
  50. --self.node:save(filename);
  51. self.node:saveToFile(filename);
  52. -- 清空undoredoManager
  53. app.undoRedoManager:clear();
  54. end
  55. -- 关闭光效
  56. function NodeEditor:closeNode()
  57. if self.node then
  58. self.node:removeFromParent();
  59. self.node = nil;
  60. end
  61. self:clearSelect();
  62. end
  63. -- 初始化光效,添加到场景中
  64. function NodeEditor:initNode(node)
  65. self.node = node
  66. app.mainLayer:addChild(self.node)
  67. end
  68. function NodeEditor:createNode(nodeType)
  69. local node = cc[nodeType]:createNode()
  70. -- 设置节点的名字
  71. node:setName(nodeType)
  72. if type(node.setDefaults) == "function" then
  73. node:setDefaults();
  74. end
  75. self:autoSetNodeName(node);
  76. return node;
  77. end
  78. -- 从文件载入节点
  79. function NodeEditor:loadNode(nodeFile)
  80. self:closeNode();
  81. --self.node = createNodeFromFile(nodeFile);
  82. self.node = tolua.cast(cc.StreamObject:loadFromFile(nodeFile) , "cc.Node3D");
  83. self:initNode(self.node);
  84. return self.node;
  85. end
  86. -- 清除所有选择
  87. function NodeEditor:clearSelect()
  88. for i , v in pairs(self.SelectedNodes) do
  89. v.selectedNode:removeFromParent();
  90. v.selectedNode = nil;
  91. end
  92. self.SelectedNodes = {};
  93. end
  94. --[[-- 通过命令清除所有选择
  95. function NodeEditor:commandClearSelect()
  96. if table.nums(self.SelectedNodes) <= 0 then
  97. return;
  98. end
  99. -- 通过command来清空选择
  100. local command = Commands:unselect(self.SelectedNodes);
  101. app.undoRedoManager:doCommand(command);
  102. end--]]
  103. -- 取消选择一个节点
  104. function NodeEditor:unSelectNode(node)
  105. if not self.SelectedNodes[node] then
  106. return
  107. end
  108. -- 去掉选择框
  109. local curNode = self.SelectedNodes[node];
  110. curNode.selectedNode:removeFromParent();
  111. curNode.selectedNode = nil;
  112. -- 从列表中去掉
  113. self.SelectedNodes[node] = nil;
  114. end
  115. -- 通过命令取消选择一个节点
  116. --[[function NodeEditor:commandUnselectNode(node)
  117. local nodes = {};
  118. table.insert(nodes, node);
  119. local command = Commands:unselect(nodes);
  120. app.undoRedoManager:doCommand(command);
  121. end--]]
  122. -- 选择一个节点
  123. function NodeEditor:selectNode(node)
  124. if self.SelectedNodes[node] then
  125. return;
  126. end
  127. self.SelectedNodes[node] = node;
  128. -- 保存计数值,记录选中的顺序
  129. node.SelectedIndex = self.SelectedIndex;
  130. self.SelectedIndex = self.SelectedIndex + 1;
  131. local rectNode = cc.RectNode:create(node);
  132. node.selectedNode = rectNode;
  133. app.mainLayer:addChild(rectNode);
  134. end
  135. -- 通过命令选择一个节点
  136. --[[function NodeEditor:commandSelectNode(node)
  137. local nodes = {};
  138. table.insert(nodes, node);
  139. local command = Commands:select(nodes);
  140. app.undoRedoManager:doCommand(command);
  141. end--]]
  142. -- 删除选中的节点
  143. function NodeEditor:deleteNode(node)
  144. -- 不在选中队列里不能删除
  145. if not self.SelectedNodes[node] then
  146. return;
  147. end
  148. -- 去掉选择框
  149. local curNode = self.SelectedNodes[node];
  150. curNode.selectedNode:removeFromParent();
  151. curNode.selectedNode = nil;
  152. -- 从列表中去掉
  153. self.SelectedNodes[node] = nil;
  154. node:removeFromParent();
  155. end
  156. -- 通过命令删除一个节点
  157. function NodeEditor:commandDeleteNode(node)
  158. local command = Commands:deleteNode(node);
  159. app.undoRedoManager:doCommand(command);
  160. end
  161. -- 删除所有选中的节点
  162. function NodeEditor:commandDeleteSelectNodes()
  163. if next(self.SelectedNodes) == nil then
  164. return;
  165. end
  166. -- 如果子节点和父节点都在删除的范围里面则只删除父节点就可以了
  167. local deleteNodes = {};
  168. for i, v in pairs(self.SelectedNodes) do
  169. if not ParentNodeIsInTable(v, self.SelectedNodes) then
  170. table.insert(deleteNodes, v);
  171. end
  172. end
  173. local commands = {};
  174. for i, v in pairs(deleteNodes) do
  175. local command = Commands:deleteNode(v);
  176. table.insert(commands, command);
  177. end
  178. -- 清空所有选中
  179. self:clearSelect();
  180. app.undoRedoManager:doCommand(Commands:batchCommand(commands));
  181. end
  182. -- 改变节点的父子关系
  183. function NodeEditor:commandModityNode(node, newParent)
  184. local command = Commands:modifyNode(node, newParent);
  185. app.undoRedoManager:doCommand(command);
  186. end
  187. -- 复制节点到另一个节点下面
  188. function NodeEditor:commandCopyNode(node, parentNode)
  189. local command = Commands:addNode(node, parentNode);
  190. app.undoRedoManager:doCommand(command);
  191. end
  192. -- 复制一个节点的动画到另一个节点下面
  193. function NodeEditor:commandCopyNodeAnim(node, parentNode)
  194. local command = Commands:copyNodeAnim(node, parentNode);
  195. app.undoRedoManager:doCommand(command);
  196. end
  197. function NodeEditor:sceneToMouse(x , y)
  198. return app.mainLayer:convertToWorldSpace(cc.p(x,y));
  199. end
  200. function NodeEditor:mouseToScene(x , y)
  201. return app.mainLayer:convertToNodeSpace(cc.p(x,y));
  202. end
  203. -- 摆放一个节点到场景中
  204. -- @nodeType 节点类型名字
  205. -- @parentNode 父节点
  206. -- @posWithMouse 鼠标的窗口位置
  207. function NodeEditor:placeNode(nodeType , parentNode , posWithMouse)
  208. local node = self:createNode(nodeType);
  209. local pNode = nil;
  210. if parentNode then
  211. pNode = parentNode;
  212. else
  213. pNode = self.node;
  214. end
  215. -- 设置世界坐标
  216. if posWithMouse then
  217. local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y);
  218. local nodePos = pNode:convertToNodeSpace(worldPos);
  219. node:setTranslation(nodePos);
  220. end
  221. -- 通过命令添加到节点树里面
  222. local command = Commands:addNode(node, pNode);
  223. app.undoRedoManager:doCommand(command);
  224. return node;
  225. end
  226. return NodeEditor;