[开发者心得] “数据结构课作业笔记”#003-数组-简单排列的变量和它们必然命运(中)

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

“数据结构课作业笔记”#003-数组-简单排列的变量和它们必然命运(中)

所用编辑器版本0.25.0.4

目录总览:
零.前情提要
壹.第一个靠谱数组
贰.所需语法 (代码如本节图示)
叁.应用说明
肆.相关参考链接 (返回主站)





目录总览:
零.前情提要
       在变量突然增多、需要更好管理数据、快速查找变量这个需求的背景下,接触了数组,并尝试用数组数组存储金币、经验值这样的数据。
壹.第一个靠谱数组
       上一个数组实现了存储数值,数字的跳动距离游戏体验感还是有点距离,这次在数据中存入位置坐标,观察数组在位置改变中的效果,穷举数组与位置结合之后的各种用法。
       新建脚本,复制粘贴,跑就完事。

interface have {
    i: number;
    check: Vector;
}
@Core.Class
export default class stack extends Core.Script {

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        var a: have[] = [
            { i: 0, check: new Vector(500, 0, 100) },
            { i: 1, check: new Vector(1000, 0, 100) },
            { i: 2, check: new Vector(1500, 0, 100) },
            { i: 3, check: new Vector(2000, 0, 100) },
            { i: 4, check: new Vector(2500, 0, 100) },
            { i: 5, check: new Vector(3000, 0, 200) }
        ];


        var i = 5;
        var chara: Gameplay.Character;
        setTimeout(() => {
            chara = Gameplay.getCurrentPlayer().character;
            chara.worldLocation = a[i].check;
            var timer = setInterval(() => {
                if (i < 0) {
                    clearInterval(timer);
                }
                chara.worldLocation = a[i].check;
                i--;

            }, 500);
        }, 2000);


    }
}

多跑几次,可以感觉出来角色先被传送到出生点前面,然后每隔一会儿就自动传送到身后的一段距离。
用精确数字来描述,就是角色先被传送到x=3000,y=0,z=100的位置上,然后每隔500毫秒自动倒退500,倒退了5次。




简单拆解,这个数组每一项都是have类型,每一项都含有一个类型是Vector的成员。成员带着x,y,z三维坐标。
对应代码
1.规定一种类型

interface have {
    i: number;
    check: Vector;
}


2.产生并填充这种类型的数组

var a: have[] = [
            { i: 0, check: new Vector(500, 0, 100) },
            { i: 1, check: new Vector(1000, 0, 100) },
            { i: 2, check: new Vector(1500, 0, 100) },
            { i: 3, check: new Vector(2000, 0, 100) },
            { i: 4, check: new Vector(2500, 0, 100) },
            { i: 5, check: new Vector(3000, 0, 200) }
        ];


这样就有了按计划预定的一系列位置。


然后需要把预先存储的位置填充进玩家角色的位置读取器里,玩家自动读取位置并进行传送
关键代码

chara = Gameplay.getCurrentPlayer().character;
            chara.worldLocation = a[i].check;


但是不声明变量会报错。
所以才有了这样的代码

interface have {
    i: number;
    check: Vector;
}
// 说明一个数据类型,如代码所示,这个叫“have"的类型
// 有一个叫“i“的变量,它的类型是numebr
// 还有一个叫“check"的变量,它的类型是Vector

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

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        var a: have[] = [
            { i: 0, check: new Vector(500, 0, 100) },
            { i: 1, check: new Vector(1000, 0, 100) },
            { i: 2, check: new Vector(1500, 0, 100) },
            { i: 3, check: new Vector(2000, 0, 100) },
            { i: 4, check: new Vector(2500, 0, 100) },
            { i: 5, check: new Vector(3000, 0, 200) }
        ];


        var i = 5;
        var chara: Gameplay.Character;
        // 声明一个变量,这个变量是用于暂存获取到的玩家角色
        setTimeout(() => {
            chara = Gameplay.getCurrentPlayer().character;
            // 这个变量现在才存储了一个玩家角色
            chara.worldLocation = a[i].check;
            // 玩家的位置读取器输入了a.check成员存储的位置信息
            var timer = setInterval(() => {
                if (i < 0) {
                    clearInterval(timer);
                }
                chara.worldLocation = a[i].check;
                i--;
            }, 500);
        }, 2000);
    }
}




贰.所需语法 (代码如本节图示)

        延迟函数——定时炸弹的绝好搭档
       计时器——靠谱的时间工具人

延迟函数settimeout(),作用是2000毫秒再去执行内部包含的函数,2000可以改成其他数字,多试试,体会效果。

   setTimeout(() => {
            // chara = Gameplay.getCurrentPlayer().character;
            // // 这个变量现在才存储了一个玩家角色
            // chara.worldLocation = a.check;
            // // 玩家的位置读取器输入了a.check成员存储的位置信息
            // var timer = setInterval(() => {
            //     if (i < 0) {
            //         clearInterval(timer);
            //     }
            //     chara.worldLocation = a.check;
            //     i--;
            // }, 500);
        }, 2000);



计时器——每秒计时的函数setInterval(),每500毫秒执行一次内部的函数,


      setTimeout(() => {
            // chara = Gameplay.getCurrentPlayer().character;
            // // 这个变量现在才存储了一个玩家角色
            // chara.worldLocation = a.check;
            // // 玩家的位置读取器输入了a.check成员存储的位置信息
            var timer = setInterval(() => {
            //     if (i < 0) {
            //         clearInterval(timer);
            //     }
            //     chara.worldLocation = a.check;
            //     i--;
            }, 500);
        }, 2000);


刨去数组相关的代码,如下图,实际上就是对应开头的描述“延迟2000毫秒......,每500毫秒.......”
实现的效果是“延迟2000毫秒执行计时器,每500毫秒计时器执行一次,执行的内容是i++,如果i小于0了,就停止计时,即清除计时器”


var i = 5;
        // var chara: Gameplay.Character;
        setTimeout(() => {
            // chara = Gameplay.getCurrentPlayer().character;
            // chara.worldLocation = a.check;
            var timer = setInterval(() => {
                if (i < 0) {
                    // 如果i小于0,就清除定时器
                    clearInterval(timer);

                }
                // chara.worldLocation = a.check;
                i--;
                // 每500毫秒i减少1
            }, 500);
        }, 2000);


叁.应用说明
        这一段讲了数组与位置混合后产生的移动效果,在实际应用中,可以通过设置位置数组,让角色触发连招后闪现到不同位置上进行攻击。我猜崩坏三的闪现打击用到了位置数组。
        但是关于数组一个一个倒退读取,从5倒数到0,这个顺序还有别的作用,在下节细聊。

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




回复

使用道具 举报

复读机读复读机 发表于 2023-11-7 17:21:04 | 显示全部楼层
学到了
回复

使用道具 举报

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