首页 > 其他分享 >来来来,一文让你读懂Cocos Creator如何读写JSON文件

来来来,一文让你读懂Cocos Creator如何读写JSON文件

时间:2023-11-14 09:33:30浏览次数:37  
标签:Cocos log err Creator cc json JSON let

前言

在游戏开发过程中,读取配置文件是必不可少的,而使用JSON做配置文件又比较常见,本文重点给大家讲述如何在Cocos Creator开发中读取和解析JSON数据文件以及如何写JSON文件。

一、JSON简介

1. 什么是JSON

JSON的英文全称是JavaScript Object Notation,即JavaScript对象表示法。

2. JSON的特点

是一种轻量级的文本数据交换格式,类似XML,但是比XML更小、更快、更易解析。使用JavaScript语法来描述数据对象,JS程序无需解析器即可生成原生的JavaScript对象。独立于语言和平台,目前大多数的编程语言都支持JSON。

3. JSON的语法

JSON语法是JavaScript语法的子集,具有以下规则:

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

二、如何解析JSON文件

1. 关键原则

大括号代表对象,中括号代表数组;

2. 用什么方法读取?

Cocos Creator提供了cc.load.loadRes来专门加载位于 resources 目录下的文件,所以提前把JSON文件放到 asserts/resources 目录下即可。先来一个简单的JSON文件,如下:

1.  `// box2dDemo.json`

2.  `{`

3.  `"engine": "Box2D",`

4.  `"version": "2.3.1"`

5.  `}`

读取/解析代码如下:

1.  `cc.loader.loadRes('box2dDemo.json', function(err, object) {`

2.  `if(err) {`

3.  `console.log(err);`

4.  `return;`

5.  `}`

6.  `// 读取的数据返回在object中,这是一个拥有2个元素的对象`

7.  `let engine = object.engine; // engine = box2D`

8.  `let ver = object.version; // ver = 2.3.1`

9.  `});`

是不是很简单?实际使用的JSON配置常常比这复杂一些,所以我们现在再给JSON文件增加一些元素,如下:

1.  `// box2dDemo.json`

2.  `{`

3.  `"engine": "Box2D",`

4.  `"version": "2.3.1",`

5.  `"bodies":`

6.  `[`

7.  `{`

8.  `"name": "root",`

9.  `"body":`

10.  `{`

11.  `"type": "static",`

12.  `"gravityScale": 0.2`

13.  `}`

14.  `},`

15.  `{`

16.  `"name": "aa1",`

17.  `"body":`

18.  `{`

19.  `"type": "static",`

20.  `"gravityScale": 0.2`

21.  `}`

22.  `}`

23.  `],`

24.  `"joints":`

25.  `[`

26.  `{`

27.  `"bodyA": "root",`

28.  `"bodyB": "aa1",`

29.  `"lowerAngle": 0.5,`

30.  `"enableLimit": true`

31.  `},`

32.  `{`

33.  `"bodyA": "aa1",`

34.  `"bodyB": "aa2",`

35.  `"lowerAngle": -0.5,`

36.  `"enableLimit": true`

37.  `}`

38.  `]`

39.  `}`

我们在代码中定义一个解析函数叫 readJson,并且把解析出来的JSON数据保存起来,实现代码如下:

1.  `readJson: function() {`

2.  `this.box2d = {}; // 存储解析出来的JSON数据`

3.  `varself= this;`

4.  `cc.loader.loadRes('box2dDemo.json', function(err, object) {`

5.  `if(err) {`

6.  `console.log(err);`

7.  `return;`

8.  `}`

9.  `let engine = object.engine; // engine = box2D`

10.  `let ver = object.version; // ver = 2.3.1`

11.  `let bodies = object.bodies; // bodies是个数组`

12.  `let joints = object.joints; // joints是个数组`

13.  `// 需在回调外面提前用self代替this`

14.  `self.box2d = object; // box2d是整个对象`

15.  `// 将循环2次,因为bodies是个拥有2个对象的数组`

16.  `for(let x=0; x < bodies.length; x++) {`

17.  `let root = bodies[x]; // root是个对象`

18.  `let root_name = root.name; // 第1次循环root_name = root`

19.  `let type = root.body.type; // type = static`

20.  `let gravity = root.body.gravityScale; // gravity = 0.2`

21.  `}`

22.  `});`

23.  `},`

3. Cocos Creator读取JSON文件注意事项

creator读取json文件的一个坑(对文本内容进行操作可能导致的错误) 使用creator中的 cc.loader.loadRes( url, cc.RawAsset, ( err, res )=>{ } )读取游戏文件后发现第二次进入游戏出现了错误。现对这个问题总结下:对于动态加载资源,第二次读取会直接从缓存中读取,所以如果读取的是一个文本数据,对文本数据修改了,那么相应的,在下一次读取数据会读取修改后的文本数据。比如文本数据就一个数组[1,2,3],第一次读取之后删除了最后一位数据变为为[1,2],那么下一次读取将会是[1,2]。为了不出现这种情况,可以对数据进行序列化与反序列化操作,将其深度拷贝后使用。

4. JSON读取通用代码示例

1.  `cc.loader.load(cc.url.raw('resources/data.json'), function(err,res){`

2.  `if(err) {`

3.  `cc.log(err);`

4.  `}else{`

5.  `let list=res;`

6.  `cc.log("load:");`

7.  `cc.log("list:"+list.name);`

8.  `}`

9.  `});`

10.  `// louadRes()方法,默认路径就是resources`

11.  `cc.loader.loadRes('data', function(err,res){`

12.  `if(err) {`

13.  `cc.log(err);`

14.  `}else{`

15.  `let list=res;`

16.  `cc.log("loadRes:");`

17.  `cc.log("list:"+list.sex);`

18.  `}`

19.  `});`

注意:当使用以上代码还报文件不存在或Download text failed的错,那就要检查下资源管理器里是不是有两个resources文件夹,其中一个是最近新建的,另一个可能是以前新建的但是被删除过,但是删除不彻底,因为cocos creator里面的资源都是有一个唯一标识的uuid,所以,还必须找到E:\Projects\你的项目\library\uuid-to-mtime.json这个文件,在里面找到之前的resources文件uuid,先剪切放到文本文件,然后保存uuid-to-mtime.json,重启软件,看是否能进去,不能的话再把剪切出来的uuid复制回去,再重启就可以了。

三、Json文件的写入

1.  `// writeToFile()写入数据到文件,存储格式为xml,不是Json格式`

2.  `if(cc.sys.isNative) {`

3.  `cc.log("Path:"+jsb.fileUtils.getWritablePath());    cc.log( jsb.fileUtils.writeToFile({"new":"value"},jsb.fileUtils.getWritablePath()+'data.json'));`

4.  `cc.log("fullPathForFilename:"+jsb.fileUtils.fullPathForFilename("resources/data.json"));`

5.  `}`

6.  `// writeStringToFile()写入数据到文件,存储格式为json,读取数据用load()方法`

7.  `cc.log("writeStringToFile:"+jsb.fileUtils.writeStringToFile('{"a":"b","c":"d"}', jsb.fileUtils.getWritablePath()+'kk.json'));`

8.  `cc.log("getValueMapFromFile:"+JSON.stringify(jsb.fileUtils.getValueMapFromFile(jsb.fileUtils.getWritablePath()+"kk.json")));`

    `var`

9.  `arry=JSON.stringify(jsb.fileUtils.getStringFromFile(jsb.fileUtils.getWritablePath()+"kk.json"));`

10.  `cc.log("arry:"+arry);`

11.  `cc.loader.load(jsb.fileUtils.getWritablePath()+"kk.json", function(err,res){`

12.  `if(err) {`

13.  `cc.log(err);`

14.  `}else{`

15.  `let list=res;`

16.  `cc.log("list:"+list.a);`

17.  `}`

18.  `});`

cocos、unity、lay游戏大礼包,如需获取请点击下方即可:

标签:Cocos,log,err,Creator,cc,json,JSON,let
From: https://www.cnblogs.com/bycw/p/17830914.html

相关文章

  • Cocos Creator之不规则的点击区域
    一,前景1,点击区域不是一个矩形,如下图所示二,新建一个节点(Node)   1,添加Sprite组件  2,继续添加Button组件3,添加PolygonCollider2D组件三,核心代码import{_decorator,Component,Node,isValid,PolygonCollider2D,Intersection2D,UITrans......
  • Python Object of type float32 is not JSON serializable
    前言使用json.dumps(result)对数据转JSON数据出现错误:TypeError:Objectoftypefloat32isnotJSONserializable数据中存在的float32数据是numpy格式的数据,Python内置的float类型可以写入JSON中,但是numpy的float32类型数据不能写入JSON,所以应将numpy.flo......
  • Newtonsoft.Json 入门介绍
    本人是C#小白,这里摘抄并整理了两位大神的文章:Newtonsoft.Json笔记-JToken、JObject、JArray详解Json基于类Newtonsoft.Json.Linq.JToken的应用简介 简单介绍如何使用Newtonsoft.Json类库和操作Json对象,这里主要介绍LinqtoJson类。Newtonsoft.Json封装类实现了JToken,直......
  • JavaScript使用JS从JSON获取信息并遍历输出到网页展示信息------前端
    遍历JSON获取数据<!DOCTYPEhtml><!--这是HTML的注释--><htmllang="en"id="myHtml"> <head> <!--这里不是设置了编码,而是告诉浏览器,用什么编码方式打开文件避免乱码--> <metacharset="UTF-8"> <metaname="viewport"......
  • Cocos Creator 性能调优之《如何优化2D/3D Drawcall》
    游戏渲染是性能开销的大头,在项目开发中掌握性能调优中渲染优化相关技巧是非常重要的。渲染优化又可以从很多方面来入手,其中降低Drawcall是非常重要的手段之一。接下来从4个点来详细的讲解基于CocosCreator3.x如何做Drawcall的性能优化:为什么降低Drawcall能提升渲染性能;常用合......
  • Cocos Creator中的向量cc.Vec2和矩形cc.Rect
    前言在CocosCreator游戏开发中,经常需要使用向量和矩形,这篇文章我们来总结下其常见用法。一、Vec2二维向量 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。 1.`letv1:cc.Vec2=......
  • Cocos Creator 「无侵入」资源加密方案
    前言CocosCreator打包后的素材资源,如:图片,声音等,默认是保持原始格式,只要遇到破解党,那么他们极有可能很简单就直接获取到这部分素材资源。针对这个问题,大部分同学都会有一种资源加密的需求,即对打包后的资源进行加密,让破解党不那么容易获取到资源。对啦!这里有个游戏开发交流小组......
  • C#根据json内容动态生成SQL语句,字段数量可以不一样
    publicstaticintUpdate(stringstrJson){intcount=0;List<Dictionary<string,object>>listRows=JsonConvert.DeserializeObject<List<Dictionary<string,object>>>(strJson);foreach(varrowinlistRows){......
  • 正确的语法来在Node中查询MYSQL中的JSON_SET
    在Node.js中,我们可以使用mysql模块来查询MySQL数据库。但是,mysql模块并不直接支持JSON_SET函数,这是一个MySQL特有的函数,用于在JSON文档中插入或更新值。如果你需要在Node.js中使用JSON_SET,你可能需要使用mysql的预处理语句和JSON_EXTRACT函数来实现。以下是一个示例:varmysql=req......
  • fgui 怎么将"UI空间下的世界坐标"转换成"fgui空间下的世界坐标( global pos )" cocosc
    嗨~如果本文对你有帮助,点个推荐吧!这样能让文章在搜索中更靠前,帮助到更多有需要的人!首先通过坐标系转换一步步地进行计算我尝试过,但卡在了将屏幕坐标转换为fgui空间的全局坐标上。但发现了一个巧妙的做法。//随便的一个Cocoscreator的NodevaranyCCUINode=this._labe......