我正在尝试像perlin噪音地图这样的东西,但我的阵列不会重复!结果,数组值超过预期值(> 2)。
数组" 地图"仅由1和0组成。
制作地图的副本(称为缓存)和数组中的值" 缓存"被添加到数组" 地图"。
缓存的某些值会多次添加到地图。
问题是对" 地图"所做的任何更改出现要复制在" 缓存",非常令人沮丧。我对javascript不太熟悉,不知道我做错了什么。
依赖代码:
var map = terrainSeed(); //returns an array of 1's & 0's (random)
map = terrainGen(map, map, 2, 2);
function terrainGen(mapNew, mapOld, x, y)
{
var cache = mapOld.slice(0);
var asdf = 0;
//if(x >=2) if(y >=2)
for(var i = 0; i < cache.length; i++)
{
for(var j = 0; j < cache[i].length; j++)
{
var save = mapNew[i][j];
asdf = cache[(Math.floor(i/x))][(Math.floor(j/y))];
mapNew[i][j] += asdf;
if(mapNew[i][j]>2) alert(save + " + " + asdf + " = " + mapNew[i][j] + " (" + i + ", " + j + ")");
}
}
return mapNew;
}
答案 0 :(得分:1)
当slice
正在进行浅层复制时,您需要的是深层复制。所以要么使用像JQuery,Lo-Dash这样的第三方库,要么自己实现它。
使用JQuery
var cache = $.extend(true, [], mapOld);
使用Lo-Dash
var cache = _.cloneDeep(mapOld);
答案 1 :(得分:0)
作为elaijuh答案的替代方法,使用纯JavaScript,您需要循环遍历mapOld数组值以创建新数组......以下是它的表达方式:
var cache = new Array;
for (var i=0;i<mapOld.length;i++) {
cache[i] = mapOld[i];
}
你只是从mapOld
中提取值并将它们放入cache
...这可能就是图书馆实现它的方式,在函数中接受......这就是你如何制作功能:
clone = function(input){
if (input instanceof Array) {
var output = new Array;
for (var i=0;i<input.length;i++) {
output[i] = input[i];
}
return output;
}
}
// Then using...
cache = clone(mapOld);
以下是JSFiddle
的示例