0

我在使用 javascript 时遇到了困难,我试图创建一个函数来在游戏中生成地图,如下所示。基本模式是 [9, 3, 4, 4, 4, 4, 4, 4, 5, 9] 作为平铺图像帧。

我想把 4 个瓦片中的一些改成 12 个瓦片,但是结果,所有 4 个瓦片都变成了 12 个瓦片,

这是代码:

function addMap(stage) 
{
  var map   = new Map(32, 32);
  map.image = game.assets['img/terrain.png'];

  var mapArray    = [9, 3, 4, 4, 4,  4, 4, 4, 5, 9]; // per 50m
  var selectedMap = [];

  for (var i = 0; i < (2 + (stage - 1)) * 10; i++) {
    selectedMap.push(mapArray); 
  }

  for(var row = 0; row < selectedMap.length; row++) {
    for(var col = 0; col < selectedMap[row].length; col++) {
      if (selectedMap[row][col] === 4) {
        var probability = rand(100);

        if (probability < 15) {
          selectedMap[row][col]  = 12;
        }
      }
    }
  }

  map.loadData(selectedMap);

  return map;
}

注意:假设阶段是 = 1

你能看出这个阵列系统有什么问题吗?非常感谢你

4

1 回答 1

3

您已将对完全相同的一组列的引用推送到每一行。因此,当您更改数组的一个副本时,所有其他引用也会看到更改。mapArray在将其推入selectedMap阵列之前,您需要对其进行复制。

for (var i = 0; i < (2 + (stage - 1)) * 10; i++) {
    selectedMap.push(mapArray.slice(0)); 
}

.slice(0)将制作一个副本,因此每一行都有一个单独的、独立的数组副本,您可以单独修改每个副本。

Javascript 中的对象(数组是对象)在 Javascript 中通过引用(而不是通过副本)分配。所以,当你这样做时,selectedMap.push(mapArray);你只是将一个指针mapArray放入selectedMap,并且所有元素都selectedMap指向mapArray. 所以,如果你换了一个,它们都变了。

于 2014-11-20T01:41:34.483 回答