为什么我的洪水填充只填充在正 x 和 z 方向?
Why is my flood fill only filling in the positive x and z direction?
下面是来自海关 NPC mod 界面的 JavaScript,它与 minecraft 一起运行。它被假设为 运行 洪水填充例程。它只正确填充到起始位置的正 x 和正 z。在我的世界中,x 和 z 在水平面上,y 是垂直轴。
var node1 = {
xy: []
};
var blockp;
//starting block type and position
blockp = world.getBlock(npc.getBlockX(), npc.getBlockY() - 1, npc.getBlockZ() + 1);
node1.xy[0] = npc.getBlockX();
node1.xy[1] = npc.getBlockZ() + 1;
node1.xy[2] = npc.getBlockY() - 1;
//
var floodfill = function(nameb, node) {
if (nameb == "minecraft:stone" ||
nameb == null) {
return;
}
var blkname;
//
world.setBlock(node.xy[0], node.xy[2], node.xy[1], world.createItem("minecraft:stone", 0, 1));
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] + 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] - 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0] + 1;
node.xy[1] = node.xy[1];
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0] - 1;
node.xy[1] = node.xy[1];
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
return;
}
floodfill(blockp.name, node1);
基本上,看起来您正在递减,但实际上您只是重置为默认值。看看这里的这个片段:
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] + 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] - 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
乍一看,您似乎在从原始位置移动 +1,然后移动 -1。但是,由于您正在修改对 node.xy[1]
的引用,您实际上是将其设置为 +1 然后是 +0。
相反,您可能会考虑这样的事情:
var xy0 = node.xy[0];
var xy1 = node.xy[1];
var xy2 = node.xy[2];
...
node.xy[0] = xy0 + 1;
...
node.xy[0] = xy0 - 1;
这样您就不会修改原始引用。
下面是来自海关 NPC mod 界面的 JavaScript,它与 minecraft 一起运行。它被假设为 运行 洪水填充例程。它只正确填充到起始位置的正 x 和正 z。在我的世界中,x 和 z 在水平面上,y 是垂直轴。
var node1 = {
xy: []
};
var blockp;
//starting block type and position
blockp = world.getBlock(npc.getBlockX(), npc.getBlockY() - 1, npc.getBlockZ() + 1);
node1.xy[0] = npc.getBlockX();
node1.xy[1] = npc.getBlockZ() + 1;
node1.xy[2] = npc.getBlockY() - 1;
//
var floodfill = function(nameb, node) {
if (nameb == "minecraft:stone" ||
nameb == null) {
return;
}
var blkname;
//
world.setBlock(node.xy[0], node.xy[2], node.xy[1], world.createItem("minecraft:stone", 0, 1));
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] + 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] - 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0] + 1;
node.xy[1] = node.xy[1];
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0] - 1;
node.xy[1] = node.xy[1];
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
return;
}
floodfill(blockp.name, node1);
基本上,看起来您正在递减,但实际上您只是重置为默认值。看看这里的这个片段:
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] + 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] - 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
乍一看,您似乎在从原始位置移动 +1,然后移动 -1。但是,由于您正在修改对 node.xy[1]
的引用,您实际上是将其设置为 +1 然后是 +0。
相反,您可能会考虑这样的事情:
var xy0 = node.xy[0];
var xy1 = node.xy[1];
var xy2 = node.xy[2];
...
node.xy[0] = xy0 + 1;
...
node.xy[0] = xy0 - 1;
这样您就不会修改原始引用。