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

岛3喵的教程环节
API入门又来啦!
本次教程介绍1个新API
voxels.getVoxel(检测方块)
复习上两节学到的
voxels.setVoxel(搭建方块)
world.createEntity(创建实体)
就可以做出更好玩的事情啦~
请看视频
👇👇👇👇
(https://www.bilibili.com/video/BV1mp4y1k74P/)
本期代码
1. 单个圆柱体生成
(API: voxels.setVoxel) 
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) 
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) 
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) 
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
}

【互动环节】
1. 试一下变化代码,应用到你的地图创作里面
在评论发截图、代码或者编辑器链接
说说你的创作思路?
比如,做一片刀山火海

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

喵后公布答案
相关文档:
- API文档:https://docs.box3.codemao.cn/
- API教程1:怎么用搭建方块voxels.setVoxel快速建造
- API教程2:用创建实体world.createEntity,生成一片青青喵原
加入代码岛3.0官方内测Q喵
(づ。◕‿‿◕。)づ
1086DRRalsei我弄好了(声名:可复制):
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
评论
爱探险的可乐呀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
评论
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
评论

看~
代码:
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
评论