用户:
时光下奔腾的小鹿查看:0 回复:4 评论:0 创建时间:2023-01-27T14:33:16
实现功能:每层可召唤电梯至该层,可选择去哪一层,支持2层及以上的楼层
console.clear();
const elevator_Floor = world.querySelector('#电梯'); // 需要一个名为'电梯'的实体,最好是一个地板
const elevator_Button = world.querySelectorAll('.电梯按钮'); // 若干个电梯按钮的实体,名称为'XX层按钮',前面的字符必须是数字
var elevator_Options = []; // 对应楼层的选项
const Floor_Postion_Y = [0,11,23]; // 每个楼层电梯需要移动的对应的y坐标
function get_Color(red,green,blue) { return new Box3RGBColor(red / 255,green / 255,blue / 255); } // 获取对应颜色
function elevator_Cmp(x,y) { // 自定义排序函数,可自行百度详细用法
const xx = parseFloat(x); const yy = parseFloat(y);
return xx - yy;
}
async function elevator_Init() { // 电梯初始化 *注:如果要增加楼层,需要添加一个按钮,名称为'XXX层电梯按钮',加上'电梯按钮'的标签;还需要在Floor_Postion_Y中增加一项该楼层地板的y坐标,其他地方都不用动
for (var e of elevator_Button) { // 逐个处理每个电梯按钮
e.floor = parseFloat(e.id); // 对应楼层
e.enableInteract = true; // 可互动
e.interactHint = '召唤电梯'; // 名称
e.interactRadius = 1; // 距离
e.interactColor = get_Color(0,255,0); // 颜色为绿色
elevator_Options.push(`${e.floor}层`) // 在楼层选项中增加对应
}
world.onInteract(async( {targetEntity} ) => { // 处理互动事件
if (!targetEntity.hasTag('电梯按钮') || elevator_Floor.is_Work) return ; // 这里只处理电梯按钮的事件,且电梯运行期间不处理召唤电梯事件
const e = targetEntity; // 方便一点
elevator_Floor.position.y = Floor_Postion_Y[e.floor]; // 电梯传送至对应楼层的位置
});
elevator_Options.sort(elevator_Cmp); // 对选项进行排序
elevator_Floor.is_Work = false; // 默认不在运行
elevator_Floor.enableInteract = true; // 可互动
elevator_Floor.interactHint = '选择楼层'; // 名称
elevator_Floor.interactRadius = 1.5; // 距离
elevator_Floor.interactColor = get_Color(100,200,255); // 颜色为天蓝色
elevator_Floor.onInteract(async({entity}) => { // 处理电梯的互动事件
if (elevator_Floor.is_Work) return ; // 运行期间不处理
const dialog = await entity.player.dialog({ // 获取目标楼层
type: Box3DialogType.SELECT, // 选项类型对话框
content: '请选择楼层:', // 文本
options: elevator_Options // 楼层选项
});
if (!dialog || dialog === null) return ; // 直接叉掉则不处理
const floor = dialog.index + 1; // 要去的楼层,因为下标从0开始所以要+1
const target = Floor_Postion_Y[floor]; // 目标楼层的y坐标
if (elevator_Floor.is_Work) return ; // 如果电梯在询问楼层之间,有人提前使电梯开始运行,则直接跳出,防止电梯 左 右 为 难
elevator_Floor.is_Work = true; // 开始运行
if (elevator_Floor.position.y < target) { // 在目标楼层下面
while (elevator_Floor.position.y < target) { elevator_Floor.position.y += 0.1; await sleep(5); } // 往上走
} else { // 在上面
while (elevator_Floor.position.y > target) { elevator_Floor.position.y -= 0.1; await sleep(5); } // 往下走
}
elevator_Floor.position.y = target; // 再次设置电梯坐标为目标楼层坐标,防止有偏差
elevator_Floor.is_Work = false; // 停止运行
})
}
elevator_Init(); // 别忘了运行初始化函数