【代码】升级版打字机对话框;事件的处理与取消;Box3 JS代码教程
星光雪糕
2022年02月10日 14:36
收录于文集
共12篇

震惊!某首页级地图代码(部分)泄露!再不来看就晚了!


升级版打字机对话框

  • 与原来相比的好处:

  1. 原来的打字在取消对话框时会有间隔空隙,遇到地图卡顿时对话框根本显示不出来;现在的打字我保证,绝无空隙!

  2. 原来的打字受到很大限制,不能调节其它选项,如设置颜色、只有text类型;现在,你可以按你的需求编辑每个对话框

  3. 原来的打字一个对话框用一个函数;现在,多个对话框能装在一个函数内使用了

  4. 原来的打字在遇到很长的内容时,无法跳过,导致很多玩家等不下去;现在,如果制作者设置允许跳过,那么你只需点一下右上角的×按钮,就能跳过后面内容了

  5. 新增功能:自动补全对话框属性!如图:

自动补全图例

这么多对创作者们和玩家们十分友好的功能,我们怎么会私藏着呢?上代码——

代码块
JavaScript
自动换行
复制代码
/**
 * @param {Box3PlayerEntity} entity  Target user
 * @param {Box3TextDialogParams[] | Box3SelectDialogParams[] | Box3InputDialogParams[]} dialogs  The script of dialog
 * @param {Boolean} tiaoguo  是否支持跳过(true: 可以; false/不填: 哒咩)
 * @param {Number} time  等待时间, 单位:秒(越小越快, 不填则默认0.08)
 */
async function print (entity,dialogs,tiaoguo,time) {
    var done = false; //设置看完对话框为未完成
    if(tiaoguo){ //如果支持跳过
        entity.player.nextPress(() => done = true); //设置跳过对话
    };
    /** Box3EventChannel[] */
    var events = []; //用于储存对话框事件event的处理器handler, 方便获取用于取消事件的token
    for(const dialog of dialogs){ //遍历每个对话属性
        let save = dialog.content + ''; //保存这个对话的内容
        dialog.content = ""; //清空对话框的内容
        for(let i = 0; i < save.length; i ++){ //遍历这个对话框的所有内容
            dialog.content += save[i]; //打字
            events.push( //往事件数组中加入新事件
                Object.assign(entity.player.dialog(dialog), {canceled: false/*这个后面有用*/}) //不用await是因为要获取[object Promise](什
            )
        }
    };
    for(let handler of events){ //遍历每个事件
        handler.cancel; //这个函数是用于取消事件的token, 在该事件中是关闭对话框
        handler.finally(()=> handler.canceled = true );//玩家手动关闭对话框
    };
    //——————————————
    for(let handler of events){ //遍历每个事件
        await sleep(time ? time*1000 : 0.08*1000); //A ? B : C 是这样用的:如果A为成立, 则返回B, 不然返回C。你也可以无限叠加, A ? B : D ? C : E
        if((handler.canceled || done) && tiaoguo){ //如果(支持跳过) 且 ((玩家手动关闭) 或 (玩家长按跳过))
            return; //结束
        }
        handler.cancel(); //关闭该对话框
    };
    return events //完
};
复制成功

你可以这样用:

代码块
JavaScript
自动换行
复制代码
world.onPlayerJoin(({entity})=>{
    const hanlder = print(
        entity, //玩家
        [{
            type: 'text',
            content: '文本对话框示例\n颜色红色',
            contentTextColor: [1,0,0,1]
        },{
            type: 'select',
            content: '选择对话框示例\n颜色绿色',
            contentTextColor: [0,1,0,1]
        },{
            type: 'input',
            content: '输入对话框示例\n颜色蓝色',
            contentTextColor: [0,0,1,1]
        }],
        true, //支持跳过:true;不可跳过:false
        0.08  //等待时间(越小越快)
    );
    hanlder.then(entity.player.cancelDialogs)
});
复制成功

有人开始说了:雪花雪花,如果对话框内容较长,岂不是要写一大串数据?

其实不用!偷懒方法我已经写好了:

代码块
JavaScript
自动换行
复制代码
//把内容包装进一个字符串内
const Content = 
`1.点赞
2.投币
3.收藏
4.一键三连
5.星雪代码`;

//玩家进入地图后开始打字
world.onPlayerJoin(({entity})=>{
    const script = [];
    for(const dialog of Content.split("\n")){
        script.push({
            type: "text",
            content: dialog + "       ",
            contentTextColor: [0,1,0,1],
            contentBackgroundColor: [0,0,0,1],
            title: "(想跳过? 轻点右边×键)",
            titleBackgroundColor: [0,0,0,1],
            titleTextColor: [0,1,0,1],
        });
    };
    print(entity,script,true,0.08);
});
复制成功

很好用,对吧?

我在BOX3:https://box3.codemao.cn/u/Coder

我在B站:网页链接​

星星上的雪花代码 仅供学习及使用 不可抄袭或盗用