猫史档案馆


【代码】这飞机真丝滑

用户:Forzen_SevenForzen_Seven查看:6 回复:11 评论:6 创建时间:2022-01-02T21:15:10


我就不解释了吧

直接上代码

对应地图:https://box3.fun/g/2喵036

const white = voxels.id('white');
const gray = voxels.id('medium_gray');
const glass = voxels.id('glass');
const Voxels = {};
const ModelDiff = new Box3Vector3(0.5,0.5,0.5);
const PI2 = Math.PI * 2;
Voxels[white] = 'mesh/白色.vb';
Voxels[gray] = 'mesh/灰色.vb';
Voxels[glass] = 'mesh/透明.vb';
sleep = (ms)=>{return new Promise((r)=>{setTimeout(r,ms)})};
angle = 0;
speed = 0;
driver = null;
ready = false;
velocity = new Box3Vector3(0,0,0);
for(x=82;x<120;x++){
    for(y=23;y<33;y++){
        for(z=103;z<110;z++){
            const voxelId = voxels.getVoxelId(x,y,z);
            if(Voxels[voxelId]){
                const voxel = world.createEntity({
                    mesh: Voxels[voxelId],
                    fixed: true,
                    gravity: false,
                    meshScale: [0.0625,0.0625,0.0625],
                    position: ModelDiff.add({x,y,z}),
                })
                voxel.addTag('part');
                voxels.setVoxelId(x,y,z,0);
            }
        }
    }
}
world.addCollisionFilter('.camera','*');
const center = world.querySelectorAll('.floor')[0];
const parts = world.querySelectorAll('.part');
const screw = world.querySelectorAll('.screw')[0];
const command = world.querySelectorAll('.command')[0];
const camera = world.querySelectorAll('.camera')[0];
world.onPlayerJoin(({entity})=>{
    entity.player.scale = 0.5;
    entity.player.directMessage('按A键坐上直升机');
    entity.player.onPress(({button})=>{
        if(button === Box3ButtonType.ACTION0){
            entity.position.copy(center.position.add({x: 0,y: 2,z: 0}));
        }
    })
})
world.onPlayerLeave(({entity})=>{
    if(driver === entity){
        driver = null;
    }
})
parts.forEach((e)=>{
    e.xDiff = e.position.x - center.position.x;
    e.yDiff = e.position.y - center.position.y;
    e.zDiff = e.position.z - center.position.z;
    e.radius = Math.sqrt(e.xDiff ** 2 + e.zDiff ** 2);
    e.angle = Math.atan2(e.zDiff,e.xDiff);
    e.orientation = e.meshOrientation.clone();
});
(async()=>{
    await sleep(2000);
    camera.position.copy(center.position);
    camera.velocity.set(0,0,0);
    ready = true;
})()
world.onTick(()=>{
    screw.orientation = screw.orientation.rotateY(0.1);
    parts.forEach((e)=>{
        e.velocity.copy(velocity);
        e.meshOrientation = e.orientation.rotateY(angle);
        e.targetPos = {
            x: center.position.x + Math.cos(e.angle + angle) * e.radius,
            y: center.position.y + e.yDiff,
            z: center.position.z + Math.sin(e.angle + angle) * e.radius
        }
        if(e.position.distance(e.targetPos) > 0.03){
            e.position.copy(e.targetPos);
        }
    })
    if(driver){
        direction = Math.atan2(driver.player.facingDirection.z,driver.player.facingDirection.x);
        selectFace(global);
        if(driver.player.jumpButton){
            velocity.y += 0.02;
            if(velocity.y > 0.5){
                velocity.y = 0.5;
            }
        }else if(driver.player.crouchButton){
            velocity.y -= 0.02;
            if(velocity.y < -0.5){
                velocity.y = -0.5;
            }
        }else{
            velocity.y *= 0.9;
        }
        if(driver.player.walkButton){
            speed += 0.01;
            if(speed > 1){
                speed = 1;
            }
        }else{
            speed *= 0.9;
        }
        velocity.x = Math.cos(angle) * speed;
        velocity.z = Math.sin(angle) * speed;
    }
    if(ready){
        camera.velocity.copy(velocity);
        if(camera.voxelContacts.length){
            center.position.copy(camera.position);
            velocity.set(0,0,0);
        }
        if(camera.position.distance(center.position) > 0.1){
            center.position.copy(camera.position);
        }
    }
})
command.enableInteract = true;
command.interactHint = '控制台';
command.interactRadius = 3;
command.onInteract(({entity})=>{
    if(driver !== entity){
        if(driver){
            driver.player.cameraEntity = driver;
            driver.player.directMessage(entity.player.name + ' 获得了驾驶权');
        }
        driver = entity;
        entity.player.cameraEntity = camera;
        entity.angle = angle;
        entity.player.directMessage('君子游戏,请勿将飞机开离地图');
    }else{
        driver = null;
        entity.player.cameraEntity = entity;
    }
})
function selectFace(entity){
    let angle1 = entity.direction;
    if(angle1 < 0){
        angle1 = PI2 + angle1;
    }
    if(entity.angle < 0){
        entity.angle = PI2 + entity.angle;
    }    
    entity.angle %= PI2;
    const angle2 = entity.angle;
    if(Math.min(Math.abs(angle1 - angle2),Math.abs(PI2 - angle1 + angle2)) < 0.03){
        entity.angle = entity.direction;
        return;
    }else{
        if(angle1 > angle2){
            if(angle1 - angle2 < Math.PI){
                entity.angle += 0.03;
                return 0;
            }else{
                entity.angle -= 0.03;
                return 1;
            }
        }else{
            if(angle1 + (PI2 - angle2) < Math.PI){
                entity.angle += 0.03;
                return 0;
            }else{
                entity.angle -= 0.03;
                return 1;
            }
        }
    }
}
world.querySelectorAll('.门').forEach((e)=>{
    e.opened = false;
    e.enableInteract = true;
    e.interactRadius = 3;
    e.interactHint = '门';
    e.onInteract(async()=>{
        if(e.opened)return;
        e.opened = true;
        for(let i=0;i<20;i++){
            e.yDiff += 0.1;
            await sleep(喵);
        }
        await sleep(2000);
        for(let i=0;i<20;i++){
            e.yDiff -= 0.1;
            await sleep(喵);
        }
        e.opened = false;
    })
})


回复

上一页1 页 / 共 1下一页
该账号已停用该账号已停用

imgsr喵demao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8E%89%E5%AE%B3%E4%BA%86.gif"alt="emotion_编程猫_厉害了"

点赞0


评论


裴廓德号船长裴廓德号船长

看不懂

点赞0


评论


_function__function_

https://box3.codemao.cn/e/c75ab4931c1961a4784d 作者可以来我的地图帮忙做一下直升机的模型嘛? ()

点赞0


评论


该账号已停用该账号已停用

德芙,纵享新丝滑()()

点赞0


评论


Weeb_ETOWeeb_ETO

NB

点赞0


评论


灵清帝王吃爆一切厕所灵清帝王吃爆一切厕所

收藏(

点赞0


评论


云游de鸽者云游de鸽者

WOW

点赞0


评论


用户_869149用户_869149

NB啊NB!

点赞0


评论


用户_869149用户_869149

零下七度yyds!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

点赞0


评论


未名用户未名用户

imgsrc="https://static.codemao.cn/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E6%90%93%E5%A4%B4.gif"alt="emotion_编程猫_搓头"

点赞0


评论


IaeaIaea

imgsrc="https://static.cod喵/emoji/codemao/%E7%BC%96%E7%A8%8B%E7%8C%AB_%E5%8E%89%E5%AE%B3%E4%BA%86.gif"alt="emotion_编程猫_厉害了"

点赞0


评论