我将尝试仅添加相关代码,但以防万一需要整页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
是canvas
用于将作品呈现为正确颜色的随机分配的数字(1-7)。
希望这一点足够清楚,现在的问题是每当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
已更新,因此如何制作包含 new 数组的变量({ {1}})保留foo
的值,可以在不更新myArray[0]
的情况下进行更新。
答案 0 :(得分:3)
“ board [fallingPiecePos [i] .y]未定义”,表示fallingPiecePos[i].y
在该时间点的任何值,超出范围< / {> board
数组。
我快速看了一下,它似乎总是在第四个tetromino片上抛出错误,因为它试图在board
上的(x,20)位置绘制它(fallingPiecePos[i].y
此时为20 ),当board
只能绘制到第19行时,请记住索引从0开始而不是1。
我建议你修复你的nothingIsBelow
功能,检查tetromino是否已经“安顿”在另一个tetromino或游戏屏幕的下边缘。在将当前的tetromino放到位之前。
答案 1 :(得分:3)
您正在修改shapes
数组。当一个特定的部分落下并且你更新它的位置时,你实际上更新了该数组而不仅仅是fallingPiecePos
。这意味着,当第一次n
下降时,它会在第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;
}
}
答案 2 :(得分:0)
将您的写作函数修改为如下所示:
查看小提琴: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;
}
}
那应该解决它。