[开发者心得] “数据结构课作业笔记”#007-数组-从冲击层到按钮生成阶梯-排队队列

[复制链接]
735 |1
脑的研发记录 发表于 2023-11-11 11:54:22 | 显示全部楼层 |阅读模式
本帖最后由 脑的研发记录 于 2023-11-11 11:54 编辑

“数据结构课作业笔记”#007-数组-从冲击层到按钮生成阶梯-排队队列

所用编辑器版本0.25.0.5



目录总览:
零.新的开始
壹.第一个变化数组
贰.所需语法
叁.应用说明
肆.相关参考链接 (返回主站)



零.新的开始

昨天晚上写出来冲击波的帖子,然后又开始为第二天的素材思考,然后思考无果。或者说是想着想着,想起来以前的经验,“欲速则不达”。感觉已经能摸到一天的灵感精力的上限了,就不想了,睡觉。
后来,今天早上9:00开始敲代码,10:09出成果。具体来说是例子简单了,复制粘贴的技术更加靠谱了。
灵感就像意识一样,只可意会不可言传,就像不知道自己怎么睡醒的一样,但是肯定知道自己是被太阳晒醒的一样,一讲起来怎么知道自己晒醒的,不知道。看别人晒醒,自己醒的时候有光,就坚信起来了。
还有非常感谢论坛师傅们和同学们的鼓励支持!!!


10:09-11:53写完帖子


开发记录:
第零次开发:想起来按钮点击,按钮X数组存储,想象点击按钮生成方块。哦,无中生有!我又行了!
第一次开发:又想起来按钮用UI粘贴,好像又要点击新的界面,然后回想起之前写游戏,拖动粘贴按钮,导出按钮文件,引用按钮文件,就觉得篇幅太大,写不进去。觉得要寄,但是再回想着,又想起来自己后来去论坛里翻帖子,看到用代码生成按钮,不用鼠标拖动,左右点击按钮,尝试复制代码生成按钮,改参数,改名字,然后又行了的故事。就打开编辑器看旧工程的按钮代码,新建脚本,复制粘贴,重读代码。
第二次开发:
读着读着,想着把上一篇的脚本加在新脚本里,然后预想了一下,又要调整好几行代码位置,然后就懒了,再想想把新代码粘贴进旧脚本里,粘贴到一个位置,好像行,于是就这么办了。粘过去,在读着读着代码,删除了很多不用的代码。删完了,调整代码位置,结果又相当于重写一半。看到最终成果才知道,之前的代码位置横竖躲不过。简短的几行代码就是靠着排好的顺序执行的,这个顺序就是为了之前的目标服务的,现在加了新功能了,代码中间插入代码,原来的代码顺序肯定变化,如果单纯复制粘贴跑不了新功能,说明新代码内部也需要和旧代码传达信息,就得新代码中加进去旧代码,这样代码顺序就会变化。
第三次开发:
复制粘贴,调整顺序,测试运行,不通过,看日志没报错,不是初始化的问题,检查变量,变化,发现数字没改,原来是新旧变量不小心位置交换了,然后改回来。跑,不通过。再从头读代码,发现是起点超出范围了,应该从下标0开始,结果从-1开始了,就把另外一个变量成0,然后跑,不通过,然后再穷举,阅读函数,发现重复使用了变量,然后就声明了新的变量,然后删除之前位置的变量,加上新的变量,才替换了旧的重复的变量。
第四次开发:
运行,成功了。但是看不出来按钮点击变没变化,加了一点彩蛋,点击按钮,按钮汉字会变化。


壹.第一个变化数组



不多说,上代码,新建脚本,复制粘贴跑起来,点击预加载,产生方块,点击出院,方块消失。


class ooh {
    n: Gameplay.GameObject;
    id: string;
}

@Core.Class
export default class adds extends Core.Script {

    protected build: Array<ooh> = new Array(50);
    // 100改小成50,控制距离
    protected i: number = -1;
    protected j: number = 0;
    protected k: number = 0;

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {

        AssetUtil.asyncDownloadAsset("197386");

        for (var j = 0; j < this.build.length; j++) {
            this.build[j] = new ooh();
        }



        // 创建一个UI对象
        let ui = UI.UserWidget.newObject();
        // 创建一个画布组件
        let rootCanvas = UI.Canvas.newObject()

        rootCanvas.size = new Type.Vector2(1920, 1080);
        rootCanvas.position = Type.Vector2.zero

        // 将Ui的根画布设置为rootCanvas
        ui.rootContent = rootCanvas
        // 创建一个UI按钮添加到画布上
        let flybtn = UI.StaleButton.newObject(rootCanvas)

        flybtn.position = new Type.Vector2(1900, 600)
        flybtn.size = new Type.Vector2(200, 100)
        flybtn.text = "预加载方块"
        flybtn.renderOpacity = 0.7

        // 将UI桌面添加到屏幕上
        ui.addToViewport(1)



        flybtn.onClicked.add(() => {

            flybtn.text = "this.i增加"
            let obj = Gameplay.GameObject.spawn({
                guid: "197386",
                replicates: true,
                transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
                    new Rotation(0, 0, 0),
                    new Vector(1, 1, 1))
                //写需要设置的Transform
            });
            this.in(obj);
            this.k++;

            flybtn.text = "this.i增加完毕"
            setTimeout(() => {
                flybtn.text = "预加载方块"
            }, 500);

        })



        // 又创建一个UI按钮添加到画布上
        let outbtn = UI.StaleButton.newObject(rootCanvas)
        // 按钮位置
        outbtn.position = new Type.Vector2(1900, 100)
        // 按钮大小
        outbtn.size = new Type.Vector2(200, 100)
        // 按钮名字
        outbtn.text = "出院"


        outbtn.onClicked.add(() => {
            outbtn.text = "鸡汤来喽!"
            var have: ooh = this.out();
            have.n.setCollision(Type.PropertyStatus.Off, true);
            have.n.setVisibility(Type.PropertyStatus.Off, true);
            setTimeout(() => {
                outbtn.text = "出院"
            }, 500);
        })


    }



    public in(obj: Gameplay.GameObject) {
        this.i++;
        this.build[this.i].n = obj;
    }

    public show(): ooh {
        this.i++;
        var have = this.build[this.i];
        return have;
    }

    // public out(): ooh {
    //     var have = this.build[this.i];
    //     this.i--;
    //     return have;
    // }

    // public out(): ooh {
    //     var have = this.build[this.i];
    //     this.i++;
    //     return have;
    // }

    public out(): ooh {
        var have = this.build[this.j];
        this.j++;
        return have;
    }

}





实现了先产生的方块先消失。用两个按钮控制方块产生消失。



代码拆解
老熟人,预加载,声明clss数据格式,数组初始化,然后分配内存。


class ooh {
    n: Gameplay.GameObject;
    id: string;
}

// @Core.Class
// export default class adds extends Core.Script {

    protected build: Array<ooh> = new Array(50);
    // 100改小成50,控制距离
    // protected i: number = -1;
    // protected j: number = 0;
    // protected k: number = 0;

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    // protected onStart(): void {

        AssetUtil.asyncDownloadAsset("197386");

        for (var j = 0; j < this.build.length; j++) {
            this.build[j] = new ooh();
        }






按钮的预加载,也相当于声明UI数据格式,UI初始化,然后分配数据。因为UI的内存是自动分配的,所以直接放进预制的数据就行。


  // 创建一个UI对象
        let ui = UI.UserWidget.newObject();
        // 创建一个画布组件
        let rootCanvas = UI.Canvas.newObject()

        rootCanvas.size = new Type.Vector2(1920, 1080);
        rootCanvas.position = Type.Vector2.zero

        // 将Ui的根画布设置为rootCanvas
        ui.rootContent = rootCanvas
        // 创建一个UI按钮添加到画布上
        let flybtn = UI.StaleButton.newObject(rootCanvas)

        flybtn.position = new Type.Vector2(1900, 600)
        flybtn.size = new Type.Vector2(200, 100)
        flybtn.text = "预加载方块"
        flybtn.renderOpacity = 0.7






按钮预加载完,进行显示,眼见为实。1是图层层级,就类似与PPT的置于上一层下一层这样的图层覆盖。但是第1层级的图层能覆盖第10层级的图层还是10层级的图层覆盖第1层级的图层,我还得穷举试试。


// flybtn.position = new Type.Vector2(1900, 600)
        // flybtn.size = new Type.Vector2(200, 100)
        // flybtn.text = "预加载方块"
        // flybtn.renderOpacity = 0.7

        // 将UI桌面添加到屏幕上
        ui.addToViewport(1)



        // flybtn.onClicked.add(() => {

            // flybtn.text = "this.i增加"









按钮点击时发生的事情


flybtn.onClicked.add(() => {

            flybtn.text = "this.i增加"
            let obj = Gameplay.GameObject.spawn({
                guid: "197386",
                replicates: true,
                transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
                    new Rotation(0, 0, 0),
                    new Vector(1, 1, 1))
                //写需要设置的Transform
            });
            this.in(obj);
            this.k++;

            flybtn.text = "this.i增加完毕"
            setTimeout(() => {
                flybtn.text = "预加载方块"
            }, 500);

        })






另一个按钮的预加载和按钮点击之后的事情



        // 又创建一个UI按钮添加到画布上
        let outbtn = UI.StaleButton.newObject(rootCanvas)
        // 按钮位置
        outbtn.position = new Type.Vector2(1900, 100)
        // 按钮大小
        outbtn.size = new Type.Vector2(200, 100)
        // 按钮名字
        outbtn.text = "出院"


        outbtn.onClicked.add(() => {
            outbtn.text = "鸡汤来喽!"
            var have: ooh = this.out();
            have.n.setCollision(Type.PropertyStatus.Off, true);
            have.n.setVisibility(Type.PropertyStatus.Off, true);
            setTimeout(() => {
                outbtn.text = "出院"
            }, 500);
        })




熟悉的包装代码,注意out 函数的版本变化。
第一个out函数是在完成第一个自由数组的栈,实现倒退读取的功能。
第二个out函数是在完成第一个优化数组的冲击波,实现顺序读取的功能。
第三个out函数是在完成第一个变化数组的排队,增加与消失不使用同一个变量,这样就不会像第一个靠谱数组的栈那样先产生的先消失,实现增加读取不干扰的功能。


i--到i++再到j++的背后是需求的变化。
增减趋势改变到起终点改变再到数据次序改变。
通过穷举已有的代码,排列组合。满足需求,到头来发现不过是为了证明,满足需求其实就是修改字母,两个本来不相关的事情可以是相关的,有手就行,用精力穷举。优化的真相。


public in(obj: Gameplay.GameObject) {
        this.i++;
        this.build[this.i].n = obj;
    }

    public show(): ooh {
        this.i++;
        var have = this.build[this.i];
        return have;
    }

    // public out(): ooh {
    //     var have = this.build[this.i];
    //     this.i--;
    //     return have;
    // }

    // public out(): ooh {
    //     var have = this.build[this.i];
    //     this.i++;
    //     return have;
    // }

    public out(): ooh {
        var have = this.build[this.j];
        this.j++;
        return have;
    }



贰.所需语法

      按钮
      按钮要挂在根节点rootCanvas ,按钮的根节点读取器要塞进去一个目标根节点,   根节点要自己分配内存  UI.Canvas.newObject(),

     // 创建一个UI对象


        let ui = UI.UserWidget.newObject();
        // 创建一个画布组件
        let rootCanvas = UI.Canvas.newObject()

        rootCanvas.size = new Type.Vector2(1920, 1080);
        rootCanvas.position = Type.Vector2.zero

        // 将Ui的根画布设置为rootCanvas
        ui.rootContent = rootCanvas
        // 创建一个UI按钮添加到画布上
        let flybtn = UI.StaleButton.newObject(rootCanvas)

        flybtn.position = new Type.Vector2(1900, 600)
        flybtn.size = new Type.Vector2(200, 100)
        flybtn.text = "预加载方块"
        flybtn.renderOpacity = 0.7

        // 将UI桌面添加到屏幕上
        ui.addToViewport(1)



        flybtn.onClicked.add(() => {

            flybtn.text = "this.i增加"
            // let obj = Gameplay.GameObject.spawn({
            //     guid: "197386",
            //     replicates: true,
            //     transform: new Transform(new Vector(0, this.k * 100, this.k * 25),
            //         new Rotation(0, 0, 0),
            //         new Vector(1, 1, 1))
            //     //写需要设置的Transform
            // });
            // this.in(obj);
            // this.k++;

            flybtn.text = "this.i增加完毕"
            setTimeout(() => {
                flybtn.text = "预加载方块"
            }, 500);

        })


         按钮文本可以随时修改,点击按钮,按钮文本立即修改了,延迟500毫秒后,按钮恢复原来的文案。按钮修改速度很快,所以没有延时器函数,按钮即使点击,也难看清按钮的变化文案。
        无,可以改改之前代码的参数然后看看有什么效果,自己产生优化需求,改改代码满足自己的需求。
       能不复习就不复习,复习是为了巩固知识,巩固还是为了使用满足需求,但是没有见到需求,复习有啥用?不过,这些知识什么时候用其实我也不知道,巩固知识的时候可能会现场灵感乍现知道新用法。只能说不是为了单纯巩固而巩固,自己无中生有产生需求罢了。



叁.应用说明
        游戏交互上,
        按钮改成其他的触发器,游戏关卡玩通一关,阶梯向上生长,同时原来下面几层的阶梯消失,以此进行场景交互。
        攻击效果上,冲击波边产生边消失,就是类似于地刺变成冲击波一样,改改数字参数,阶梯越往后,阶梯方块越大。阶梯前面产生,同时后边消失。视觉上默认看到的是一个物体,然后一个物体变大且向前平移。
        开发测试上
       按钮点击相当于产生数据,这个例子是点击一次产生一个方块的位置数据。可以改成产生其他的大小数据,或者改成i++,生成一些不同数字,检测数据
       插件拓展上
       可以去掉按钮,变成射线检测,直接鼠标点击,绘制物体,记录物体绘制顺序,然后一键导出数组成为游戏冲击波,或者地刺,实现自定义地刺,自定义冲击波,不用数学函数。
      
肆.相关参考链接 (返回主站)



普通大学生“数据结构”课作业笔记#000-目录-逻辑结构与存储结构 口袋方舟论坛|面向全年龄的UGC互动内容平台与交流社区 (ark.online)










回复

使用道具 举报

复读机读复读机 发表于 2023-11-12 10:48:32 | 显示全部楼层
回复

使用道具 举报

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