我将尝试仅添加相关代码,但以防万一其所需的整页为here,也可以随时在github上进行查看。
我正在使用canvas / javascript和一部分构建俄罗斯方块游戏
//drop the falling piece by one space
function dropByOne(){
//loop through the four squares that make up the piece
for ( i = 3; i > -1; i-- ) {
//empty old spot of piece
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = 0;
//drop position place-holder by one row
fallingPiecePos[i].y++;
//add square to new spot
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}
board
是20 * 10 array
,fallingPiecePos
是具有数字x
和y
值的对象的数组,即[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:0,x:7}]
(线段)或[{y:0,x:4},{y:0,x:5},{y:1,x:4},{y:1,x:5}]
(正方形),并渲染为board
,包含以下代码:for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
fallingPiece
是一个随机分配的数字(1-7),由canvas
使用该数字将作品呈现为正确的颜色。希望这很清楚,现在的问题是,每当
fallingPiece
具有它在我得到之前所拥有的值TypeError: board[fallingPiecePos[i].y] is undefined
[Break On This Error]
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
(
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
是以上代码块的最后一行)我有一个function
nothingIsBelow()
,它检查棋子是否到达底部,所以我很困惑为什么会发生这种情况。编辑
我在这一点上还不够清楚,然后才可以对前3-4个块进行正常工作(除了用于块碰撞保护),并且仅当
fallingPiece
具有先前保持的值时才给我上述错误编辑
看来问题是这样的,我有一个数组
shapes
var shapes = [
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:0,x:7}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:4}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:5}],
[{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:1,x:6}],
[{y:0,x:4},{y:0,x:5},{y:1,x:4},{y:1,x:5}],
[{y:0,x:4},{y:0,x:5},{y:1,x:3},{y:1,x:4}],
[{y:0,x:4},{y:0,x:5},{y:1,x:5},{y:1,x:6}]
];
我有一行代码将形状分配给新的一块
fallingPiecePos = shapes[fallingPiece - 1];
看来当我以后引用
fallingPiecePos
并更改值(fallingPiecePos[i].y++;
)时,它也更改了shapes
中的值简单来说,以下代码
var myArray = [
[{a:0,b:1},{a:1,b:1}],
[{a:0,b:0},{a:1,b:0}]
];
var foo = myArray[0];
foo[0].a++;
console.log(myArray[0][0][a]);
会给我
1
,因为不仅更新了foo
,而且还更新了myArray
,所以我如何制作一个变量,该变量保存一个包含foo
值的新数组(myArray[0]
),并且可以不更新而进行更新myArray[0]
。 最佳答案
您正在修改shapes
数组。当特定的一块掉落并更新其位置时,实际上是更新该数组,而不是仅仅更新fallingPiecePos
。这意味着,当片段n
第一次下降时,它会在行board[19]
处停止,但是当再次选择它时,它会以board[20]
结束,而该不存在。
您可以通过在运行游戏时检查shapes数组的内容来检查此问题-请注意位置会发生变化。要解决此问题,您需要避免为每块修改形状数组或每次选择一块时重置数组值。
例:
function writePiece() {
var copy = JSON.parse(JSON.stringify(shapes));
fallingPiecePos = copy[fallingPiece - 1];
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
}