用户:小苏打_查看:20 回复:18 评论:20 创建时间:2021-08-20T11:33:00
先奉上效果图:

然后是速建代码(注:第6行start代表的是一个坐标(没有用box3Vector3是因为我懒得解析
)):
/****
* project-2
* 足球场
*/
/* 球场速建 */
const start = [33, 8, 98]; /* 可更改 */
(async function () {
for (var x = start[0]; x < start[0] + 105; x++) {
for (var z = start[2]; z < start[2] + 68; z++) {
voxels.setVoxelId(x, start[1], z, 177);
}
}
for (var xx = 0; xx < 21; xx++) {
for (var z = start[2]; z <= start[2] + 68; z++) {
for (var i = 0; i < 5; i++) {
if (xx % 2) {
voxels.setVoxel(xx * 5 + i + start[0], start[1] + 1, z, 'grass');
} else {
voxels.setVoxel(xx * 5 + i + start[0], start[1] + 1, z, 'dark_grass');
}
}
await sleep(3);
}
}
for (var i = start[2]; i < start[2] + 68; i++) { voxels.setVoxel(start[0], start[1] + 1, i, 'white'); }
for (var i = start[2]; i < start[2] + 68; i++) { voxels.setVoxel(start[0] + 105, start[1] + 1, i, 'white'); }
for (var i = start[0]; i < start[0] + 105; i++) { voxels.setVoxel(i, start[1] + 1, start[2], 'white'); }
for (var i = start[0]; i < start[0] + 105; i++) { voxels.setVoxel(i, start[1] + 1, start[2] + 68, 'white'); }
voxels.setVoxel(start[0], start[1] + 2, start[2] + 30, 'white');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0], start[1] + 2, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 1, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 1, start[1] + 3, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 2, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 3, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 3, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 2, start[1] + 4, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 3, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 3, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 3, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 4, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 4, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 3, start[1] + 5, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 2, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 2, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 3, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 3, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 4, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 4, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 31, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 32, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 33, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 34, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 35, 'white');
voxels.setVoxel(start[0] + 4, start[1] + 5, start[2] + 36, 'white');
/*球门2 */
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 105, start[1] + 2, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 104, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 104, start[1] + 3, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 103, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 3, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 3, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 103, start[1] + 4, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 102, start[1] + 2, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 2, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 3, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 3, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 4, start[2] + 30, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 4, start[2] + 36, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 31, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 32, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 33, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 34, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 35, 'spiderweb');
voxels.setVoxel(start[0] + 102, start[1] + 5, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 2, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 2, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 3, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 3, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 4, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 4, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 36, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 30, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 31, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 32, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 33, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 34, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 35, 'white');
voxels.setVoxel(start[0] + 101, start[1] + 5, start[2] + 36, 'white');
for (var z = start[2]; z <= start[2] + 68; z++) { voxels.setVoxel(start[0] + 52, start[1] + 1, z, 'white') }
const origin = new Box3Vector3(start[0] + 52, start[1] + 1, start[2] + 33);
for (var x = start[0] + 52 - 5; x <= start[0] + 52 + 5; x++) {
for (var z = start[2] + 33 - 5; z <= start[2] + 33 + 5; z++) {
if (origin.distance(new Box3Vector3(x, start[1] + 1, z)) >= 4 && origin.distance(new Box3Vector3(x, start[1] + 1, z)) <= 5.5) {
voxels.setVoxel(x, start[1] + 1, z, 'white');
}
}
}
}());
有了足球场,怎么能没有球呢?
踢球代码(注:仅仅是喵可以被踢,点击也好,直接碰撞也罢,具体玩法还是需要各位才华横溢的 甲方(划掉) 代码师自行添加):
/**
* project-2 p2
* 足球代码
*/
/* 点击踢球 */
world.onClick(async ({ entity, clicker, distance, raycast }) => {
if (entity.id != 'ball' || entity.isPlayer) {
return;
}
if (distance >= 5) {
return;
}
entity.velocity.x += raycast.direction.x * (5 - distance) * 0.7;
entity.velocity.y += 0.05 * raycast.direction.y * (5 - raycast.distance) * 0.5;
entity.velocity.z += raycast.direction.z * (5 - distance) * 0.7;
})
let rx = 0;
let ry = 0;
let rz = 0;
world.onVoxelContact(({ entity, force }) => {
if (entity.id != 'ball') {
return;
}
rx += Math.abs(entity.velocity.x * 3);
ry += Math.abs(entity.velocity.y * 3);
rz += Math.abs(entity.velocity.z * 3);
if (force.y > 0.02) {
entity.velocity.y = force.y * 20;
entity.velocity.x = force.x * 40;
entity.velocity.z = force.z * 40;
}
})
/* 球的旋转 */
world.onTick(async () => {
world.querySelectorAll('#ball').forEach((entity) => {
if (entity.velocity.x != 0 || entity.velocity.z != 0) {
entity.meshOrientation.x = Math.cos(Math.round(entity.velocity.x * 0.05 * 180 / Math.PI));/* 感谢某位无名大佬帮忙完善(小鹰/cm/...) */
entity.meshOrientation.y = Math.cos(Math.round(entity.velocity.y * 0.05 * 180 / Math.PI));/* 感谢某位无名大佬帮忙完善(小鹰/cm/...) */
entity.meshOrientation.z = Math.cos(Math.round(entity.velocity.z * 0.05 * 180 / Math.PI));/* 感谢某位无名大佬帮忙完善(小鹰/cm/...) */
}
})
})
world.querySelector('#ball').meshScale = new Box3Vector3(1 / 19, 1 / 19, 1 / 19);
(注:须在地图内放置(而不是仅仅在模型文件中存在)一个球,将它命名为 ball,此代码才可生效。最后一行球的缩放比例可以自由更改,但笔者不建议调整至1/16以上)
各位大佬不要喷,我只是新手,有错误请指出。