震惊!某首页级地图代码(部分)泄露!再不来看就晚了!
与原来相比的好处:
原来的打字在取消对话框时会有间隔空隙,遇到地图卡顿时对话框根本显示不出来;现在的打字我保证,绝无空隙!
原来的打字受到很大限制,不能调节其它选项,如设置颜色、只有text类型;现在,你可以按你的需求编辑每个对话框
原来的打字一个对话框用一个函数;现在,多个对话框能装在一个函数内使用了
原来的打字在遇到很长的内容时,无法跳过,导致很多玩家等不下去;现在,如果制作者设置允许跳过,那么你只需点一下右上角的×按钮,就能跳过后面内容了
新增功能:自动补全对话框属性!如图:

自动补全图例
这么多对创作者们和玩家们十分友好的功能,我们怎么会私藏着呢?上代码——
/**
* @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 //完
}; 你可以这样用:
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)
}); 有人开始说了:雪花雪花,如果对话框内容较长,岂不是要写一大串数据?
其实不用!偷懒方法我已经写好了:
//把内容包装进一个字符串内
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站:网页链接
星星上的雪花代码 仅供学习及使用 不可抄袭或盗用