猫史档案馆


【岛3-API教程3!】用方块检测,做一片刀山火海🌋

用户:神岛吉吉喵神岛吉吉喵查看:116 回复:97 评论:116 创建时间:2020-11-06T19:37:50


center_image

岛3喵的教程环节

API入门又来啦!

 

本次教程介绍1个新API

voxels.getVoxel(检测方块)

 

复习上两节学到的

voxels.setVoxel(搭建方块)

world.createEntity(创建实体)

 

就可以做出更好玩的事情啦~

请看视频

👇👇👇👇

https://www.bilibili.com/video/BV1mp4y1k74P/

 

本期代码

1. 单个圆柱体生成

(API: voxels.setVoxel) center_image

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;
      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

cylinder(63,9,63,'dirt',3,1)// 演示圆柱不同半径和高度

2. 多个圆柱体随机生成复杂地形

(API: voxels.setVoxel) center_image

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;
      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

for(var i=0;i<300;i++){ // 300个随机圆柱体构成场景
  let x = Math.random() * 125 // x坐标
  let z = Math.random() * 125 // z坐标
  let r = 2 + Math.random() * 5 //半径 2~7
  let h = Math.random() * 4 // 高 0~4
  cylinder(x,9,z,'dirt',r,h)
}

3. 扫描检测地形表面 改成喵地

(API: voxels.getVoxel) center_image

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;
      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

for(var i=0;i<300;i++){ // 300个随机圆柱体构成场景
  let x = Math.random() * 125 // x坐标
  let z = Math.random() * 125 // z坐标
  let r = 2 + Math.random() * 5 //半径 2~7
  let h = Math.random() * 4 // 高 0~4
  cylinder(x,9,z,'dirt',r,h)
}

for(var y=9;y<13;y++){//扫描9~12层的格子
  for(var x=0;x<127;x++){
    for(var z=0;z<127;z++){
      if(voxels.getVoxel(x,y,z)!=0 && voxels.getVoxel(x,y+1,z)==0){// 如果当前格子不为空而它上面那格是空的, 则表示它是此地形的表面 
        voxels.setVoxel(x,y,z,'grass')// 土块替换成喵地
      }
    }
  }
}

 

4. 结合上个教程, 在复杂地形生成花喵树木

(API: world.createEntity) center_image

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;
      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

for(var i=0;i<300;i++){ // 300个随机圆柱体构成场景
  let x = Math.random() * 125 // x坐标
  let z = Math.random() * 125 // z坐标
  let h = Math.random() * 4 // 高 0~4
  let r = 2 + Math.random() * 5 //半径 2~7
  cylinder(x,9,z,'dirt',r,h)
}

for(var y=9;y<13;y++){//扫描9~12层的格子
  for(var x=0;x<127;x++){
    for(var z=0;z<127;z++){
      // 如果当前格子不为空而它上面那格是空的, 则表示它是复杂地形的表面 
      if(voxels.getVoxel(x,y,z)!=0 && voxels.getVoxel(x,y+1,z)==0){
        voxels.setVoxel(x,y,z,'grass')// 土块替换成喵地
        
        // 在喵地上以3%的几率生成3种植物的其中一种
        var rnd = Math.random()
        var cx = x+0.5 // 修正到方块中心的x坐标
        var cz = z+0.5 // 修正到方块中心的z坐标
        if(rnd<0.01){
          spawn(cx,y+1,cz,'mesh/树.vb',3+2.5*Math.random())
        }else if(rnd<0.02){
          spawn(cx,y+1,cz,'mesh/花.vb',0.8)
        }else if(rnd<0.03){
          spawn(cx,y+1,cz,'mesh/茂盛的喵.vb',0.8)
        }
      }
    }
  }
}

async function correctY(entity){
  await sleep(1)//entity.bounds需要等到下一个tick才会变成真正的值
  entity.position.y += entity.bounds.y//bounds.y是中心点到模型顶部或底部的距离
}

function spawn(x,y,z,meshName,scale){
  const meshScale = scale/16 //默认模型方块大小倍数为地图方块的1/16
  const entity = world.createEntity({
    mesh:meshName,//模型名
    collides:false,//不能碰撞
    fixed:true,//固定
    gravity:false,// 不受重力影响
    meshScale:[meshScale,meshScale,meshScale],//xyz放大倍数
    position:[x,y,z],//位置坐标
  })
  correctY(entity)
  return entity
}

 

emotion_编程猫_搓头

【互动环节】

1. 试一下变化代码,应用到你的地图创作里面

在评论发截图、代码或者编辑器链接

说说你的创作思路?

比如,做一片刀山火海

center_image

 

2. 挑战:如果要改一下代码,做成约一片浮空魔法小岛,

应该怎么改?

center_image

喵后公布答案

 

相关文档:

- API文档:https://docs.box3.codemao.cn/

- API教程1:怎么用搭建方块voxels.setVoxel快速建造

- API教程2:用创建实体world.createEntity,生成一片青青喵原

 

加入代码岛3.0官方内测Q喵

官网:box3.codemao.cn

(づ。◕‿‿◕。)づ


回复

上一页1 页 / 共 4下一页
望_庐山望_庐山

沙发

点赞0


评论


seven葫中葫seven葫中葫

沙发

点赞0


评论


无双喵无双喵

前排

点赞0


评论


南方一霸南方一霸

龙椅

点赞0


评论


南方一霸南方一霸

把高度修改憋

点赞0


评论


Fox_AwaFox_Awa

前排!!!!

点赞0


评论


逍遥WYC逍遥WYC

前排!!!!

点赞0


评论


该账号已被封禁该账号已被封禁

凳子

点赞0


评论


Fox_AwaFox_Awa

吉吉喵透露下,console._this(隐藏).protocol.server里面是什么?

[doge]

点赞0


评论


锦茸残叶锦茸残叶

前排!!!

点赞0


评论


TobylaiTobylai

前排

点赞0


评论


1086DRRalsei1086DRRalsei

我弄好了(声名:可复制):

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;
      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

for(var i=0;i<300;i++){ // 300个随机圆柱体构成场景
  let x = Math.random() * 125 // x坐标
  let z = Math.random() * 125 // z坐标
  let r = 2 + Math.random() * 5 //半径 2~7
  let h = Math.random() * 4 // 高 0~4
  cylinder(x,9,z,'lava01',r,h)
}

for(var y=9;y<13;y++){//扫描9~12层的格子
  for(var x=0;x<127;x++){
    for(var z=0;z<127;z++){
      if(voxels.getVoxel(x,y,z)!=0 && voxels.getVoxel(x,y+1,z)==0){// 如果当前格子不为空而它上面那格是空的, 则表示它是此地形的表面 
        voxels.setVoxel(x,y,z,'lava02')// 土块替换成喵地
      }
    }
  }
}

点赞0


评论


幻想一笑而过幻想一笑而过

前排

点赞0


评论


1086DRRalsei1086DRRalsei

链接在这:

https://box3create.codemao.cn/games/57b12535726084ea4f94?p=ORiMKekBdXjluPSLIcLdk91oEAg2hjU2rPNOW%2F63dVA%2喵Py喵aLgVndWVzdA%3D%3D

emotion_编程猫_点赞

点赞0


评论


正在加载中。。正在加载中。。

前排!!!!!!!!!!!!!!!!!!

点赞0


评论


该账号该账号

前排

点赞0


评论


爱探险的可乐呀爱探险的可乐呀

for (var i = 0; i < 300; i++) { // 300个随机圆柱体构成场景
    let x = Math.random() * 125 // x坐标
    let y = 9 + Math.random() * 9 //y坐标
    let z = Math.random() * 125 // z坐标
    let h = Math.random() * 4 // 高 0~4
    let r = 2 + Math.random() * 5 //半径 2~7
    cylinder(x, y, z, 'dirt', r, h)
}

改高度就行了捏(这是全部地图的一部分代码)

点赞0


评论


龙的传人_龙的传人_

前排!!!!

点赞0


评论


ZNS_哪吒ZNS_哪吒

前排31楼纪念

点赞1


评论


洛亦ly洛亦ly

前排

点赞0


评论


YDS尹子YDS尹子

吉吉喵怎么不把我的地形代码宣传一下

/*
main conditions under here.
copyright YDS���� 2020,All rights reserved. 
*/
var grid={
	x:127,
	y:127,
    z:127,
    sx:70,
    sy:70,
    sz:70
};
var posY=7;
var sealevel=15;
var seed="";
var grassPos=[];
var pointer=0;
var mtD={
    num:10,
    h:7,
    w:6,
    hs:10,
    ws:5,
};



async function mt(position,yZoom,xzZoom){
    for(let tri=-xzZoom*3.14;tri<=xzZoom*3.14;tri+=0.05){
        for(let tri2=-xzZoom*3.14;tri2<=xzZoom*3.14;tri2+=0.05){
            var xh=Math.cos(tri/xzZoom)*yZoom;
            var zh=Math.cos(tri2/xzZoom)*yZoom;
            voxels.setVoxel(position.x+tri,position.y+xh+zh+0.5,position.z+tri2,"grass");
            grassPos[pointer]=position;
            pointer++;
        }
        await sleep(0.3);
    }
};

(async function(){
for(let i=1;i<=mtD.num;i++){
    var position={x:Math.random()*(grid.x-grid.sx)+grid.sx,y:posY,z:Math.random()*(grid.z-grid.sz)+grid.sz};
    var height=mtD.h+Math.random()*mtD.hs;
    var width=mtD.w+Math.random()*mtD.ws;
    await mt(position,height,width);

    world.say("开始生成山"+Math.round(i/mtD.num*1000)/10+"%");
}



for(let i=grid.sx;i<grid.x;i++){
    for(let j=grid.sz;j<grid.z;j++){
        for(let k=0;k<grid.y;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")){
                if(voxels.getVoxel(i,k+1,j)==voxels.id("grass")){
                    voxels.setVoxel(i,k,j,"dirt");
                }else if(voxels.getVoxel(i,k+1,j)==0){
                    for(let ii=position.y;ii<k;ii++){
                        voxels.setVoxel(i,ii,j,"dirt");
                    }
                }
               
            }
        }
        await sleep(1);
       
    }
    if(Math.round(i/0.126)/10%0.5==0){
        world.say("处理中。。。"+Math.round(i/0.126)/10+"%");
    }
    
}

world.say("开始生成水");
for(let i=grid.sx;i<grid.x;i++){
    for(let j=grid.sz;j<grid.z;j++){
        for(let k=0;k<sealevel;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")){
                voxels.setVoxel(i,k,j,"dirt")
            }else if(voxels.getVoxel(i,k,j)==0){
            voxels.setVoxel(i,k,j,"water")
        	}
        }
        
        if(voxels.getVoxel(i,sealevel,j)==voxels.id("grass")){
            voxels.setVoxel(i,sealevel,j,"sand")
        }else if(voxels.getVoxel(i,sealevel,j)==0){
            voxels.setVoxel(i,sealevel,j,"water")
        }
    }
}

})()
/*
extreme conditions under here.
copyright YDS���� 2020,All rights reserved. 
*/





//ice
var snowL=60;
(async function(){
world.say("开始生成雪线");
for(let i=0;i<127;i++){
    for(let j=0;j<127;j++){
        for(let k=snowL;k<127;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")&&Math.random()*1.3<1){
                voxels.setVoxel(i,k,j,"snow")
            }else if(voxels.getVoxel(i,k,j)==voxels.id("dirt")&&Math.random()*1.5<1){
            voxels.setVoxel(i,k,j,"snow")
        	}
        }
    }
}
})()



//tree
function tree(x,y,z){
    if(voxels.getVoxel(x,y,z)!=voxels.id("water")){
       var rand=1;
    for(let i=y+rand;i<y+4+rand;i++){
            voxels.setVoxel(x,i,z,"acacia");
        }
    for(let i=3+rand;i<5+rand;i++){
        for(let j=-2;j<3;j++){
            for(let k=-2;k<3;k++){
                voxels.setVoxel(x+j,y+i,z+k,"green_leaf");
            }
        }
    }
    for(let j=-1;j<2;j++){
        for(let k=-1;k<2;k++){
            voxels.setVoxel(x+j,y+5+rand,z+k,"green_leaf");
        }
    }
    voxels.setVoxel(x-1,y+6+rand,z,"green_leaf");
    voxels.setVoxel(x,y+6+rand,z,"green_leaf");
    voxels.setVoxel(x+1,y+6+rand,z,"green_leaf");
    voxels.setVoxel(x,y+6+rand,z-1,"green_leaf");
    voxels.setVoxel(x,y+6+rand,z+1,"green_leaf");
    }
    
};
(async function(){
for(let i=0;i<127;i++){
    for(let j=0;j<127;j++){
        for(let k=0;k<100;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")){
                if(Math.random()*200<=1){
                    tree(i,k,j);
                }
            }
        }
    }
    await sleep(10);
}

})();
//lamp
(async function(){
for(let i=0;i<127;i++){
    for(let j=0;j<127;j++){
        for(let k=0;k<100;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")&&voxels.getVoxel(i,k+1,j)==0){
                if(Math.random()*200<=1){
                    voxels.setVoxel(i,k,j,"palace_lamp");
                }
            }
        }
    }
    await sleep(10);
}

})();



//grass overFlow
var grid={
    x:127,
    y:127,
    z:127
};
for(let i=0;i<grid.x;i++){
    for(let j=0;j<grid.z;j++){
        for(let k=0;k<grid.y;k++){
            if(voxels.getVoxel(i,k,j)!=0){
                if(voxels.getVoxel(i,k+1,j)!=0&&voxels.getVoxel(i,k,j)==voxels.id("grass")){
                    voxels.setVoxel(i,k,j,"dirt");
                }
               
            }
        }

       
    }

    
}
//all chuLis


for(let i=0;i<127;i++){
    for(let j=0;j<127;j++){
        for(let k=0;k<127;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")){
                if(voxels.getVoxel(i,k+1,j)!=0){
                    voxels.setVoxel(i,k,j,"dirt");
                }else if(voxels.getVoxel(i,k+1,j)==0){
                    for(let ii=8;ii<k;ii++){
                        voxels.setVoxel(i,ii,j,"dirt");
                    }
                }
            }
        }
    }
}



//single mt
async function mt(position,yZoom,xzZoom){
    for(let tri=-xzZoom*3.14;tri<=xzZoom*3.14;tri+=0.05){
        for(let tri2=-xzZoom*3.14;tri2<=xzZoom*3.14;tri2+=0.05){
            var xh=Math.cos(tri/xzZoom)*yZoom;
            var zh=Math.cos(tri2/xzZoom)*yZoom;
            voxels.setVoxel(position.x+tri,position.y+xh+zh+0.5,position.z+tri2,"grass");
        }
        await sleep(0.3);
    }
};

(async function(){
    var position={x:126,y:6,z:126};
    var height=10;
    var width=10;
    await mt(position,height,width);

    world.say("开始生成山"+Math.round(i/mtD.num*1000)/10+"%");
})()


点赞0


评论


该账号已被封禁该账号已被封禁

https://box3create.codemao.cn/games/1fb34f1812b748b1a293

吉吉喵来取

可以生成石砖空岛

第一层是草地

点赞2


评论


呵嘿哈呵嘿哈

前排

点赞0


评论


传奇无敌传奇无敌

前排

点赞0


评论


小小爱html小小爱html

前排

点赞0


评论


公子熙公子熙

谢谢吉吉喵给我狼人皮肤~

点赞0


评论


ZNS_Beck小号ZNS_Beck小号

鼈骜!

点赞0


评论


yuansyuans

能不能加一个炸弹方块?

点赞1


评论


AbnormalLOGAbnormalLOG

center_image

看~

代码:

function cylinder(cx,cy,cz,vox,radius,height){
  var xend = cx+radius
  var yend = cy+height
  var zend = cz+radius
  for(var x=cx-radius;x<=xend;x++){
    for(var z=cz-radius;z<=zend;z++){
      var dx = x-cx;
      var dz = z-cz;



      if(Math.round(Math.sqrt(dx*dx+dz*dz))<=radius){
        for(var y=cy;y<yend;y++){
          voxels.setVoxel(x,y,z,vox)
        }
      }
    }
  }
}

for (var i = 0; i < 300; i++) { // 300个随机圆柱体构成场景
    let x = Math.random() * 125 // x坐标
    let y = 9 + Math.random() * 20 //y坐标
    let z = Math.random() * 125 // z坐标
    let h = Math.random() * 4 // 高 0~4
    let r = 2 + Math.random() * 5 //半径 2~7
    cylinder(x, y, z, 'stone', r, h)
}

for(var y=9;y<125;y++){//扫描9~12层的格子
  for(var x=0;x<127;x++){
    for(var z=0;z<127;z++){
      // 如果当前格子不为空而它上面那格是空的, 则表示它是复杂地形的表面 
      if(voxels.getVoxel(x,y,z)!=0 && voxels.getVoxel(x,y+1,z)==0){
        voxels.setVoxel(x,y,z,'grass')
                var rnd = Math.random()
        var cx = x+0.5 // 修正到方块中心的x坐标
        var cz = z+0.5 // 修正到方块中心的z坐标
        if(rnd<0.01){

            const ng= spawn(cx,y+1,cz,'mesh/小南瓜2.vb',1)
            ng.meshEmissive=0.1
            ng.meshColor=new Box3RGBAColor(1,1,0,1)
            ng.a喵Tag('南瓜')
        }
        else if (rnd<0.02) {

            spawn(cx,y+1,cz,'mesh/枯树1.vb',0.8)
        } else if (rnd<0.03) {
            spawn(cx,y+1,cz,'mesh/尖刺栏杆1.vb',0.8)
        } else if (rnd<0.04) {
            voxels.setVoxel(cx,y+1,cz,voxels.id('yellow_light'))
        } else if (rnd<0.05) {
            
        }

        


      }
    }
  }
}

async function correctY(entity){
  await sleep(1)//entity.bounds需要等到下一个tick才会变成真正的值
  entity.position.y += entity.bounds.y//bounds.y是中心点到模型顶部或底部的距离
}

function spawn(x,y,z,meshName,scale){
  const meshScale = scale/16 //默认模型方块大小倍数为地图方块的1/16
  const entity = world.createEntity({
    mesh:meshName,//模型名
    collides:false,//不能碰撞
    fixed:true,//固定
    gravity:false,// 不受重力影响
    meshScale:[meshScale,meshScale,meshScale],//xyz放大倍数
    position:[x,y,z],//位置坐标
  })
  if (meshName==='mesh/小南瓜2.vb') {
      voxels.setVoxel(x,y-1,z,voxels.id('yellow_light'))
  }
  correctY(entity)
  return entity
}

链接:https://box3create.codemao.cn/games/18ca953836983d8f1fed

点赞0


评论


lon江航lon江航

emotion_编程猫_加油

点赞0


评论