用户:
Forzen_Seven查看:6 回复:11 评论:6 创建时间:2022-01-02T21:15:10
我就不解释了吧
直接上代码
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;
})
})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
评论
未名用户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
评论
Iaeaimgsrc="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
评论