Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

379 wiersze
10 KiB

  1. local CombineEffectEditor = class("CombineEffectEditor" , require("NodeEditor"));
  2. function CombineEffectEditor:ctor()
  3. CombineEffectEditor.super.ctor(self);
  4. -- 根节点
  5. self.node = nil;
  6. -- 源模型集合的父节点
  7. self.sourceRootNode = nil;
  8. -- 源点集合的父节点
  9. self.sourcePosRootNode = nil;
  10. -- 目标模型集合的父节点
  11. self.targetRootNode = nil;
  12. -- 目标点集合的父节点
  13. self.targetPosRootNode = nil;
  14. -- 技能action
  15. self.CombineEffectAction = nil;
  16. -- 背景场景
  17. self.SceneFile = nil;
  18. end
  19. function CombineEffectEditor:activate()
  20. -- 基类
  21. CombineEffectEditor.super.ctor(self);
  22. -- 设置锚点位置
  23. app.setting.OriginAnchor = cc.p(0.5,0.5);
  24. app:refreshSetting();
  25. -- 初始化技能环境
  26. self:initCombineEffectEnv();
  27. -- 创建一个文本框,用于显示技能是否为无限长
  28. local debugLabel = cc.Text:createNode();
  29. debugLabel:setDefaults();
  30. local config = debugLabel:getFontConfig();
  31. config.fontSize = 40;
  32. config.texColor = cc.c4b(255,0,0,255);
  33. debugLabel:setFontConfig(config);
  34. -- 获取可见视野的像素大小
  35. local screenSize = cc.Director:getInstance():getWinSizeInPixels();
  36. debugLabel:setTranslation(screenSize.width / 2 , 100 , 0)
  37. debugLabel:setText("");
  38. self.debugText = debugLabel;
  39. self.InfinityTipTextNode = cc.Scene:create()
  40. self.InfinityTipTextNode:setActiveCamera(cc.Director:getInstance():getFixedCamera())
  41. self.InfinityTipTextNode:addChild(self.debugText)
  42. app.mainScene:addChild(self.InfinityTipTextNode);
  43. self.InfinityTipTextNode:setVisible(false)
  44. end
  45. function CombineEffectEditor:unactivate()
  46. if self.SceneFile then
  47. self.SceneFile:removeFromParent();
  48. self.SceneFile = nil;
  49. end
  50. self.InfinityTipTextNode:removeFromParent();
  51. -- 清空技能环境
  52. self:unInitCombineEffectEnv();
  53. self:closeCombineEffect();
  54. end
  55. -- 是否可以选中此节点
  56. function CombineEffectEditor:canSelectNode(flag, node)
  57. return true;
  58. end
  59. -- 保存技能文件
  60. function CombineEffectEditor:save(filename)
  61. self.ce:saveToFile(filename);
  62. -- 清空undoredoManager
  63. app.undoRedoManager:clear();
  64. end
  65. -- 创建测试模型
  66. local function createTestHero(modelFile)
  67. -- 这里需要跟游戏里面保持一致
  68. -- 所有需要创建一个中间节点
  69. local heroView;
  70. local pathName , baseName , ext = string.splitFilename(modelFile);
  71. if string.lower(ext) == "gpb" then
  72. heroView = cc.Node:create();
  73. local skeleton = cc.ModelNode:create(modelFile);
  74. createHeroEntity(skeleton);
  75. skeleton.selectTest = function(rect)return false end
  76. heroView:addChild(skeleton);
  77. heroView.ModelNode = skeleton;
  78. heroView.getSelectBox = function()return skeleton:getSelectBox()end
  79. -- 默认播放站立动画
  80. --animEntity:setValue("", );
  81. else
  82. heroView = cc.Node2D:create();
  83. heroView:setContentSize(app.setting.ResourceSize);
  84. local node = createNodeFromFile(modelFile);
  85. heroView.ModelNode = node;
  86. heroView:addChild(node);
  87. heroView.getSelectBox = function()return node:getSelectBox();end;
  88. node:visitNode(function(n)
  89. n.selectTest = function(rect)return false;end;
  90. end);
  91. end
  92. return heroView;
  93. end
  94. -- 创建目标点和目标模型
  95. local function createPositionNode()
  96. local skeleton = cc.ModelNode:create("res/default/DefaultPoint/DefaultPoint.gpb");
  97. -- 默认播放站立动画
  98. --animEntity:setValue("", );
  99. return skeleton;
  100. end
  101. -- 激活技能编辑器时创建技能环境
  102. function CombineEffectEditor:initCombineEffectEnv()
  103. --创建一个源模型、源点、目标模型、目标点
  104. self.defaultCEParams = createDefaultCombineEffectParams();
  105. -- 创建所有的根节点
  106. self.node = cc.Node:create();
  107. app.mainLayer:addChild(self.node);
  108. self.sourceRootNode = cc.Node:create();
  109. self.node:addChild(self.sourceRootNode);
  110. self.sourcePosRootNode = cc.Node:create();
  111. self.node:addChild(self.sourcePosRootNode);
  112. self.targetRootNode = cc.Node:create();
  113. self.node:addChild(self.targetRootNode);
  114. self.targetPosRootNode = cc.Node:create();
  115. self.node:addChild(self.targetPosRootNode);
  116. end
  117. -- 激活技能编辑器时创建技能环境
  118. function CombineEffectEditor:unInitCombineEffectEnv()
  119. self.defaultCEParams = nil;
  120. self.node:removeFromParent();
  121. end
  122. --C#那边调用
  123. function CombineEffectEditor:createCEParamsNode(paramType, posWithMouse)
  124. local node = nil;
  125. if paramType == "SourceModel" then
  126. -- 创建一个源模型
  127. node = createTestHero(app.setting.SourceModelFile);
  128. -- 加入到节点系统
  129. self.sourceRootNode:addChild(node);
  130. elseif paramType == "TargetModel" then
  131. -- 创建一个源模型
  132. node = createTestHero(app.setting.TargetModelFile);
  133. -- 加入到节点系统
  134. self.targetRootNode:addChild(node);
  135. elseif paramType == "SourcePos" then
  136. -- 创建一个源模型
  137. node = createPositionNode();
  138. -- 加入到节点系统
  139. self.sourcePosRootNode:addChild(node);
  140. elseif paramType == "TargetPos" then
  141. -- 创建一个源模型
  142. node = createPositionNode();
  143. -- 加入到节点系统
  144. self.targetPosRootNode:addChild(node);
  145. end
  146. -- 设置世界坐标
  147. if posWithMouse then
  148. local worldPos = app.cameraController:convertScreenToWorldPos(posWithMouse.x , posWithMouse.y);
  149. local nodePos = node:getParent():convertToNodeSpace(worldPos);
  150. node:setTranslation(worldPos);
  151. end
  152. return node;
  153. end
  154. function CombineEffectEditor:play()
  155. -- 播放一个技能
  156. if self.ce == nil then
  157. return;
  158. end
  159. -- 先停止技能
  160. self:stop()
  161. -- 清空数据
  162. self.defaultCEParams.SourceNode = {};
  163. self.defaultCEParams.TargetNode = {};
  164. self.defaultCEParams.SourcePos = {};
  165. self.defaultCEParams.TargetPos = {};
  166. -- 收集技能参数
  167. self.defaultCEParams.ParentNode = app.mainLayer;
  168. self.defaultCEParams.CameraNode = app:getMainCameraShakeNode()
  169. -- 源模型
  170. for i, v in pairs(self.sourceRootNode:getChildren()) do
  171. table.insert(self.defaultCEParams.SourceNode, v.ModelNode);
  172. end
  173. -- 目标模型
  174. for i, v in pairs(self.targetRootNode:getChildren()) do
  175. table.insert(self.defaultCEParams.TargetNode, v.ModelNode);
  176. end
  177. -- 源点
  178. for i, v in pairs(self.sourcePosRootNode:getChildren()) do
  179. -- 获取坐标点
  180. local pos = getWorldPositionToNode(v, self.defaultCEParams.ParentNode);
  181. table.insert(self.defaultCEParams.SourcePos, pos);
  182. end
  183. -- 目标点
  184. for i, v in pairs(self.targetPosRootNode:getChildren()) do
  185. -- 获取坐标点
  186. local pos = getWorldPositionToNode(v, self.defaultCEParams.ParentNode);
  187. table.insert(self.defaultCEParams.TargetPos, pos);
  188. end
  189. -- 创建一个action来播放
  190. self.CombineEffectAction = cc.CombineEffectAction:createWithInstance(self.ce, self.defaultCEParams, nil, nil)
  191. self.node:runAction(self.CombineEffectAction)
  192. -- 检查技能是否为无限长
  193. self:checkCombineEffectInfinity()
  194. end
  195. function CombineEffectEditor:stop()
  196. if not tolua.isnull(self.CombineEffectAction) then
  197. self.node:stopAction(self.CombineEffectAction)
  198. self.CombineEffectAction = nil
  199. end
  200. if not tolua.isnull(self.ce) then
  201. self.ce:stop()
  202. end
  203. end
  204. -- 检测技能是否无限长
  205. function CombineEffectEditor:checkCombineEffectInfinity()
  206. if self.ce == nil then
  207. return
  208. end
  209. local text = ""
  210. local hitCount = 0;
  211. for i , v in pairs(self.ce:getChildren()) do
  212. if v:isInfinite() then
  213. text = text .. "轨迹名字:" .. v:getName() .. " 轨迹ID:" .. tostring(v:getTrackId()) .. "为无限长,请注意!!!\n";
  214. end
  215. if v:getStartEventName() == "OnHit" then
  216. hitCount = hitCount + 1;
  217. end
  218. end
  219. if hitCount ~= 1 then
  220. if hitCount == 0 then
  221. text = text .. "OnHit事件没配置,必须配置一个OnHit事件!!\n";
  222. else
  223. text = text .. "OnHit事件被配置了多于1个,只能配置一个OnHit事件!!\n";
  224. end
  225. end
  226. if text == "" then
  227. self.InfinityTipTextNode:setVisible(false)
  228. else
  229. self.debugText:setText(text);
  230. self.InfinityTipTextNode:setVisible(true)
  231. end
  232. end
  233. -- 关闭光效
  234. function CombineEffectEditor:closeCombineEffect()
  235. if not tolua.isnull(self.CombineEffectAction) then
  236. self.node:stopAction(self.CombineEffectAction)
  237. self.CombineEffectAction = nil
  238. end
  239. -- 释放技能
  240. if not tolua.isnull(self.ce) then
  241. self.ce:release()
  242. end
  243. end
  244. -- 创建新的光效
  245. function CombineEffectEditor:newCombineEffect()
  246. self:closeCombineEffect();
  247. self.ce = cc.CombineEffect:create();
  248. self.ce:retain()
  249. return self.ce;
  250. end
  251. function CombineEffectEditor:loadCombineEffect(ceFile)
  252. self:closeCombineEffect();
  253. local ce = createCombineEffect(ceFile);
  254. self.ce = ce;
  255. self.ce:retain()
  256. -- 检查技能是否为无限长
  257. self:checkCombineEffectInfinity()
  258. return self.ce;
  259. end
  260. -- 删除所有选中的节点
  261. -- 技能编辑器根其他编辑器不一样,这里不支持撤销
  262. function CombineEffectEditor:commandDeleteSelectNodes()
  263. if next(self.SelectedNodes) == nil then
  264. return;
  265. end
  266. -- 这里需要自己搜集,因为self.sourceRootNode等空节点也会被select出来所以这里需要手动搜索
  267. -- 搜集技能参数
  268. local ceNodes = {}
  269. -- 源模型
  270. for i, v in pairs(self.sourceRootNode:getChildren()) do
  271. if self.SelectedNodes[v] then
  272. table.insert(ceNodes, v);
  273. end
  274. end
  275. -- 目标模型
  276. for i, v in pairs(self.targetRootNode:getChildren()) do
  277. if self.SelectedNodes[v] then
  278. table.insert(ceNodes, v);
  279. end
  280. end
  281. -- 源点
  282. for i, v in pairs(self.sourcePosRootNode:getChildren()) do
  283. if self.SelectedNodes[v] then
  284. table.insert(ceNodes, v);
  285. end
  286. end
  287. -- 目标点
  288. for i, v in pairs(self.targetPosRootNode:getChildren()) do
  289. if self.SelectedNodes[v] then
  290. table.insert(ceNodes, v);
  291. end
  292. end
  293. for i,v in pairs(ceNodes) do
  294. self:deleteNode(v);
  295. end
  296. end
  297. -- 删除一个轨迹
  298. function CombineEffectEditor:commandDeleteTrack(track)
  299. local command = Commands:deleteTrack(self.ce, track);
  300. app.undoRedoManager:doCommand(command);
  301. end
  302. -- 通过命令创建一个轨迹
  303. function CombineEffectEditor:commandCreateTrack(trackType)
  304. local track = cc[trackType]:create();
  305. local command = Commands:createTrack(self.ce, track);
  306. app.undoRedoManager:doCommand(command);
  307. end
  308. -- 复制节点到另一个节点下面
  309. function CombineEffectEditor:commandCopyNode(track)
  310. track:setTrackId(0)
  311. local command = Commands:createTrack(self.ce, track);
  312. app.undoRedoManager:doCommand(command);
  313. end
  314. -- 设置背景场景
  315. function CombineEffectEditor:setSceneFile(sceneFile)
  316. if self.SceneFile then
  317. self.SceneFile:removeFromParent();
  318. end
  319. local node = createNodeFromFile(sceneFile);
  320. self.SceneFile = node;
  321. self.node:addChild(node);
  322. end
  323. return CombineEffectEditor;