CocosCreator之节点基本属性

CocosCreator快速上手:节点操作与属性管理

>>>>>

笔者总结了工作中常用的节点属性

如果你是新人,请尽可能多的记住他们,因为经常会用到。

// 从全局获取节点:全局获取的节点直接就是实例,不需要getChildByName
// 尽量通过属性装饰器@property获取节点,代码运行效率会更快。
// cc.find不安全,移动或变更节点名字时,忘记改代码会报错,代码可能要改很多。麻烦。
this.node = cc.find("Canvas/Menu");

this.node.children;//节点的子节点,是个数组
this.node.childrenCount;//子节点数量
this.node.active = false;//隐藏节点
this.node.name = "NewNode";//设置节点的名字
this.node.tag = 1001;//设置节点的标签
this.node.x = 100;//设置节点x轴坐标// 3.x版本弃用 请用 setPosition
this.node.y = 100;//设置节点y轴坐标// 3.x版本弃用 请用 setPosition
this.node.position = cc.v2(0, 0);//设置节点坐标// 未指定新指针 风险大
this.node.setPosition(0,0);
this.node.scaleX = 2;//设置节点x轴缩放比例// 3.x版本弃用
this.node.scaleY = 2;//设置节点y轴缩放比例// 3.x版本弃用
this.node.scale = 2;//设置节点缩放比例// 3.x版本弃用 请用setScale
this.node.rotation = 45;//设置节点的旋转角度//新版弃用,请使用angle
this.node.width = 200;//设置节点宽度
this.node.height = 50;//设置节点高度
this.node.setContentSize(100, 100);//设置节点宽和高
this.node.color = new cc.color(100,100,100,255);//设置节点颜色(R,G,B,透明度)
this.node.color = cc.color('#787878');// ts版本颜色代码需要写成 cc.color('#787878'as any)
this.node.opacity = 128;//设置节点透明度(0~255)
this.node.anchorX = 1;//设置节点x轴锚点位置
this.node.anchorY = 0;//设置节点y轴锚点位置
this.node.setAnchorPoint(1, 0);//更改节点锚点位置
this.node.font;//字体文件
this.node.zIndex = 0;//设置此节点的Z轴深度,就是层级关系。默认0

其他常用api

// 实例化节点:
cc.instantiate(node)
// 节点是否被销毁,常用于判断节点是否执行过node.destroy();
cc.isValid(node)

// 坐标系转换
// 把node的节点坐标转到世界坐标
const world_pos = node.parent.convertToWorldSpaceAR(node.getPosition());
// 把这个世界坐标转换到node2自己的节点坐标系,那么node2就能使用node_pos了
const node_pos = node2.parent.convertToNodeSpaceAR(world_pos);

//如何判断对象是一个节点:
if(node instanceof cc.Node ) return true

目录:CocosCreator经典笔记_神兽白泽-CSDN博客

笔者qq、微信:1302109196

qq群:415468592

>>>>>

<think>我们正在讨论Cocos Creator中使用localStorage存储节点数据。根据引用,我们可以知道: 1. localStorage用于本地存储(引用[1]) 2. 存储数据使用`cc.sys.localStorage.setItem(key, value)` 3. 读取数据使用`cc.sys.localStorage.getItem(key)` 4. 节点数据通常不能直接存储,因为localStorage只能存储字符串。所以我们需要将节点数据转换为字符串(如JSON)再存储。 步骤: 1. 将节点数据转换为可存储的格式(通常是JSON)。 2. 使用`setItem`存储。 3. 读取时使用`getItem`获取字符串,再解析为JSON,然后应用到节点上。 示例: 假设我们有一个节点,需要存储它的位置(position)、旋转(rotation)和缩放(scale)等属性。 存储节点数据: ```javascript // 假设node是要存储的节点 let nodeData = { position: {x: node.x, y: node.y}, rotation: node.rotation, scale: {x: node.scaleX, y: node.scaleY} }; // 转换为字符串 let jsonString = JSON.stringify(nodeData); // 存储 cc.sys.localStorage.setItem('nodeData', jsonString); ``` 读取并应用到节点: ```javascript let jsonString = cc.sys.localStorage.getItem('nodeData'); if (jsonString) { let nodeData = JSON.parse(jsonString); node.x = nodeData.position.x; node.y = nodeData.position.y; node.rotation = nodeData.rotation; node.scaleX = nodeData.scale.x; node.scaleY = nodeData.scale.y; } ``` 注意: 1. 如果节点有多个,需要设计好存储结构,比如使用数组或为每个节点指定唯一key。 2. 如果节点有自定义组件,需要存储组件的状态,则需要在转换时包含这些状态,并在读取时恢复。 引用[2]中展示了在onLoad时从localStorage读取数据并设置到label上,引用[3]展示了使用try-catch处理异常。 因此,我们可以这样写: ```javascript // 存储节点数据函数 function saveNodeData(node, key) { let nodeData = { position: {x: node.x, y: node.y}, rotation: node.rotation, scale: {x: node.scaleX, y: node.scaleY} // 可以添加其他需要保存的属性 }; try { let jsonString = JSON.stringify(nodeData); cc.sys.localStorage.setItem(key, jsonString); } catch (error) { cc.error('保存节点数据失败:', error); } } // 加载节点数据函数 function loadNodeData(node, key) { try { let jsonString = cc.sys.localStorage.getItem(key); if (jsonString) { let nodeData = JSON.parse(jsonString); node.x = nodeData.position.x; node.y = nodeData.position.y; node.rotation = nodeData.rotation; node.scaleX = nodeData.scale.x; node.scaleY = nodeData.scale.y; // 其他属性恢复 } } catch (error) { cc.error('加载节点数据失败:', error); } } ``` 在需要保存的时候调用`saveNodeData`,在节点初始化时(如onLoad)调用`loadNodeData`。 注意事项: 1. 如果节点有动态添加的组件或者特殊状态,需要自行扩展nodeData的结构。 2. 对于节点树(多个节点),可以存储一个节点数组,每个节点用一个唯一标识(如name或uuid)来存储和恢复。 例如,存储多个节点: ```javascript let nodesData = []; // 假设nodes是一个节点数组 nodes.forEach(node => { nodesData.push({ uuid: node.uuid, // 使用uuid作为标识 data: { position: {x: node.x, y: node.y}, // ... 其他属性 } }); }); // 存储 cc.sys.localStorage.setItem('nodesData', JSON.stringify(nodesData)); ``` 恢复时,根据uuid找到对应的节点,然后应用数据。 但是注意:节点的uuid在每次运行时可能不同(尤其是动态生成的节点),所以这种方法适合保存场景中固定的节点。对于动态生成的节点,可能需要使用其他标识(如自定义id)或按顺序存储。 总结:Cocos Creator中使用localStorage存储节点数据的关键是将节点数据序列化为字符串,然后存储,读取时再反序列化并应用到节点上。 相关问题: 1. 如何存储和恢复节点的自定义组件状态? 2. 如何存储整个节点树(包括子节点)? 3. 使用localStorage存储大量节点数据时需要注意什么?</think>### Cocos Creator localStorage 存储节点数据使用方法 在 Cocos Creator 中,使用 `localStorage` 存储节点数据需要将节点属性转换为可序列化的 JSON 数据。以下是详细步骤和示例代码: #### 一、核心步骤 1. **数据序列化**:将节点属性(位置、旋转、缩放等)转换为 JSON 字符串 2. **存储数据**:使用 `cc.sys.localStorage.setItem()` 存储 3. **读取数据**:使用 `cc.sys.localStorage.getItem()` 读取 4. **数据反序列化**:将 JSON 字符串解析并应用到节点 #### 二、完整示例代码 ```javascript // NodeStorage.js cc.Class({ extends: cc.Component, properties: { targetNode: cc.Node, // 需要存储的节点 saveKey: "nodeData" // 存储键名 }, onLoad() { // 尝试加载已存储的节点数据 this.loadNodeData(); }, // 保存节点数据到localStorage saveNodeData() { const nodeData = { position: { x: this.targetNode.x, y: this.targetNode.y }, rotation: this.targetNode.rotation, scale: { x: this.targetNode.scaleX, y: this.targetNode.scaleY }, active: this.targetNode.active }; try { const jsonString = JSON.stringify(nodeData); cc.sys.localStorage.setItem(this.saveKey, jsonString); cc.log("节点数据保存成功"); } catch (error) { cc.error("保存失败:", error.message); } }, // 从localStorage加载节点数据 loadNodeData() { try { const jsonString = cc.sys.localStorage.getItem(this.saveKey); if (!jsonString) return; const nodeData = JSON.parse(jsonString); this.targetNode.x = nodeData.position.x; this.targetNode.y = nodeData.position.y; this.targetNode.rotation = nodeData.rotation; this.targetNode.scaleX = nodeData.scale.x; this.targetNode.scaleY = nodeData.scale.y; this.targetNode.active = nodeData.active; cc.log("节点数据加载成功"); } catch (error) { cc.error("加载失败:", error.message); } }, // 清空存储数据(可选) clearStorage() { cc.sys.localStorage.removeItem(this.saveKey); } }); ``` #### 三、使用方法 1. **挂载组件**: - 创建空节点并添加 `NodeStorage` 组件 - 将需要存储的节点拖拽到 `targetNode` 属性 - 设置 `saveKey`(默认 "nodeData") 2. **调用存储**: ```javascript // 在按钮点击事件或其他逻辑中调用 this.getComponent(NodeStorage).saveNodeData(); ``` 3. **自动加载**: - 组件在 `onLoad()` 时会自动尝试加载数据 - 手动调用 `loadNodeData()` 可重新加载 #### 四、注意事项 1. **数据类型限制**: - 只能存储基本类型(字符串、数字、布尔) - 组件实例、纹理等复杂对象需特殊处理 - 使用 `JSON.stringify()` 时忽略函数和未定义属性 2. **存储容量**: - 浏览器通常限制 5MB - 超大数据需分块存储或使用 IndexedDB 3. **异常处理**: - 使用 `try-catch` 防止无效 JSON 导致崩溃 - 读取前检查数据是否存在(引用[3]) 4. **跨平台兼容**: - Web 端:直接使用浏览器 localStorage - 原生平台:自动转为文件存储(引用[1]) #### 五、高级用法 1. **存储多个节点**: ```javascript const nodesData = nodes.map(node => ({ uuid: node.uuid, position: { x: node.x, y: node.y }, // ...其他属性 })); cc.sys.localStorage.setItem("allNodes", JSON.stringify(nodesData)); ``` 2. **存储组件状态**: ```javascript const compData = this.getComponent(MyComponent).exportData(); nodeData.components = { [compName]: compData }; ``` 3. **自动保存**: ```javascript cc.director.on(cc.Director.EVENT_BEFORE_SCENE_LOADING, () => { this.saveNodeData(); }); ``` > **关键点**:节点数据存储本质是存储序列化的属性集合,恢复时重建节点状态而非节点实例本身(引用[2])。 --- ### 相关问题 1. 如何存储和恢复节点的自定义组件数据? 2. 当场景中有多个动态生成的节点时,如何高效存储所有节点数据? 3. 使用 localStorage 存储大量节点数据时有哪些性能优化方案? 4. 如何实现节点数据的版本兼容性(新旧版本数据格式不同)? 5. 在原生平台(iOS/Android)上使用 localStorage 存储节点数据有什么特殊注意事项?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值