【问题标题】:Check Array for Changes检查数组的变化
【发布时间】:2015-08-18 20:23:46
【问题描述】:

在开发 Javascript/HTML5 画布游戏时,我试图通过在函数开头设置数组 waterTilesCheck 等于原始 waterTiles 数组来使函数在水填满区域后停止,然后在最后比较它们。如果对原始水阵列进行了更改,我希望该函数再次运行,但是如果在运行该函数结束时没有任何更改,我希望它通过说waterComplete = true 停止运行。 waterTiles数组中的每个对象都有x、y、width、height和tag属性,但是tag属性是唯一需要比较的。

function fillWater (modifier) {
    waterTilesCheck = waterTiles;
    for (var i = 0; i < waterTiles.length; i++) {
        //get tiles to the left, right, above and below of i
        var l = i - (worldDim.height + 1);
        var r = i + (worldDim.height + 1);
        var u = i + 1;
        var d = i - 1;
        //just a sample of some of the logic used to move water
        if (tiles[i].tag != "none"
            && u < tiles.length
            && waterTiles[i].tag == "water"
            && waterTiles[u].y >= worldDim.top * X * 2) {
            waterTiles[u].tag = "water";
            waterTiles[i].tag = "none";
        }
    };
    for (var i = 0; i < waterTiles.length; i++) {
        if (waterTiles[i].tag == "water") {
            worldWaterCount++;
        } else {
            waterTiles[i].tag = "none";
        }
    };
    waterCheck();
    console.log(waterComplete);
};

waterCheck 是我尝试比较数组的函数:

function waterCheck () {
    for (var i = 0; i < waterTiles.length; i++) {
        var check = Object.is(waterTiles[i].tag, waterTilesCheck[i].tag);
        if (!check) {
            waterComplete = false;
            return;
        }
    };
    waterComplete = true;
    return;
};

Object.is 似乎是一个漂亮的技巧,但没有奏效,只是比较 waterTiles[i].tag == waterTilesCheck[i].tag 似乎也没有奏效,这让我感到困惑。所以现在我被困住并愿意接受建议......

完整代码:https://gist.github.com/TuckerFlynn/3d73d0d6d8e636743ff9

在浏览器中运行看看是什么游戏,水功能在 500 行左右

【问题讨论】:

  • 什么是标签属性?字符串、数组、对象等
  • 它是一个字符串,“water”或“none”

标签: javascript arrays object html5-canvas compare


【解决方案1】:

因此,您实际上并未将 waterTilesCheck 设置为 waterTiles 的快照。您将其设置为指向同一个数组。因此,您对 waterTiles 所做的任何更改也会影响 waterTilesCheck。 (如果您只是一个一个地复制元素,您将在对象级别遇到同样的问题——您需要在不可变元素(字符串、整数等)级别进行复制)。试试这个:

var originalTags = [];
for (var i = 0; i < waterTiles.length; i++) {
  originalTags.push(waterTiles[i].tag);
  ...
}
waterCheck(originalTags);

在水中检查:

function waterCheck(originalTags) {
  for (var i = 0; i < waterTiles.length; i++)
    if (waterTiles[i].tag !== originalTags[i]) {
      waterComplete = false;
      return;
    }
  waterComplete = true;
  return;
}

【讨论】:

  • 工作得很好,我没有意识到以这种方式设置数组会随着原来的改变而改变!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多