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

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

所用编辑器版本0.25.0.4

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




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

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

    /** 当脚本被实例后,会在第一帧更新前调用此函数 */
    protected onStart(): void {
        var a: have[] = [
            { i: 0check: new Vector(5000100) },
            { i: 1check: new Vector(10000100) },
            { i: 2check: new Vector(15000100) },
            { i: 3check: new Vector(20000100) },
            { i: 4check: new Vector(25000100) },
            { i: 5check: new Vector(30000200) }
        ];


        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);


    }
}


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




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

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


《---myCode---》

2.产生并填充这种类型的数组
《---myCode-TypeScript---》

var a: have[] = [
            { i: 0check: new Vector(5000100) },
            { i: 1check: new Vector(10000100) },
            { i: 2check: new Vector(15000100) },
            { i: 3check: new Vector(20000100) },
            { i: 4check: new Vector(25000100) },
            { i: 5check: new Vector(30000200) }
        ];


《---myCode---》

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


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

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


《---myCode---》

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

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: 0check: new Vector(5000100) },
            { i: 1check: new Vector(10000100) },
            { i: 2check: new Vector(15000100) },
            { i: 3check: new Vector(20000100) },
            { i: 4check: new Vector(25000100) },
            { i: 5check: new Vector(30000200) }
        ];


        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);
    }
}


《---myCode---》



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

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

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

   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);



《---myCode---》

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

《---myCode-TypeScript---》

      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);


《---myCode---》

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

《---myCode-TypeScript---》

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);



《---myCode---》

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

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



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值