Я работаю над реализацией тетриса, чтобы научиться javascript, и столкнулся с проблемой. Во-первых, предыстория: у меня есть класс для каждого типа блока тетриса, который наследуется от базового шаблона блока с такими методами, как перемещение и возврат координат. Например,
function BlockTemplate(w, h, c){
var height = h;
var width = w;
var x = 0;
var y = 0;
var color = c;
this.getHeight = function(){return height;};
this.getWidth = function(){return width;};
this.getX = function(){return x;};
this.getY = function(){return y;};
this.getColor = function(){return color;};
this.moveTo = function(newX, newY){
x = newX;
y = newY;
};
this.translate = function(dx, dy){
x += dx;
y += dy;
};
}
function StraightBlock(){
this.draw = function(){
ctx.fillStyle = this.getColor();
ctx.fillRect(this.getX(), this.getY(), 20, 100);
};
}
StraightBlock.prototype = new BlockTemplate(20, 100, "#00FFE5");
Все блоки, находящиеся в данный момент на экране, хранятся в массиве blockArr
, за исключением текущего падающего блока, который хранится в массиве curBlock
.
Я использую функцию createRandomBlock()
, чтобы создать блок и поместить его в curBlock:
var blockTypeArr = [LBlock, SquareBlock, StraightBlock, SquigBlock];
var createRandomBlock = function(){
var block = blockTypeArr[Math.floor(Math.random()*blockTypeArr.length)];
var randomBlock = new block();
return randomBlock;
};
curBlock = createRandomBlock();
Как только он упал, я помещаю его в массив и создаю новый блок:
blockArr[blockArr.length] = curBlock;
curBlock = createRandomBlock();
Если вновь созданный блок еще не был на экране, то нет проблем. Однако использование методов moveTo
и translate
нового экземпляра влияет на все экземпляры этого класса (я добавил свойство id, чтобы убедиться, что они действительно разные экземпляры).
Например, используя консоль JavaScript,
>curBlock
SquigBlock
>blockArr
[SquareBlock, SquigBlock, SquigBlock]
Как вы можете видеть, 3 SquigBlock упали до сих пор (2 в blockArr
, 1 в настоящее время падает). Тем не менее, единственный, который я вижу, это тот, который в настоящее время падает (curBlock
), и проверка параметров curBlock.getY()
, blockArr[1].getY()
и blockArr[2].getY()
возвращает одно и то же значение. Другими словами, все они рисуются в одном и том же месте.
Как я могу изменить его так, чтобы старые блоки, независимо от класса, оставались внизу экрана, а вновь созданный блок падал сверху, не заставляя все остальные блоки этого класса двигаться вместе с ним?
Спасибо!