[开发者心得] “数据结构课作业笔记”#011-数组-二维数组

[复制链接]
642 |2
脑的研发记录 发表于 2023-11-25 19:59:26 | 显示全部楼层 |阅读模式
本帖最后由 脑的研发记录 于 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)

回复

使用道具 举报

复读机读复读机 发表于 2023-11-27 09:30:55 | 显示全部楼层
可以用这个自动生成斜坡,加上上一章的顺序产生,能手搓一个机关了
回复

使用道具 举报

脑的研发记录楼主 发表于 2023-11-27 10:28:14 | 显示全部楼层
复读机读复读机 发表于 2023-11-27 09:30
可以用这个自动生成斜坡,加上上一章的顺序产生,能手搓一个机关了 ...

然后再把斜坡卷起来,就能生成金字塔,把金字塔横过来,就能生成同心圆一样的冲击波。
回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表