在Javascript / HTML5-canvas游戏中工作,我试图通过设置一个等于原始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行左右
答案 0 :(得分:0)
所以,你实际上并没有将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;
}