猫史档案馆


【box3】自制地形编辑器对外开放啦!

用户:YDS尹子YDS尹子查看:4024 回复:69 评论:71 创建时间:2020-11-28T09:28:49


链接在这里↓

www.yxtnt.cn/boxTE/terrainEditor.html

(注意,只支持256x256的地形!)

使用说明:

>一开始的时候请点击右侧的新建项目,创建一个新的地形。

>接下来是要填入的三个数据:

1.项目名,也就是地形数据导出后的名字

2.地形基准高度,也就是初始化的时候地形的高度

3.水平面基准高度,决定了你的地图的水的高度

>然后是绘制阶段!

1.使用鼠标配合W或S按键在画布上进行绘制(W是提升地面高度,S降低)。切勿在一点上停留太久,否则你的地形将十分的突兀!或者如果你想做一些惊险的地形的话,也可以这么做。

2.按F或G键调整画笔的大小。F减小,G放大。

>画好了,接下来:

1.确认地形都绘制完毕,按右侧的”导出项目(box3)“按钮导出一个txt文件。

2.先使用下方代码将原地图的地形削平:

(async function(){
for(let i=0;i<257;i++){
    for(let j=0;j<257;j++){
        for(let k=1;k<=8;k++){
            voxels.setVoxel(i,k,j,0)
        }
        voxels.setVoxel(i,0,j,"dirt");
        await sleep(0.1);
    }
    
}
})()

3.再打开生成的文件然后ctrl+a全选复制到岛三的控制台即可运行。(注意,不要复制到代码区!)

>美化

如果你还想给你的地图中点树的话,请运行以下代码:

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<257;i++){
    for(let j=0;j<257;j++){
        for(let k=0;k<50;k++){
            if(voxels.getVoxel(i,k,j)==voxels.id("grass")){
                if(Math.random()*200<=1){
                    tree(i,k,j);
                }
            }
        }
    }
    await sleep(10);
}

})();

>效果

center_image

center_image

center_image

这就是这次帖子的所有内容了,谢谢大家阅览!望大家可以做出好看的地图发在评论区里!


回复

上一页第 1 页 / 共 3 页下一页
YDS尹子YDS尹子

有bug请在这里反馈

点赞3


评论

eee

尹子 https://box3.codemao.cn/e/f757998bb80899a78550

为什么用f12上面的错误就不停加

为什么显示404???!!!

d'd

你要不要二级域名(就像酱:x x x . v e r c e l . a p p ), and你要不要酱的界面https­:­/­/­b­o­x3-blockly-web­.vercel­.app/

额,控制台400多个错误

怎样新建项目

ddd

有空合作吗

要啊,不过师傅能不能加我Skype一下()就搜尹子x雾霾


NomandNomand

OK

点赞0


评论


NomandNomand

按正常来说应该先搞个内测啥的,再去发布,你是觉得2050的品德老师复活了?

点赞0


评论

nomand,我现在联合一下其他人,在地图里有吉吉喵的最新代码禁烟2050

害,没用,人家那都臭名昭著,除非严重到让我找网警或者编程猫客服给打电话,根本没方法

估计编程猫客服也联系不上,他说不定都没有填写号码

没,实话实说内测过了这是……优化过的(汗)

讲真已经内测了快一个月了只是没通知你

无所谓了,就让他这么折腾吧,真的闹大了,自有人来处理

......看来真的我和你们没关系,只有等着好了才给我发邮件,唉


南方一霸南方一霸

对于我这种人看起来是两眼蒙蔽

点赞0


评论

确实

+1


AlcalaAlcala

666

点赞0


评论

虽然我没有懂的

metoo


11111111111121111111111112

喵

点赞0


评论


白篮白篮

不错不错,弄个项目库呗

点赞1


评论


该账号已停用该账号已停用

喵

点赞0


评论


BSS梅者如西BSS梅者如西

看了尹子的源代码……发现这水平是我一辈子达到不了的高度。。。

const sleep = (timeountMS) => new Promise((resolve) => {
    setTimeout(resolve, timeountMS);
  });


var canvas=document.getElementById("canvas");
var pen=canvas.getContext("2d");
/*types of data */
function xy(x,y){//鍧愭爣绯荤被鍨�
	this.x=x;this.y=y;
}
function vec(a,n){//鍚戦噺绫诲瀷
	this.a=a;this.n=n;
}
function angle(s,e){
    var x=e.x-s.x;
    var y=e.y-s.y;
    return Math.atan2(y,x);
}
function distance(s,e){
    var x=e.x-s.x;
    var y=e.y-s.y;
    return Math.sqrt(y*y+x*x);
}
function vtd(v,a){
    return new xy(
        Math.cos(a)*v,
        Math.sin(a)*v
    )
}
function fake_click(obj) {
    var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent(
        "click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null
    );
    obj.dispatchEvent(ev);
}
function download(name, data) {
    var urlObject = window.URL || window.webkitURL || window;

    var downloadData = new Blob([data]);

    var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
    save_link.href = urlObject.createObjectURL(downloadData);
    save_link.download = name;
    fake_click(save_link);
}

//consts
console.clear()
var cvs=new xy(canvas.width,canvas.height);
var data=new Array(cvs.x);
var projectName="鏂扮殑鍦板舰";
var level=0;
var mousePos=new xy();
//funcs
function cld(p,n){
    if(p.x>=0&&p.y>=0)
    data[p.x][p.y]+=n;
    return;
}
//data initialization
var angl=0,anglx=0,angly=0;
var waterLevel=10;
var zm=512/cvs.x
function getMousePos(e){
    mousePos=new xy(Math.round(e.offsetX/zm),Math.round(e.offsetY/zm));
    document.getElementById("shower").innerH喵L=`鍧愭爣:${mousePos.x},${mousePos.y}&nbsp;楂樺害:${Math.round(data[mousePos.x][mousePos.y])}&nbsp;<br>鐢荤瑪澶у皬:${rte}&nbsp;鍧″害:${angl}`
}
function exp(type){
    var e=`[`;
    for(let i=0;i<cvs.x;i++){
        e+="[";
        for(let j=0;j<cvs.y;j++){
            if(data[i][j]<=0){data[i][j]=0;}
            e+=`${Math.round(data[i][j])}`;
            if(j!=cvs.y-1){e+=",";}
        }
        e+="]";if(i!=cvs.y-1){e+=",";}
    }
    e+="]";
    if(type=="basic"){
        download(projectName+".txt",e);
        window.alert("瀵煎嚭鎴愬姛锛�")
    }else if(type=="box3"){
        var result=`
        (async function(){var data=${e};var sl=${waterLevel};
            for(let i=0;i<data.length;i++){
                for(let j=0;j<data[i].length;j++){
                    var 喵s="grass";
                    var d=data[i][j];
                    if(d<sl){喵s="dirt";}else if(d==sl||d==sl+1){喵s="sand";}else if(d>sl){喵s="grass";}
                    for(let k=0;k<d;k++){voxels.setVoxel(i,k,j,"dirt");}
                    voxels.setVoxel(i,d,j,喵s);
                }
                await sleep(10);
            }
            await sleep(100);
            world.say("water filling...");
            for(let i=0;i<data.length;i++){for(let j=0;j<data.length;j++){for(let k=0;k<=sl;k++){
                if(voxels.getVoxel(i,k,j)==0){voxels.setVoxel(i,k,j,"water");}
            }}
                await sleep(2);
            }
            })()
        `
        console.log(result);
        //璋冪敤鏂规硶
        download(projectName+".txt",result);
        window.alert("瀵煎嚭鎴愬姛锛�")
    }
}
function searchC(height){
    if(height<waterLevel-20){
        return "#003371";
    }else if(height<waterLevel-15){
        return "#0073ff";
    }else if(height<waterLevel-10){
        return "#00aeff";
    }else if(height<waterLevel-5){
        return "#44c1f6";
    }else if(height<waterLevel){
        return "#44cef6";
    }else if(height<waterLevel+5){
        return "#00bc12";
    }else if(height<waterLevel+10){
        return "#9ed900";
    }else if(height<waterLevel+20){
        return "#c9dd22";
    }else if(height<waterLevel+30){
        return "#fff143";
    }else if(height<waterLevel+40){
        return "#ffbb00";
    }else if(height<=waterLevel+50){
        return "#ffa400";
    }else{
        return "purple";
    }
}
var renderer={};

renderer.render=async function(){
    // pen.clearRect(0,0,canvas.width,canvas.height);
    // for(let i=0;i<renderer.renderData.length;i++){
        
    //     var d=renderer.renderData[i];
    //     var color=searchC(data[d.x][d.y]);
    //     pen.fillStyle=color;
    //     pen.strokeStyle=color;
    //     pen.moveTo(d.x,d.y);
    //     pen.beginPath();
    //     pen.fillRect(d.x,d.y,d.x+1,d.y+1);
    //     pen.stroke();
    //     if(i%5000==0)
    //     await sleep(1);
    // }
    // renderer.renderData=[];
    for(let i=0;i<cvs.x;i++){
        for(let j=0;j<cvs.y;j++){
            var color=searchC(data[i][j]);
            pen.fillStyle=color;
            pen.strokeStyle=color;
            pen.moveTo(i,j);
            pen.beginPath();
            pen.fillRect(i,j,i+1,j+1);
            pen.stroke();

        }
        if(i%500==0)
        await sleep(1);
    }
    // requestAnimationFrame(renderer.render);
}

function intitalize(){
    projectName=prompt("鏂板缓椤圭洰锛氭枃浠跺悕锛�");
    level=prompt("鍦板舰鍩哄噯楂樺害?");
    waterLevel=prompt("姘村钩闈㈠熀鍑嗛珮搴�?")*1;
    for(let i=0;i<data.length;i++){
        data[i]=new Array(cvs.y);
        for(let j=0;j<data[i].length;j++){
            data[i][j]=level*1;
        }
    }
    renderer.render();
    // requestAnimationFrame(renderer.render);
}
function load(){
    // var dat=prompt("璇疯緭鍏ユ暟鎹�");
    // eval("data=dat");
    // waterLevel=10;  
    // renderer.render();
    alert("鏆傛湭寮€鏀�")
}

var rte=10;
document.onkeydown=function(event){
    document.getElementById("shower").innerH喵L=`鍧愭爣:${mousePos.x},${mousePos.y}&nbsp;楂樺害:${Math.round(data[mousePos.x][mousePos.y])}&nbsp;<br>鐢荤瑪澶у皬:${rte}&nbsp;鍧″害:${angl}`
    var e = event || window.event || arguments.callee.caller.arguments[0];
    if(e && e.keyCode==87){ // 鎸� W 
        if(mousePos.x!=undefined){
            var rt=rte+5
            for(let i=-rt;i<=rt;i++){
                for(let j=-rt;j<rt;j++){
                    var d=distance(new xy(0,0),new xy(i,j))
                    if(d<=rte){
                        cld(new xy(mousePos.x+i,mousePos.y+j),Math.round(Math.cos(d*Math.PI/rt/2)*10)/30);
                        
                    }
                }
            }
        }
    }
    if(e && e.keyCode==83){ // 鎸� S
        if(mousePos.x!=undefined){
            var rt=rte+5
            for(let i=-rt;i<=rt;i++){
                for(let j=-rt;j<rt;j++){
                    var d=distance(new xy(0,0),new xy(i,j))
                    if(d<=rte){
                        cld(new xy(mousePos.x+i,mousePos.y+j),-Math.round(Math.cos(d*Math.PI/rt/2)*10)/30);
                        
                    }
                }
            }
        }
    }
    if(e && e.keyCode==68){//鎸� D
        renderer.render();
    }
    if(e && e.keyCode==70){//鎸� F
        if(rte>=1)rte--;
    }if(e && e.keyCode==71){//鎸� G
        rte++;
    }
};
document.onkeyup=function(event){
    document.getElementById("shower").innerH喵L=`鍧愭爣:${mousePos.x},${mousePos.y}&nbsp;楂樺害:${data[mousePos.x][mousePos.y]}&nbsp;鐢荤瑪澶у皬:${rte}`
    var e = event || window.event || arguments.callee.caller.arguments[0];
    if(e && e.keyCode==87){ // 鎸� W 
        renderer.render();
    }
    if(e && e.keyCode==83){ // 鎸� S
        renderer.render();
    }
    
};


setInterval(()=>{
    anglx=Math.abs(Math.round(angle(new xy(0,data[mousePos.x][mousePos.y]),new xy(2,data[mousePos.x+2][mousePos.y+2]))*180/Math.PI))
    angly=Math.abs(Math.round(angle(new xy(0,data[mousePos.x][mousePos.y]),new xy(2,data[mousePos.x+2][mousePos.y+2]))*180/Math.PI))
    angl=(anglx+angly)/2
},50)

点赞0


评论

估计我一生也写不出来这样的网页源代码

有加密

你得有数学基础

三角函数,函数图像什么的得自学

我​每​次​数​学​成​绩​>​9​5​,​学​过​J​a​v​a​s​c​r​i​p​t​,​H​T​M​L​,​P​y​t​h​o​n​,​C​+​+​等​等​…​…​,​知​道​什​么​栈​、​函​数​、操作系统……​做过比较简单的网站,用了JavaScript。但你确实很厉害👍

>= >

???大于号打不了???

总结一个字:懒


该账号已停用该账号已停用

center_image

emotion_编程猫_加油emotion_编程猫_厉害了emotion_编程猫_点赞

点赞1


评论


JSR代码喵JSR代码喵

可惜没有box3权限

点赞0


评论


草莓兔子草莓兔子

为啥我没水的?

点赞0


评论

先要清空所有建筑,再加载代码


小树同学穿越未来小树同学穿越未来

我能转载此帖吗

点赞0


评论

很抱歉不能

你又不是伊子

不行

喂,人家叫尹(yin)子不叫伊子

你可以分享此贴,为尹子增加点击量

啊欧

非常抱歉,宁也不是官方呢(笑)


高贵的木叶龙A35d高贵的木叶龙A35d

尹子!为啥有些喵会在水里,导致树木也跑到了水里!!!!!!!

点赞0


评论

哈哈哈

哈哈哈哈

您肯定是帖子没看完整(滑稽)否则你把地形清除的话就没这个问题了

`还是有


ZNS_哪吒ZNS_哪吒

dd

点赞0


评论


战神_小火熊_光影轮回战神_小火熊_光影轮回

顶一下

点赞0


评论

举报你,毁我地图的家伙

???

呵呵,我毁你图了?装×啥?有bing吧?请问宁那只眼睛看见我毁你图了?我从来不毁图,而且我只帮你做过图,没毁过!一天天就会装!老子都退猫了2个月了,你说我毁你图?咋那么会装呢?我都有4个月没去过你的图了,有毛bing?!

别理他,他在找事!


ZNS_哪吒ZNS_哪吒

尹子这空缺是什么造成的?center_image

点赞0


评论

可以修复吗?

https://box3.codemao.cn/e/7b160a379cc091c0eda8

先运行清楚地形程序再生成地形。。。


神岛吉吉喵神岛吉吉喵

emotion_编程猫_紧张

手动支持

点赞3


评论

热乎的吉吉喵!抓!

捕捉

捕捉

热乎的野生吉吉喵!捕捉

大捉!


GZ006GZ006

shcng

点赞0


评论


指令者指令者

希望有打开文件功能,不然不小心关掉就没了

点赞0


评论

https://box3.codemao.cn/e/5d4cb22bffd1eba26fe5


编程猫编程猫

emotion_编程猫_加油

点赞0


评论


天间KeySia天间KeySia

明明支持128×128

点赞0


评论


三尺五寸上仙三尺五寸上仙

顶顶顶【滑稽】

点赞0


评论


哦那咋了哦那咋了

咋就。。。热了呢??

 

点赞1


评论

怎么就不能热了呢?


IaeaIaea

666

点赞0


评论


淳朴的流星猫ofTt淳朴的流星猫ofTt

  

点赞0


评论


QBZ_QBZ_

尹子我提个小建议,可以优化一下gui,最好设置成那种可以直接用鼠标点击的那种,我用了半天愣是没看明白怎么用emotion_doge还有就是可以加一个禁用F12

点赞1


评论


JSR代码喵JSR代码喵

没有水啊

点赞0


评论


Vicent轩Vicent轩

提个建议哈

那个点击新建项目之后

浏览器正上方弹出的输入框,点击了取消就不要继续询问了

点赞1


评论


沉浮于世的微尘沉浮于世的微尘

我为什么弄不了水emotion_编程猫_搓头

点赞0


评论

一样