1

我将尝试仅添加相关代码,但以防万一需要的完整页面在这里,并随时在github上查看。

我正在使用画布/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 arrayfallingPiecePos是具有数值xy值的对象数组,即[{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;是上面代码块的最后一行)

我有一个功能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]

4

3 回答 3

3

board[fallingPiecePos[i].y] is undefined ”,意思是那个时间点的任何值fallingPiecePos[i].y,它都超出了数组board的范围。

我快速浏览了一下,它似乎总是在第 4 块 tetromino 块上抛出错误,因为它试图在 (x, 20) 位置上绘制它(board当时fallingPiecePos[i].y是 20),当board只能绘制到第 19 行时,请记住索引从 0 而不是 1 开始。

我建议您修复您的nothingIsBelow功能,以检查 tetromino 是否“稳定”在另一个 tetromino 顶部或游戏屏幕的底部边缘。在将当前的 tetromino 放置到位之前。

于 2013-11-13T20:46:19.403 回答
3

您正在修改您的shapes阵列。当一个特定的部分掉下来并且你更新它的位置时,你实际上更新了那个数组,而不是仅仅更新它fallingPiecePos。这意味着当n第一次下落时,它会停在 row board[19],但是当它再次被选中时,它会在 中结束board[20],这并不存在。

您可以在运行游戏时通过检查形状数组的内容来检查这一点 - 请注意位置会发生变化。要解决此问题,您需要避免修改每件的形状数组或在每次选择一块时重置数组值。

例子:

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; 
    } 
}
于 2013-11-13T21:00:54.693 回答
0

修改您的 write piece 函数,如下所示:

查看小提琴:http: //jsfiddle.net/RJe86/11/——没有错误

function writePiece(){
    var shapeCopy = JSON.parse(JSON.stringify(shapes));
    fallingPiecePos = shapeCopy[fallingPiece - 1];
    for ( i = 0; i < 4; i++ ) {
        board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
    }
}

那应该解决它。

于 2013-11-13T20:54:51.410 回答