【发布时间】:2014-02-22 02:36:25
【问题描述】:
我正在实现俄罗斯方块来自学 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 掉落(blockArr 中有 2 个,目前有 1 个掉落)。然而,我看到的唯一一个是当前正在下降的那个 (curBlock),并且检查参数 curBlock.getY()、blockArr[1].getY() 和 blockArr[2].getY() 都返回相同的值。换句话说,它们都被绘制在同一个位置。
我怎样才能改变它,使旧块,无论是什么类,都留在屏幕底部,而新创建的块从顶部落下,而不导致该类的所有其他块随之移动?
谢谢!
【问题讨论】:
标签: javascript object methods constructor instance