猫史档案馆


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

用户:YDS尹子YDS尹子查看:576 回复: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


评论

呃呃呃