i will try to add only relevant code but just in case its needed full page is here, and feel free to check it out on github as well.
i am building a tetris game using canvas/javascript and part of it
//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
is a 20*10 array
, fallingPiecePos
is a array of objects with numerical x
and y
values, i.e. [{y:0,x:4},{y:0,x:5},{y:0,x:6},{y:0,x:7}]
(line piece) or [{y:0,x:4},{y:0,x:5},{y:1,x:4},{y:1,x:5}]
(square) that are rendered into board
with the following code:
for ( i = 0; i < 4; i++ ) {
board[ fallingPiecePos[i].y ][ fallingPiecePos[i].x ] = fallingPiece;
}
fallingPiece
is a randomly assigned number (1-7) used by canvas
to render the piece as the right color.
hope thats clear enough, now the problem is that whenever fallingPiece
has a value it has had before i get
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;
is the last line of above code-block)
i have a function nothingIsBelow()
which checks if the piece has reached the bottom, so i am pretty stumped as to why this is happening.
edit
i wasnt clear enough on this point before it works fine the first 3-4 pieces (aside for piece collision protection) and only gives me above error when fallingPiece
has a previously held value
edit
it seems that the issue is like this i have a array 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}]
];
and i have a line of code assigning a shape to a new piece
fallingPiecePos = shapes[fallingPiece - 1];
it seems that when i later refer to fallingPiecePos
and change the value (fallingPiecePos[i].y++;
), it changes the value in shapes
as well
in simple terms the following code
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]);
will give me 1
because not only foo
but also myArray
was updated, so how can i make a variable which holds a new array (foo
) holding the values of myArray[0]
and can be updated without updating myArray[0]
.