cocos2d-cli 1.6.5 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/data/script_map.json +25 -25
  2. package/dist/bin/cocos2d-cli.js +64 -0
  3. package/dist/src/commands/add-component.js +3 -0
  4. package/dist/src/commands/add.js +3 -0
  5. package/dist/src/commands/build.js +6 -0
  6. package/dist/src/commands/create-scene.js +3 -0
  7. package/dist/src/commands/get.js +3 -0
  8. package/dist/src/commands/prefab-create.js +109 -0
  9. package/dist/src/commands/remove-component.js +3 -0
  10. package/dist/src/commands/remove.js +3 -0
  11. package/dist/src/commands/screenshot.js +41 -0
  12. package/dist/src/commands/set-component.js +3 -0
  13. package/dist/src/commands/set.js +3 -0
  14. package/dist/src/commands/tree.js +24 -0
  15. package/{src → dist/src}/lib/cc/CCButton.js +115 -122
  16. package/{src → dist/src}/lib/cc/CCCamera.js +83 -93
  17. package/{src → dist/src}/lib/cc/CCCanvas.js +49 -54
  18. package/{src → dist/src}/lib/cc/CCColor.js +30 -32
  19. package/{src → dist/src}/lib/cc/CCComponent.js +39 -60
  20. package/{src → dist/src}/lib/cc/CCLabel.js +139 -146
  21. package/{src → dist/src}/lib/cc/CCNode.js +190 -256
  22. package/{src → dist/src}/lib/cc/CCObject.js +19 -23
  23. package/{src → dist/src}/lib/cc/CCPrefab.js +219 -242
  24. package/{src → dist/src}/lib/cc/CCRect.js +30 -32
  25. package/{src → dist/src}/lib/cc/CCRichText.js +38 -44
  26. package/{src → dist/src}/lib/cc/CCScene.js +32 -42
  27. package/dist/src/lib/cc/CCSceneAsset.js +242 -0
  28. package/{src → dist/src}/lib/cc/CCSize.js +22 -26
  29. package/{src → dist/src}/lib/cc/CCSprite.js +82 -94
  30. package/{src → dist/src}/lib/cc/CCTrs.js +49 -74
  31. package/{src → dist/src}/lib/cc/CCVec2.js +22 -26
  32. package/{src → dist/src}/lib/cc/CCVec3.js +26 -29
  33. package/{src → dist/src}/lib/cc/CCWidget.js +94 -98
  34. package/dist/src/lib/fire-utils.js +86 -0
  35. package/dist/src/lib/json-parser.js +114 -0
  36. package/dist/src/lib/node-utils.js +131 -0
  37. package/{src → dist/src}/lib/screenshot-core.js +242 -285
  38. package/dist/src/lib/templates.js +17 -0
  39. package/dist/src/lib/utils.js +81 -0
  40. package/package.json +40 -33
  41. package/bin/cocos2d-cli.js +0 -152
  42. package/src/commands/add-component.js +0 -112
  43. package/src/commands/add.js +0 -177
  44. package/src/commands/build.js +0 -78
  45. package/src/commands/create-scene.js +0 -181
  46. package/src/commands/get.js +0 -108
  47. package/src/commands/prefab-create.js +0 -111
  48. package/src/commands/remove-component.js +0 -111
  49. package/src/commands/remove.js +0 -99
  50. package/src/commands/screenshot.js +0 -108
  51. package/src/commands/set-component.js +0 -119
  52. package/src/commands/set.js +0 -107
  53. package/src/commands/tree.js +0 -29
  54. package/src/lib/cc/CCSceneAsset.js +0 -303
  55. package/src/lib/cc/index.js +0 -42
  56. package/src/lib/fire-utils.js +0 -374
  57. package/src/lib/json-parser.js +0 -185
  58. package/src/lib/node-utils.js +0 -395
  59. package/src/lib/screenshot/favicon.ico +0 -0
  60. package/src/lib/screenshot/index.html +0 -30
  61. package/src/lib/templates.js +0 -49
  62. package/src/lib/utils.js +0 -202
@@ -1,181 +0,0 @@
1
- /**
2
- * create-scene 命令 - 创建场景文件
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { CCNode, CCScene, CCSceneAsset, CCCanvas, CCWidget, CCCamera } = require('../lib/cc');
8
- const { buildTree } = require('../lib/node-utils');
9
- const { loadScriptMap, createSceneMeta, saveMetaFile } = require('../lib/fire-utils');
10
- const { generateUUID, generateCompressedUUID } = require('../lib/utils');
11
- const { fromJSON } = require('../lib/json-parser');
12
-
13
- /**
14
- * 从项目配置读取设计分辨率
15
- */
16
- function getDesignResolution(outputPath) {
17
- const defaultResolution = { width: 960, height: 640 };
18
-
19
- let currentDir = path.dirname(path.resolve(outputPath));
20
- while (currentDir !== path.dirname(currentDir)) {
21
- const settingsPath = path.join(currentDir, 'settings', 'project.json');
22
- if (fs.existsSync(settingsPath)) {
23
- try {
24
- const config = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
25
- if (config['design-resolution-width'] && config['design-resolution-height']) {
26
- return {
27
- width: config['design-resolution-width'],
28
- height: config['design-resolution-height']
29
- };
30
- }
31
- } catch (e) {}
32
- }
33
- currentDir = path.dirname(currentDir);
34
- }
35
-
36
- return defaultResolution;
37
- }
38
-
39
- /**
40
- * 从 meta 文件读取 uuid
41
- */
42
- function readUuidFromMeta(scenePath) {
43
- const metaPath = scenePath + '.meta';
44
- if (fs.existsSync(metaPath)) {
45
- try {
46
- const meta = JSON.parse(fs.readFileSync(metaPath, 'utf8'));
47
- return meta.uuid || null;
48
- } catch (e) {
49
- return null;
50
- }
51
- }
52
- return null;
53
- }
54
-
55
- /**
56
- * 为节点树设置 _id
57
- */
58
- function setNodeId(node) {
59
- node._id = generateCompressedUUID();
60
- if (node._children) {
61
- node._children.forEach(child => setNodeId(child));
62
- }
63
- }
64
-
65
- /**
66
- * 创建默认场景结构(Canvas + Main Camera)
67
- */
68
- function createDefaultScene(asset, resolution) {
69
- const { width, height } = resolution;
70
- const scene = asset._scene;
71
-
72
- // 创建 Canvas 节点
73
- const canvas = new CCNode('Canvas');
74
- canvas._contentSize.width = width;
75
- canvas._contentSize.height = height;
76
- canvas._anchorPoint.x = 0.5;
77
- canvas._anchorPoint.y = 0.5;
78
- canvas._trs.array[0] = width / 2;
79
- canvas._trs.array[1] = height / 2;
80
- canvas._is3DNode = false;
81
- canvas._id = generateCompressedUUID();
82
-
83
- // Canvas 组件
84
- const canvasComp = new CCCanvas();
85
- canvasComp._designResolution.set(width, height);
86
- canvas.addChild(canvasComp);
87
-
88
- // Widget 组件
89
- const widget = new CCWidget();
90
- widget.node = canvas;
91
-
92
- canvas._components = [canvasComp, widget];
93
- canvas._parent = scene;
94
- scene._children = [canvas];
95
-
96
- // 创建 Main Camera 节点
97
- const camera = new CCNode('Main Camera');
98
- camera._id = generateCompressedUUID();
99
-
100
- // Camera 组件
101
- const cameraComp = new CCCamera();
102
- cameraComp.node = camera;
103
-
104
- camera._components = [cameraComp];
105
- camera._parent = canvas;
106
- canvas._children = [camera];
107
- }
108
-
109
- function run(args) {
110
- if (args.length < 1) {
111
- console.log(JSON.stringify({ error: '用法: cocos2d-cli create-scene [JSON文件路径] <输出路径.fire>' }));
112
- console.log(JSON.stringify({ hint: '不传 JSON 则创建默认场景(含 Canvas 和 Main Camera)' }));
113
- return;
114
- }
115
-
116
- let jsonPath = null;
117
- let outputPath;
118
-
119
- if (args.length === 1) {
120
- outputPath = args[0];
121
- } else {
122
- jsonPath = args[0];
123
- outputPath = args[1];
124
- }
125
-
126
- const sceneName = path.basename(outputPath, '.fire');
127
-
128
- try {
129
- // 创建场景
130
- const asset = new CCSceneAsset();
131
- const scene = new CCScene(sceneName);
132
- asset._scene = scene;
133
- scene._children = [];
134
-
135
- // 从 JSON 创建
136
- if (jsonPath && fs.existsSync(jsonPath)) {
137
- const input = fs.readFileSync(jsonPath, 'utf8');
138
- const nodeDef = JSON.parse(input.replace(/^\uFEFF/, '').trim());
139
-
140
- const nodes = Array.isArray(nodeDef) ? nodeDef : [nodeDef];
141
- for (const def of nodes) {
142
- const node = fromJSON(def);
143
- setNodeId(node);
144
- node._parent = scene;
145
- scene._children.push(node);
146
- }
147
- } else {
148
- // 没有 JSON,创建默认场景结构
149
- const resolution = getDesignResolution(outputPath);
150
- createDefaultScene(asset, resolution);
151
- }
152
-
153
- // 确保目录存在
154
- const dir = path.dirname(outputPath);
155
- if (!fs.existsSync(dir)) {
156
- fs.mkdirSync(dir, { recursive: true });
157
- }
158
-
159
- // 设置 Scene._id
160
- const uuid = readUuidFromMeta(outputPath);
161
- scene._id = uuid || generateUUID();
162
-
163
- // 保存
164
- const data = asset.toJSON();
165
- fs.writeFileSync(outputPath, JSON.stringify(data, null, 2), 'utf8');
166
-
167
- // 生成并保存 meta 文件(如果不存在)
168
- if (!uuid) {
169
- saveMetaFile(outputPath, createSceneMeta(scene._id));
170
- }
171
-
172
- // 输出 tree
173
- const scriptMap = loadScriptMap(outputPath);
174
- console.log(buildTree(data, scriptMap, 1).trim());
175
-
176
- } catch (err) {
177
- console.log(JSON.stringify({ error: err.message }));
178
- }
179
- }
180
-
181
- module.exports = { run };
@@ -1,108 +0,0 @@
1
- /**
2
- * get 命令 - 获取节点或组件属性
3
- */
4
-
5
- const path = require('path');
6
- const fs = require('fs');
7
- const { CCSceneAsset, CCPrefab } = require('../lib/cc');
8
-
9
- /**
10
- * 查找节点
11
- */
12
- function findNode(root, nodePath) {
13
- if (!nodePath) return root;
14
-
15
- const parts = nodePath.split('/').filter(p => p);
16
- if (parts.length === 0) return root;
17
-
18
- let current = root;
19
-
20
- if (parts[0] === root._name) {
21
- parts.shift();
22
- }
23
-
24
- for (const part of parts) {
25
- if (!current._children || current._children.length === 0) return null;
26
- const found = current._children.find(c => c._name === part);
27
- if (!found) return null;
28
- current = found;
29
- }
30
-
31
- return current;
32
- }
33
-
34
- /**
35
- * 查找组件
36
- */
37
- function findComponent(node, compType) {
38
- if (!node._components) return null;
39
-
40
- const type = compType.toLowerCase();
41
- const typeName = 'cc.' + type.charAt(0).toUpperCase() + type.slice(1);
42
-
43
- return node._components.find(c => c.__type__ === typeName);
44
- }
45
-
46
- function run(args) {
47
- if (args.length < 2) {
48
- console.log(JSON.stringify({ error: '用法: cocos2d-cli get <场景.fire|预制体.prefab> <节点路径> [属性名|组件类型]' }));
49
- return;
50
- }
51
-
52
- const filePath = args[0];
53
- const nodePath = args[1];
54
- const propOrComp = args[2];
55
-
56
- const ext = path.extname(filePath).toLowerCase();
57
-
58
- try {
59
- let root;
60
- const json = JSON.parse(fs.readFileSync(filePath, 'utf8'));
61
-
62
- if (ext === '.fire') {
63
- const asset = CCSceneAsset.fromJSON(json);
64
- root = asset._scene;
65
- } else if (ext === '.prefab') {
66
- const asset = CCPrefab.fromJSON(json);
67
- root = asset._root;
68
- } else {
69
- console.log(JSON.stringify({ error: '不支持的文件类型,仅支持 .fire 和 .prefab' }));
70
- return;
71
- }
72
-
73
- const node = findNode(root, nodePath);
74
-
75
- if (!node) {
76
- console.log(JSON.stringify({ error: `节点不存在: ${nodePath}` }));
77
- return;
78
- }
79
-
80
- // 没有指定属性或组件,返回节点所有属性
81
- if (!propOrComp) {
82
- const props = node.getProp ? node.getProp() : {};
83
- console.log(JSON.stringify(props, null, 2));
84
- return;
85
- }
86
-
87
- // 检查是否是组件类型
88
- const comp = findComponent(node, propOrComp);
89
- if (comp) {
90
- const props = comp.getProp ? comp.getProp() : {};
91
- console.log(JSON.stringify(props, null, 2));
92
- return;
93
- }
94
-
95
- // 返回节点的单个属性
96
- const nodeProps = node.getProp ? node.getProp() : {};
97
- if (nodeProps[propOrComp] !== undefined) {
98
- console.log(JSON.stringify({ [propOrComp]: nodeProps[propOrComp] }, null, 2));
99
- } else {
100
- console.log(JSON.stringify({ error: `属性不存在: ${propOrComp}` }));
101
- }
102
-
103
- } catch (err) {
104
- console.log(JSON.stringify({ error: err.message }));
105
- }
106
- }
107
-
108
- module.exports = { run };
@@ -1,111 +0,0 @@
1
- /**
2
- * prefab-create 命令 - 从 JSON 结构创建预制体文件
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
- const { outputError } = require('../lib/utils');
8
- const { buildTree } = require('../lib/node-utils');
9
- const { createPrefab } = require('../lib/templates');
10
- const { CCPrefab, CCPrefabInfo } = require('../lib/cc');
11
- const { loadScriptMap, createPrefabMeta, saveMetaFile } = require('../lib/fire-utils');
12
- const { fromJSON } = require('../lib/json-parser');
13
-
14
- /**
15
- * 为节点树添加 PrefabInfo
16
- */
17
- function addPrefabInfo(node, isRoot = false) {
18
- node._prefab = new CCPrefabInfo();
19
-
20
- if (node._children) {
21
- node._children.forEach(child => addPrefabInfo(child, false));
22
- }
23
- }
24
-
25
- function run(args) {
26
- if (args.length < 1) {
27
- outputError({
28
- message: '用法: cocos2d-cli create-prefab [JSON文件路径] <输出路径.prefab>',
29
- hint: '不传 JSON 则创建默认预制体'
30
- });
31
- return;
32
- }
33
-
34
- let jsonPath = null;
35
- let outputPath;
36
-
37
- if (args.length === 1) {
38
- outputPath = args[0];
39
- } else {
40
- jsonPath = args[0];
41
- outputPath = args[1];
42
- }
43
-
44
- const prefabName = path.basename(outputPath, '.prefab');
45
-
46
- try {
47
- // 没有传 JSON,创建默认预制体
48
- if (!jsonPath) {
49
- if (fs.existsSync(outputPath)) {
50
- outputError(`文件已存在: ${outputPath}`);
51
- return;
52
- }
53
-
54
- const dir = path.dirname(outputPath);
55
- if (!fs.existsSync(dir)) {
56
- fs.mkdirSync(dir, { recursive: true });
57
- }
58
-
59
- const prefab = createPrefab(prefabName);
60
- const data = prefab.toJSON();
61
- fs.writeFileSync(outputPath, JSON.stringify(data, null, 2), 'utf8');
62
-
63
- // 生成并保存 meta 文件
64
- saveMetaFile(outputPath, createPrefabMeta());
65
-
66
- const scriptMap = loadScriptMap(outputPath);
67
- console.log(buildTree(data, scriptMap, 1).trim());
68
- return;
69
- }
70
-
71
- // 从 JSON 文件创建
72
- if (!fs.existsSync(jsonPath)) {
73
- outputError(`JSON 文件不存在: ${jsonPath}`);
74
- return;
75
- }
76
-
77
- const input = fs.readFileSync(jsonPath, 'utf8');
78
- const rootNode = fromJSON(input);
79
-
80
- // 确保根节点名称
81
- if (!rootNode._name || rootNode._name === 'Node') {
82
- rootNode._name = prefabName;
83
- }
84
-
85
- // 为所有节点添加 PrefabInfo
86
- addPrefabInfo(rootNode, true);
87
-
88
- // 创建预制体
89
- const prefab = new CCPrefab();
90
- prefab._root = rootNode;
91
-
92
- const outputDir = path.dirname(outputPath);
93
- if (!fs.existsSync(outputDir)) {
94
- fs.mkdirSync(outputDir, { recursive: true });
95
- }
96
-
97
- const data = prefab.toJSON();
98
- fs.writeFileSync(outputPath, JSON.stringify(data, null, 2), 'utf8');
99
-
100
- // 生成并保存 meta 文件
101
- saveMetaFile(outputPath, createPrefabMeta());
102
-
103
- const scriptMap = loadScriptMap(outputPath);
104
- console.log(buildTree(data, scriptMap, 1).trim());
105
-
106
- } catch (err) {
107
- outputError(err.message);
108
- }
109
- }
110
-
111
- module.exports = { run };
@@ -1,111 +0,0 @@
1
- /**
2
- * remove-component 命令 - 移除组件
3
- */
4
-
5
- const path = require('path');
6
- const fs = require('fs');
7
- const { CCSceneAsset, CCPrefab } = require('../lib/cc');
8
- const { buildTree } = require('../lib/node-utils');
9
- const { loadScriptMap, isPrefab } = require('../lib/fire-utils');
10
-
11
- /**
12
- * 查找节点
13
- */
14
- function findNode(root, path) {
15
- if (!path) return root;
16
-
17
- const parts = path.split('/').filter(p => p);
18
- if (parts.length === 0) return root;
19
-
20
- let current = root;
21
-
22
- if (parts[0] === root._name) {
23
- parts.shift();
24
- }
25
-
26
- for (const part of parts) {
27
- if (!current._children || current._children.length === 0) return null;
28
- const found = current._children.find(c => c._name === part);
29
- if (!found) return null;
30
- current = found;
31
- }
32
-
33
- return current;
34
- }
35
-
36
- /**
37
- * 查找组件
38
- */
39
- function findComponent(node, compType) {
40
- if (!node._components) return null;
41
-
42
- const type = compType.toLowerCase();
43
- const typeName = 'cc.' + type.charAt(0).toUpperCase() + type.slice(1);
44
-
45
- return node._components.find(c => c.__type__ === typeName);
46
- }
47
-
48
- function run(args) {
49
- if (args.length < 3) {
50
- console.log(JSON.stringify({ error: '用法: cocos2d-cli remove-component <场景.fire|预制体.prefab> <节点路径> <组件类型>' }));
51
- return;
52
- }
53
-
54
- const filePath = args[0];
55
- const nodePath = args[1];
56
- const compType = args[2];
57
-
58
- const ext = path.extname(filePath).toLowerCase();
59
-
60
- try {
61
- let root;
62
- let asset;
63
- const json = JSON.parse(fs.readFileSync(filePath, 'utf8'));
64
-
65
- if (ext === '.fire') {
66
- asset = CCSceneAsset.fromJSON(json);
67
- root = asset._scene;
68
- } else if (ext === '.prefab') {
69
- asset = CCPrefab.fromJSON(json);
70
- root = asset._root;
71
- } else {
72
- console.log(JSON.stringify({ error: '不支持的文件类型,仅支持 .fire 和 .prefab' }));
73
- return;
74
- }
75
-
76
- const node = findNode(root, nodePath);
77
-
78
- if (!node) {
79
- console.log(JSON.stringify({ error: `节点不存在: ${nodePath}` }));
80
- return;
81
- }
82
-
83
- const comp = findComponent(node, compType);
84
-
85
- if (!comp) {
86
- console.log(JSON.stringify({ error: `组件不存在: ${compType}` }));
87
- return;
88
- }
89
-
90
- // 移除组件
91
- const idx = node._components.indexOf(comp);
92
- if (idx > -1) {
93
- node._components.splice(idx, 1);
94
- }
95
-
96
- // 保存
97
- const data = asset.toJSON();
98
- fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8');
99
-
100
- // 输出节点树
101
- const scriptMap = loadScriptMap(filePath);
102
- const prefab = isPrefab(data);
103
- const startIndex = prefab ? 0 : 1;
104
- console.log(buildTree(data, scriptMap, startIndex).trim());
105
-
106
- } catch (err) {
107
- console.log(JSON.stringify({ error: err.message }));
108
- }
109
- }
110
-
111
- module.exports = { run };
@@ -1,99 +0,0 @@
1
- /**
2
- * remove 命令 - 删除节点
3
- */
4
-
5
- const path = require('path');
6
- const fs = require('fs');
7
- const { CCSceneAsset, CCPrefab } = require('../lib/cc');
8
- const { buildTree } = require('../lib/node-utils');
9
- const { loadScriptMap, isPrefab } = require('../lib/fire-utils');
10
-
11
- /**
12
- * 查找节点
13
- */
14
- function findNode(root, path) {
15
- if (!path) return root;
16
-
17
- const parts = path.split('/').filter(p => p);
18
- if (parts.length === 0) return root;
19
-
20
- let current = root;
21
-
22
- if (parts[0] === root._name) {
23
- parts.shift();
24
- }
25
-
26
- for (const part of parts) {
27
- if (!current._children || current._children.length === 0) return null;
28
- const found = current._children.find(c => c._name === part);
29
- if (!found) return null;
30
- current = found;
31
- }
32
-
33
- return current;
34
- }
35
-
36
- function run(args) {
37
- if (args.length < 2) {
38
- console.log(JSON.stringify({ error: '用法: cocos2d-cli remove <场景.fire|预制体.prefab> <节点路径>' }));
39
- return;
40
- }
41
-
42
- const filePath = args[0];
43
- const nodePath = args[1];
44
-
45
- const ext = path.extname(filePath).toLowerCase();
46
-
47
- try {
48
- let root;
49
- let asset;
50
- const json = JSON.parse(fs.readFileSync(filePath, 'utf8'));
51
-
52
- if (ext === '.fire') {
53
- asset = CCSceneAsset.fromJSON(json);
54
- root = asset._scene;
55
- } else if (ext === '.prefab') {
56
- asset = CCPrefab.fromJSON(json);
57
- root = asset._root;
58
- } else {
59
- console.log(JSON.stringify({ error: '不支持的文件类型,仅支持 .fire 和 .prefab' }));
60
- return;
61
- }
62
-
63
- const node = findNode(root, nodePath);
64
-
65
- if (!node) {
66
- console.log(JSON.stringify({ error: `节点不存在: ${nodePath}` }));
67
- return;
68
- }
69
-
70
- // 不能删除根节点
71
- if (node === root) {
72
- console.log(JSON.stringify({ error: '不能删除根节点' }));
73
- return;
74
- }
75
-
76
- // 从父节点移除
77
- if (node._parent) {
78
- const idx = node._parent._children.indexOf(node);
79
- if (idx > -1) {
80
- node._parent._children.splice(idx, 1);
81
- }
82
- }
83
-
84
- // 保存
85
- const data = asset.toJSON();
86
- fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8');
87
-
88
- // 输出节点树
89
- const scriptMap = loadScriptMap(filePath);
90
- const prefab = isPrefab(data);
91
- const startIndex = prefab ? 0 : 1;
92
- console.log(buildTree(data, scriptMap, startIndex).trim());
93
-
94
- } catch (err) {
95
- console.log(JSON.stringify({ error: err.message }));
96
- }
97
- }
98
-
99
- module.exports = { run };