猫史档案馆


【box3】电梯但是视角动画版代码

用户:翎with珝翎with珝查看:0 回复:0 评论:0 创建时间:2023-06-17T19:39:06


1.普通版编辑器代码

world.onPlayerJoin(async ({ entity }) => {
    entity.player.lifting = false;//初始化玩家的电梯状态
})

//玩家对应的楼层坐标
var lift_Position_Gamer = [
    new Box3Vector3(10, 12, 63),//1层坐标
    new Box3Vector3(10, 24, 63),//2层坐标
    new Box3Vector3(10, 36, 63),//3层坐标
    new Box3Vector3(10, 48, 63),//4层坐标
]

//视角模型对应的楼层坐标
var lift_Position_Visual_Angle = [
    new Box3Vector3(2.5, 12, 63),//1层坐标
    new Box3Vector3(2.5, 24, 63),//2层坐标
    new Box3Vector3(2.5, 36, 63),//3层坐标
    new Box3Vector3(2.5, 48, 63),//4层坐标
]

//电梯主代码
world.querySelectorAll("*").forEach(async (e) => {
    if (e.hasTag('电梯')) {//遍历的实体有名为“电梯”的标签,则设置该实体为可互动
        e.enableInteract = true
        e.interactRadius = 3
        e.interactHint = `${e.id}层电梯`

        e.onInteract(async ({ entity }) => {
            //遍历可用电梯
            let lift = [];
            world.querySelectorAll("*").forEach(async (t) => {
                if (t.hasTag('电梯') && e.id !== t.id && !lift.includes(`${t.id}层`)) {
                    lift.push(`${t.id}层`)
                }
            });
            lift.push('退出');

            //选择楼层
            let storey = await entity.player.dialog({
                type: Box3DialogType.SELECT,
                titleBackgroundColor: new Box3RGBColor(255, 215, 0),
                title: `${e.id}层电梯`,
                content: entity.player.lifting == false ? `你当前处于第 ${e.id} 层\n目前共有 ${lift.length - 1} 组可用电梯\n${lift.length - 2 == 0 || lift.length - 1 == 0 ? '没有电梯可以使用' : '请问你要前往几层'}` : `当前有 ${lift.length - 1} 组可用电梯\n你正在乘坐电梯`,
                options: entity.player.lifting == false ? lift.sort() : ['退出']
            });

            if (!storey) return;

            if (storey) {
                if (storey.value == '退出') {
                    entity.player.cancelDialogs();
                    return;
                } else {
                    await lift_Run(
                        entity,//玩家
                        lift_Position_Visual_Angle[parseFloat(e.id) - 1],//视角初始位置
                        lift_Position_Visual_Angle[parseFloat(storey.value) - 1],//视角结束位置
                        lift_Position_Gamer[parseFloat(storey.value) - 1],//玩家传送位置
                        //绝对值视角动画时间
                        Math.abs(
                            (parseFloat(e.id) - 1) - (parseFloat(storey.value) - 1)
                        )
                    )
                }
            }
        })
    }
})

//视角动画
async function lift_Run(entity, start_Lift, over_Lift, over_Gamer, range) {
    //创建一个实体“e”,设置坐标为视角的初始位置
    let e = world.createEntity({
        position: start_Lift,
    })

    //实体的动画,玩家的视角目标为实体
    let ani = e.animate([
        { position: start_Lift, duration: 1 },
        { position: start_Lift, duration: 5 },
        { position: over_Lift, duration: 1 },
    ], {
        duration: 24 * (12 / (2 * 2)) * range,
        iterations: 1,
        direction: Box3AnimationDirection.NORMAL,
    })

    //设置玩家的状态
    entity.player.directMessage('电梯启动')
    entity.player.cameraEntity = e
    entity.player.disableInputDirection = Box3InputDirection.BOTH
    entity.player.showName = false
    entity.player.invisible = true
    entity.player.enableJump = false
    entity.player.lifting = true
    
    ani.onFinish(async () => {
        world.querySelectorAll("player").forEach(async (p) => {
            if (p.player.name == entity.player.name) {
                //停止运行后将玩家数据恢复
                entity.player.directMessage('电梯停了')
                entity.player.cameraEntity = entity
                entity.player.cameraMode = Box3CameraMode.FOLLOW
                entity.position.copy(over_Gamer)
                entity.player.disableInputDirection = Box3InputDirection.NONE
                entity.player.showName = true
                entity.player.invisible = false
                entity.player.enableJump = true
                entity.player.lifting = false
            }
        })
        //删除实体
        e.destroy()
    });
};

2.PRO版编辑器代码

world.onPlayerJoin(async ({ entity }) => {
    entity.player.lifting = false;//初始化玩家的电梯状态
})

//玩家对应的楼层坐标
var lift_Position_Gamer = [
    new GameVector3(10, 12, 63),//1层坐标
    new GameVector3(10, 24, 63),//2层坐标
    new GameVector3(10, 36, 63),//3层坐标
    new GameVector3(10, 48, 63),//4层坐标
]

//视角模型对应的楼层坐标
var lift_Position_Visual_Angle = [
    new GameVector3(2.5, 12, 63),//1层坐标
    new GameVector3(2.5, 24, 63),//2层坐标
    new GameVector3(2.5, 36, 63),//3层坐标
    new GameVector3(2.5, 48, 63),//4层坐标
]

//电梯主代码
world.querySelectorAll("*").forEach(async (e) => {
    if (e.hasTag('电梯')) {//遍历的实体有名为“电梯”的标签,则设置该实体为可互动
        e.enableInteract = true
        e.interactRadius = 3
        e.interactHint = `${e.id}层电梯`

        e.onInteract(async ({ entity }) => {
            //遍历可用电梯
            let lift = [];
            world.querySelectorAll("*").forEach(async (t) => {
                if (t.hasTag('电梯') && e.id !== t.id && !lift.includes(`${t.id}层`)) {
                    lift.push(`${t.id}层`)
                }
            });
            lift.push('退出');

            //选择楼层
            let storey = await entity.player.dialog({
                type: GameDialogType.SELECT,
                titleBackgroundColor: new GameRGBColor(255, 215, 0),
                title: `${e.id}层电梯`,
                content: entity.player.lifting == false ? `你当前处于第 ${e.id} 层\n目前共有 ${lift.length - 1} 组可用电梯\n${lift.length - 2 == 0 || lift.length - 1 == 0 ? '没有电梯可以使用' : '请问你要前往几层'}` : `当前有 ${lift.length - 1} 组可用电梯\n你正在乘坐电梯`,
                options: entity.player.lifting == false ? lift.sort() : ['退出']
            });

            if (!storey) return;

            if (storey) {
                if (storey.value == '退出') {
                    entity.player.cancelDialogs();
                    return;
                } else {
                    await lift_Run(
                        entity,//玩家
                        lift_Position_Visual_Angle[parseFloat(e.id) - 1],//视角初始位置
                        lift_Position_Visual_Angle[parseFloat(storey.value) - 1],//视角结束位置
                        lift_Position_Gamer[parseFloat(storey.value) - 1],//玩家传送位置
                        //绝对值视角动画时间
                        Math.abs(
                            (parseFloat(e.id) - 1) - (parseFloat(storey.value) - 1)
                        )
                    )
                }
            }
        })
    }
})

//视角动画
async function lift_Run(entity, start_Lift, over_Lift, over_Gamer, range) {
    //创建一个实体“e”,设置坐标为视角的初始位置
    let e = world.createEntity({
        position: start_Lift,
    })

    //实体的动画,玩家的视角目标为实体
    let ani = e.animate([
        { position: start_Lift, duration: 1 },
        { position: start_Lift, duration: 5 },
        { position: over_Lift, duration: 1 },
    ], {
        duration: 24 * (12 / (2 * 2)) * range,
        iterations: 1,
        direction: GameAnimationDirection.NORMAL,
    })

    //设置玩家的状态
    entity.player.directMessage('电梯启动')
    entity.player.cameraEntity = e
    entity.player.disableInputDirection = GameInputDirection.BOTH
    entity.player.showName = false
    entity.player.invisible = true
    entity.player.enableJump = false
    entity.player.lifting = true
    
    ani.onFinish(async () => {
        world.querySelectorAll("player").forEach(async (p) => {
            if (p.player.name == entity.player.name) {
                //停止运行后将玩家数据恢复
                entity.player.directMessage('电梯停了')
                entity.player.cameraEntity = entity
                entity.player.cameraMode = GameCameraMode.FOLLOW
                entity.position.copy(over_Gamer)
                entity.player.disableInputDirection = GameInputDirection.NONE
                entity.player.showName = true
                entity.player.invisible = false
                entity.player.enableJump = true
                entity.player.lifting = false
            }
        })
        //删除实体
        e.destroy()
    });
};

 

注:代码已测试,实用无BUG

 

By ZeYB   


回复

上一页1 页 / 共 0下一页