我将这个数组传递给一个函数,该函数应该将数组旋转90度并返回结果。然后,我想检查新数组是否与画布上的其他事物发生碰撞。
let newArray = [
[0,0,1],
[1,1,1],
[0,0,0]
];
let test = rotate(newArray);
if ( collision(test) ){
draw(newArray);
} else {
draw(test);
}
这是问题所在。我认为Rotate()会更改newArray变量,因此,如果if语句的计算结果无关紧要,则draw()函数将始终执行相同的操作。
在检查旋转后的矩阵是否与其他东西碰撞后,我想选择要绘制的数组。
function rotate(matrix) {
matrix = matrix.reverse();
for (var i = 0; i < matrix.length; i++) {
for (var j = 0; j < i; j++) {
var temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
return matrix
}
function collision(mat){
let collision = false;
for ( let i = 0; i < mat.length; i++){
for ( let j = 0; j < mat.length; j++){
if (mat[i][j] == 1){
let test = ctx.getImageData(x + 10*j +10, y + 10*i, 1, 1);
if (test.data != "255,255,255,255" && test.data != "0,0,0,0"){
collision = true;
}
}
}
}
return collision;
}
答案 0 :(得分:0)
所以您是正确的-旋转函数中使用的Array.reverse()
方法不会返回新数组,而是会修改相同的数组(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse);
我建议更改rotate函数,以先克隆传递给它的数组,然后再执行Array.reverse()
等。
您可以使用let newMatrix = JSON.parse(JSON.stringify(matrix));
克隆到示例中传递给旋转函数的简单数组,然后在newMatrix
上执行其余操作,然后将其返回。
如果您不喜欢这种方法,您还可以创建一个新的空数组,并使用double for循环(当您使用2D网格时,在一个循环内循环)用原始数组中的值填充新数组