本帖最后由 脑的研发记录 于 2023-11-25 20:06 编辑
“数据结构课作业笔记”#011-数组-二维数组
所用编辑器版本0.27.0.0
目录总览:
零.前情反思
壹.二维数组真相
贰.所需语法
叁.应用说明
肆.相关参考链接 (返回主站
17:20-20:05完成代码+文案
零.前情反思
上节“数据结构课作业笔记”#010-数组-多组冲击层改烟花-并发的预兆 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
通过使用class,进行封装压缩代码,实现了同时生成四个方向的方块,实现了一个十字烟花。
但是由于现想现改的“实况复刻”,篇幅记录的bug比较多,从大规模复制粘贴到实现class类型的包装,再到合并之后的剩下的代码位置调整。产生了“凭证”,“套壳”,“包装”,“模板”,“删除整理,清理视野”,这些经验用语来描述预料之外的举措。也从上节例子可以看出篇幅较大,改动较多,代码明显进入了一个新阶段,不是原来复制粘贴一次两次,调整位置一两次就能满足想要的需要的。要在调整了一块代码的位置之后,还要再调整另一块代码位置,来适应代码块,微调代码行顺序。
由此文案篇幅就要调整,不调整的结果就是如上一节代码一样,上一节代码修改也具体说明了如果不分割进行,一口气写到底的结果是怎样的,几乎不能事后记录,只能边写边记录当时想法,由此产生用于记录改写前的代码块的绿色代码占很多篇幅。而且在观感上,有了上一节满足了好奇大规模代码改写过程的例子,现在的需求重心转移到对代码的实现上,就进行二篇幅讲一个事,实现分化,这就是特定功能一篇篇幅的产生背景。简而言之“太长了,写不动。正巧也是发现了新阶段需要分段,就分段写。”
于是就尝试分两篇讲一个故事。
壹.二维数组真相
代码改写自“数据结构课作业笔记”#006-数组-从地刺到冲击层-队列的预兆 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
复制粘贴直接跑。
class ooh {
n: Model;
id: string;
}
@Component
export default class adds extends Script {
// protected build: Array<ooh> = new Array(10);
protected buildx: Array<Array<ooh>> = new Array(4);
// 声明数组,一个数组里面有4个小数组,每个小数组里面有10个项,就是10个对象
protected i: number = 0;
protected flag_grow: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
// for (var j = 0; j < this.build.length; j++) {
// this.build[j] = new ooh();
// }
for (var j = 0; j < this.buildx.length; j++) {
this.buildx[j] = new Array(10);
// 对大数组的一项,就是一个小数组,是小数组的预加载,规定数组的格式。new是分配内存。
for (var k = 0; k < this.buildx[j].length; k++) {
this.buildx[j][k] = new ooh();
// 这里的new也是分配内存,分配了一个内存,把内存里面的数值放进到buildx里面。
// 为什么两次分配内存?
// 也可以说是存储内存的带有的凭证,把凭证放进去。但是我们看不见这个凭证。因为如果能看见这个凭证,之前的教程就会面目全非,简单来说凭证本身也占用内存,第一次分配内存是分配给小数组凭证的内存。
// 教程起点是就着能用的开发,目前没有这个凭证的新的需求。所以就不讲凭证究竟是什么。
// 所以目前两种理解都可以,因为这两种理解目前不影响开发。
// 这样就是二维数组形式j是行,k是列。一行的10个空间
console.log(j + " " + k);
}
}
AssetUtil.asyncDownloadAsset("197386");
setTimeout(() => {
// for (var j = 0; j < this.build.length; j++) {
// let box = GameObject.spawn("197386", {
// transform: new Transform(new Vector(0, j * 50, 25), new Rotation(0, 0, 0),new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
// replicates: true
// }) as Model;
// this.in(box);
// }
// this.i = 0;
// 标号回到开头
for (var j = 0; j < this.buildx.length; j++) {
for (var k = 0; k < this.buildx[j].length; k++) {
let box = GameObject.spawn("197386", {
transform: new Transform(new Vector(k * 300,j * 50 , 25*k), new Rotation(0, 0, 0), new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
replicates: true
}) as Model;
this.buildx[j][k].n = box;
}
}
// for (var j = 0; j < this.buildx.length; ) {
// setTimeout(() => {
// for (var k = 0; k < this.buildx[j].length;) {
// setTimeout(() => {
// let box = GameObject.spawn("197386", {
// transform: new Transform(new Vector(k * 300,j * 50 , 25*k), new Rotation(0, 0, 0), new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
// replicates: true
// }) as Model;
// this.buildx[j][k].n = box;
// k++
// }, 100);
// }
// j++
// }, 1000);
// }
}, 3000);
// setTimeout(() => {
// var timer = setInterval(() => {
// if (this.flag_grow == 0) {
// if (this.i == 10) {
// this.flag_grow = 1;
// this.i = 0;
// } else {
// this.i++;
// }
// // var have: ooh = this.out();
// // have.n.setCollision(PropertyStatus.Off, true);
// // have.n.setVisibility(PropertyStatus.Off, true);
// } else if (this.flag_grow == 1) {
// if (this.i == 10) {
// this.flag_grow = 0;
// this.i = 0;
// } else {
// }
// // var have: ooh = this.show();
// // have.n.setCollision(PropertyStatus.On, true);
// // have.n.setVisibility(PropertyStatus.On, true);
// }
// console.log(this.i);
// }, 100);
// }, 3000);
}
// public in(obj: Model) {
// this.build[this.i].n = obj;
// this.i++;
// }
// public show(): ooh {
// var have: ooh = this.build[this.i];
// this.i++;
// return have;
// }
// public out(): ooh {
// var have: ooh = this.build[this.i];
// this.i++;
// return have;
// }
}
代码拆解
数据类型,注意套娃的Array<Array<ooh>>,直观上看就是有Array<ooh>数据,现在咱有了4个。每个Array<ooh>又有几个ooh类型的数据。相当于1000克和1千克,1000千克和1吨,单位变了。还有注意里面的注释“声明数组.......”
class ooh {
n: Model;
id: string;
}
@Component
export default class adds extends Script {
// protected build: Array<ooh> = new Array(10);
protected buildx: Array<Array<ooh>> = new Array(4);
// 声明数组,一个数组里面有4个小数组,每个小数组里面有10个项,就是10个对象
protected i: number = 0;
protected flag_grow: number = 0;
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
对比没有修改之前的绿色代码,可以看到原来是分配ooh的内存,现在成了分配小数组的内存。然后小数组分配完内存,再对小数组分配内存。两次内存分配这个说明是沿着
“数据结构课作业笔记”#006-数组-从地刺到冲击层-队列的预兆 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)贰.所需语法的 new 是分配内存的意思。但是两次分配内存按原来的想法就会以为是两次分配一样的内存。现在再用“预加载”,和上一节“凭证”两个这个概念来说明,两次分配内存的说法来源。
原来是以为分配一次内存就行,也就是 this.buildx[j] = new Array(10);
这一行本来是不存在的。
然后就跑,发现报错。“TypeError: Cannot read property 'n' of undefined”和006一模一样的报错提示。于是上网查询Typedcript的二维数组用法。
说原来TypeScript的二维数组是不支持的,实际上是几个数组罗列起来。所以相当于能拆成几个数组,就要几次数组初始化。
而这个数组初始化就是刚才所说的不存在的一行。确实和数组初始化长得像,功能也一样。
然后有了两次分配内存的说法,就开始怀疑起来了,new分配内存,分配两次内存。要么分配了假的内存,只是限定个数,要么就是分配了真的内存,但是两次分配的真的内存不同。
于是就有了代码关于内存分配的推理过程
/** 当脚本被实例后,会在第一帧更新前调用此函数 */
protected onStart(): void {
// for (var j = 0; j < this.build.length; j++) {
// this.build[j] = new ooh();
// }
for (var j = 0; j < this.buildx.length; j++) {
this.buildx[j] = new Array(10);
// 对大数组的一项,就是一个小数组,是小数组的预加载,规定数组的格式。new是分配内存。
for (var k = 0; k < this.buildx[j].length; k++) {
this.buildx[j][k] = new ooh();
// 这里的new也是分配内存,分配了一个内存,把内存里面的数值放进到buildx里面。
// 为什么两次分配内存?
// 也可以说是存储内存的带有的凭证,把凭证放进去。但是我们看不见这个凭证。因为如果能看见这个凭证,之前的教程就会面目全非,简单来说凭证本身也占用内存,第一次分配内存是分配给小数组凭证的内存。
// 教程起点是就着能用的开发,目前没有这个凭证的新的需求。所以就不讲凭证究竟是什么。
// 所以目前两种理解都可以,因为这两种理解目前不影响开发。
// 这样就是二维数组形式j是行,k是列。一行的10个空间
console.log(j + " " + k);
}
}
AssetUtil.asyncDownloadAsset("197386");
二维数组初始化之后的数据填充,
biuldx.lenth=4
biuldx[j].lenth=10
这样就能理解buildx[][]的第一个[]是对应的Array<Array<ooh>=new Array(4),第二个[]对应的是小数组buildx[j][]中某个ooh
AssetUtil.asyncDownloadAsset("197386");
setTimeout(() => {
// for (var j = 0; j < this.build.length; j++) {
// let box = GameObject.spawn("197386", {
// transform: new Transform(new Vector(0, j * 50, 25), new Rotation(0, 0, 0),new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
// replicates: true
// }) as Model;
// this.in(box);
// }
// this.i = 0;
// 标号回到开头
for (var j = 0; j < this.buildx.length; j++) {
for (var k = 0; k < this.buildx[j].length; k++) {
let box = GameObject.spawn("197386", {
transform: new Transform(new Vector(k * 300,j * 50 , 25*k), new Rotation(0, 0, 0), new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
replicates: true
}) as Model;
this.buildx[j][k].n = box;
}
}
// for (var j = 0; j < this.buildx.length; ) {
// setTimeout(() => {
// for (var k = 0; k < this.buildx[j].length;) {
// setTimeout(() => {
// let box = GameObject.spawn("197386", {
// transform: new Transform(new Vector(k * 300,j * 50 , 25*k), new Rotation(0, 0, 0), new Vector((1 + j * j) / 90, 1, (1 + j * j) / 90)),
// replicates: true
// }) as Model;
// this.buildx[j][k].n = box;
// k++
// }, 100);
// }
// j++
// }, 1000);
// }
}, 3000);
// setTimeout(() => {
// var timer = setInterval(() => {
// if (this.flag_grow == 0) {
// if (this.i == 10) {
// this.flag_grow = 1;
// this.i = 0;
// } else {
// this.i++;
// }
// // var have: ooh = this.out();
// // have.n.setCollision(PropertyStatus.Off, true);
// // have.n.setVisibility(PropertyStatus.Off, true);
// } else if (this.flag_grow == 1) {
// if (this.i == 10) {
// this.flag_grow = 0;
// this.i = 0;
// } else {
// }
// // var have: ooh = this.show();
// // have.n.setCollision(PropertyStatus.On, true);
// // have.n.setVisibility(PropertyStatus.On, true);
// }
// console.log(this.i);
// }, 100);
// }, 3000);
}
// public in(obj: Model) {
// this.build[this.i].n = obj;
// this.i++;
// }
// public show(): ooh {
// var have: ooh = this.build[this.i];
// this.i++;
// return have;
// }
// public out(): ooh {
// var have: ooh = this.build[this.i];
// this.i++;
// return have;
// }
}
贰.所需语法
无,本节是讲语法的帖子
因为二维数组的其他参考没来得及看
叁.应用说明
二维数组和数组差不多。存取数据。
因为二维数组多了一个[],就多了一个控制变量,对标记的操作会更加直白,数组里一个控制变量干几个事情,或者共享控制变量导致一个变量有很多解读,由此导致的理解混乱可能在二维数组有了合适的例子说明。
二维数组,可以制作技能编辑器,表现两条技能同时释放。
可用于“数据结构课作业笔记”#010-数组-多组冲击层改烟花-并发的预兆 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)的代码重写。
肆.相关参考链接 (返回主站
普通大学生“数据结构”课作业笔记#000-目录-逻辑结构与存储结构 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)
|