用户:
yee089查看:6 回复:10 评论:6 创建时间:2022-03-30T14:17:37
之前出了一期浮空岛手建教程,然后稍微有亿点肝。这次,我教大家做一下浮空岛速建(推荐自己手写实现,出大问题了再看代码)。
——————————————————————————————————————————————————————
/*
2、搭出岛的上轮廓(此处人机选择了从上向下搭,也可以从下往上,会好点(主要是我这么搭到底下光源不足,需要‘夜间施工法’()())):
3、向下缩小轮廓,每层缩小1个半径,大约缩小5格的‘半径’(不知道该这么说,‘只可意会,不可言传’):
4、改成dark_stone材料,然后每2层缩小一层半径,直到封住:
*/
这是之前的主体部分。
那么这个轮廓,肯定是要你自己搭的。那么,下面的部分就是现在我们要搞的。
那么,在下一层收缩轮廓怎么做呢?
分析:我们要收缩,分为两步:(1)把上一层复制下来;
(2)把边缘方块删除。
(1)不难,但是(2)怎么做呢?
我们要先分析边缘方块是有什么特点
/*
0000000
0222200
0211120
0222220
0000000
*/
这里,‘2’代表边缘方块,‘0’代表空气。容易看出,边缘方块一定在旁边有空气方块。
那么,我们可以写一个check()函数(检查上面的是不是边缘方块,是的话就不复制了):
const dir = [new Box3Vector3(-1,0,0),new Box3Vector3(0,0,-1),new Box3Vector3(0,0,1),new Box3Vector3(1,0,0) ];
function check(x,y,z){
var flag = true;
for(var i = 0; i < 4; i++){
let nowx = x+dir[i].x;
let nowy = y+dir[i].y+1;
let nowz = z+dir[i].z;
if(voxels.getVoxelId(nowx,nowy,nowz) == 0){
flag=false;
break;
}
}
return flag;
}
接着,第四步,底下是二个缩小一圈,就是稍微改一改代码。
但是,这样会有点不自然,怎么办呢?在check函数末尾加一段:
if(Math.random()*5 < 1){
flag=true;
}
(为什么自己想)。
好了,不出所料,你现在应该学会了,没学会,请看下面的代码()
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————(超级喵长的分割线和括号癌晚期()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()())
const dir = [new Box3Vector3(-1,0,0),new Box3Vector3(0,0,-1),new Box3Vector3(0,0,1),new Box3Vector3(1,0,0) ];
console.clear();
var voxel = voxels.id('zero');
function check(x,y,z){
var flag = true;
for(var i = 0; i < 4; i++){
let nowx = x+dir[i].x;
let nowy = y+dir[i].y+1;
let nowz = z+dir[i].z;
if(voxels.getVoxelId(nowx,nowy,nowz) == 0){
flag=false;
break;
}
}
if(Math.random()*5 < 1){
flag=true;
}
return flag;
}
async function bfs(x,y,z){
let queue = [new Box3Vector3(0,0,0),new Box3Vector3(0,0,0),new Box3Vector3(0,0,0)];
queue.pop();
queue.pop();
queue.pop();
let stpq=[0,0,0];
stpq.pop();
stpq.pop();
queue.push(new Box3Vector3(x,y,z));
world.say(x + ' ' + y +' ' + z);
while(queue.length > 0){
let now = queue[0];
queue.shift();
let stp = stpq[0];
stpq.shift();
for(let i = 0; i < 4; i++){
let nowx = now.x+dir[i].x;
let nowy = now.y+dir[i].y;
let nowz = now.z+dir[i].z;
if(voxels.getVoxelId(nowx,nowy,nowz) == voxels.id('stone')){
if(stp < 35){
queue.push(new Box3Vector3(nowx,nowy,nowz));
stpq.push(stp+1);
voxels.setVoxelId(nowx,nowy,nowz,voxel)
}
}
}
await sleep(1);
}
console.log('finishbfs');
}
(async function(){
let y;
for(var i = 0; i < 128; i++){
for(var j = 0; j < 128; j++){
for(var k = 0; k < 128; k++){
if(voxels.getVoxelId(i,j,k) == voxel){
y=j;
await bfs(i,j,k);
break;
}
}
}
}
for(var j = y-1; j > y-6; j--){
for(var i = 0; i < 128; i++){
for(var k = 0; k < 128; k++){
if(voxels.getVoxelId(i,j+1,k) == voxel && check(i,j,k)){
voxels.setVoxelId(i,j,k,voxel);
await sleep(10);
}
}
}
}
for(var j = y-6; j > y-40; j-=2){
for(var i = 0; i < 128; i++){
for(var k = 0; k < 128; k++){
if(voxels.getVoxelId(i,j+1,k) == voxel && check(i,j,k)){
voxels.setVoxelId(i,j,k,voxel);
voxels.setVoxelId(i,j-1,k,voxel);
await sleep(10);
}
}
}
}
for(var i = 0; i < 128; i++){
for(var j = 0; j < 128; j++){
for(var k = 0; k < 128; k++){
if(voxels.getVoxelId(i,j,k) == voxel){
voxels.setVoxel(i,j,k,'stone');
}
}
}
}
})()
(PS:首先搭好最上面的一层,在中间放一个‘zero’方块,再把这玩意丢进控制台)