猫史档案馆


【box3】代码全公开-全新的山地生成代码

用户:YDS尹子YDS尹子查看:7 回复:13 评论:7 创建时间:2021-02-09T11:25:53


------------------------------------------------------------------

(最开始生成出来的地形是土色的,不用怕,因为后面会上色)

只是便于代码去识别地形

服务器的内存可能会炸,不行的话多试几次,再不行可以回复我)

var waterLevel = 10;/*水平面 */
async function summon(times) {/*由于尹子比较懒就直接把曾经做的手绘这种地形的代码改了一下放在了这儿 */
    world.say("放置中...");
    for (let iiii = 0; iiii < times; iiii++) {
        var pos = new Box3Vector3(Math.round(Math.random() * 256), Math.round(Math.random() * 50), Math.round(Math.random() * 256));
        var r = 8;
        var voxel = "board10";
        for (let i = pos.x - r; i <= pos.x + r; i++) {
            for (let j = pos.z - r; j <= pos.z + r; j++) {
                for (let k = pos.y; k <= pos.y + r; k++) {
                    if (new Box3Vector3(i, k, j).distance(pos) <= r && voxels.getVoxel(i, k, j) == 0) {
                        for (let x = k - 1; x >= 0; x--) {
                            if (voxels.getVoxel(i, x, j) != 0) {
                                voxels.setVoxel(i, x + 1, j, voxel);
                                break;
                            }
                        }
                    }
                }
            }
        }
        if (iiii % 10 == 0) await sleep(10);
    }
    world.say("放置中...");

    for (let iiii = 0; iiii < times; iiii++) {
        var pos = new Box3Vector3(Math.round(Math.random() * 256), Math.round(Math.random() * 50), Math.round(Math.random() * 256));
        var r = 15;
        var voxel = "board10";
        for (let i = pos.x - r; i <= pos.x + r; i++) {
            for (let j = pos.z - r; j <= pos.z + r; j++) {
                if (new Box3Vector3(i, pos.y, j).distance(pos) <= r && voxels.getVoxel(i, pos.y, j) == 0) {
                    for (let x = pos.y - 1; x >= 0; x--) {
                        if (voxels.getVoxel(i, x, j) != 0) {
                            voxels.setVoxel(i, x + 1, j, voxel);
                            break;
                        }
                    }
                }

            }
        }
        if (iiii % 10 == 0) await sleep(10);
    }

};
async function noiseDestroy(num) {
    world.say("消噪初始化...");
    for (let kkkk = 0; kkkk < num; kkkk++) {
        var voxelReadyBreak = [];
        var d = [/*四个方向 */
            [1, 0, 0],
            [0, 0, 1],
            [-1, 0, 0],
            [0, 0, -1]
        ];
        for (let i = 0; i < 257; i++) {
            for (let j = 0; j < 257; j++) {
                for (let k = 0; k < 60; k++) {
                    if (voxels.getVoxel(i, k, j) == 0) {/*找出空气方块周围有>=3块都是实体方块并填充 */
                        var cnt = 0;
                        for (let s = 0; s < d.length; s++) {
                            if ([127, 125].includes(voxels.getVoxel(i + d[s][0], k + d[s][1], j + d[s][2]))) {
                                cnt++;
                            }
                        }
                        if (cnt >= 3) {
                            if (k < waterLevel) {
                                voxelReadyBreak.push([i, k, j, "dirt"]);
                            } else if (k == waterLevel) {
                                voxelReadyBreak.push([i, k, j, "sand"]);
                            } else {
                                voxelReadyBreak.push([i, k, j, "grass"]);
                            }
                        }
                    } else if ([127, 125].includes(voxels.getVoxel(i, k, j))) {/*找出实体方块周围有>=3块都是液体或者空气的并清除 */
                        var cnt = 0;
                        for (let s = 0; s < d.length; s++) {
                            if ([0, 3喵].includes(voxels.getVoxel(i + d[s][0], k + d[s][1], j + d[s][2]))) {
                                cnt++;
                            }
                        }
                        var voxel = 0;
                        if (k < waterLevel) voxel = 3喵;
                        if (k == waterLevel) voxel = 135;
                        if (cnt >= 3) voxelReadyBreak.push([i, k, j, voxel]);
                    }
                }
            }
        }
        for (let i = 0; i < voxelReadyBreak.length; i++) {/*最后一起放置,以避免误差 */
            voxels.setVoxel(voxelReadyBreak[i][0], voxelReadyBreak[i][1], voxelReadyBreak[i][2], voxelReadyBreak[i][3])
        }
        world.say("消噪中...进度" + kkkk + "/"+num);
        await sleep(100);
    }
    world.say("地形正常化...");/*把消噪的时候出问题的方块还原 */
    for (let i = 0; i < 257; i++) { for (let j = 0; j < 257; j++)for (let k = 0; k <= waterLevel; k++) { if (voxels.getVoxel(i, k, j) == 0) { voxels.setVoxel(i, k, j, "water") } } }
    for (let i = 0; i < 257; i++) { for (let j = 0; j < 257; j++)for (let k = 0; k < 60; k++) { if (voxels.getVoxel(i, k, j) == voxels.id("dirt") && voxels.getVoxel(i, k + 1, j) == 0) { voxels.setVoxel(i, k, j, "grass") } } };
    for (let i = 0; i < 257; i++) { for (let j = 0; j < 257; j++)for (let k = 0; k < 60; k++) { if (voxels.getVoxel(i, k, j) == voxels.id("grass") && voxels.getVoxel(i, k + 1, j) != 0) { voxels.setVoxel(i, k, j, "dirt") } } }
    world.say("完毕");
};
async function color(){
    for (let i = 0; i < 257; i++) {
        for (let j = 0; j < 257; j++) {
            for (let k = 0; k < 60; k++) {
                if (voxels.getVoxel(i, k, j) == 453) {
                    if (voxels.getVoxel(i, k + 1, j) == 0) {
                        if (k > waterLevel) {
                            voxels.setVoxel(i, k, j, "grass");
                            continue;
                        } else if (k == waterLevel) {
                            voxels.setVoxel(i, k, j, "sand");
                            continue;
                        } else {
                            voxels.setVoxel(i, k, j, "dirt");
                        }
                    } else {
                        voxels.setVoxel(i, k, j, "dirt");
                        continue;
                    }
                }
            }
        }
        await sleep(10);
    }
};
(async function () {
    /*生成一堆球 */
    await summon(700);
    /*生成一堆圆柱 */

    world.say("上色中...");
    await color();
    await sleep(100);

    await noiseDestroy(7);/*消除噪点 */

    
})();

center_image


回复

上一页1 页 / 共 1下一页
­­­­­­­­­­­­­­

沙发

点赞0


评论


YLG_战神_皮卡YLG_战神_皮卡

板凳

点赞0


评论


哦那咋了哦那咋了

az

 

点赞0


评论


YLG_战神_皮卡YLG_战神_皮卡

center_image

点赞0


评论


IaeaIaea

666

点赞0


评论


我的内存炸了。。。

点赞0


评论


星辰雨伞星辰雨伞

好................................................................................

点赞0


评论


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

点赞0


评论


MrAssMrAss

尹子能不能来我的地图? https://box3.codemao.cn/e/238f455444d9bc08af74?p=iyqdecC26ovcKrx6JMvvlBIg1c75RIvE5CuvJ09UrOA62exHC7LwVndWVzdA%3D%3D

点赞0


评论


霜雾霜雾

ttt

点赞0


评论


Forzen_SevenForzen_Seven

还是喜欢这个,比较陡峭

点赞0


评论


幽梦子曦幽梦子曦

尹子,可以做个有关岛屿的地形种子吗

点赞0


评论


MrAssMrAss

要顶

必须顶

不得不顶

用尽全力顶

再加上千斤顶

总之把它顶到顶

接着使出葵花宝顶

就算顶到史前也要顶

老子看了会用道德经顶

孔子亲自拜你为师天天顶

秦始皇站在阿房宫上使劲顶

汉高祖挥师杀向东罗马为你顶

吕布抛弃了貂禅而选择了帮你顶

汉高祖挥师杀向东罗马为你顶

秦始皇站在阿房宫上使劲顶

孔子亲自拜你为师天天顶

老子看了会用道德经顶

就算顶到史前也要顶

接着使出葵花宝顶

总之把它顶到顶

再加上千斤顶

用尽全力顶

不得不顶

必须顶

要顶

点赞1


评论