JavaScript 当 totalbrick == 0 时重绘砖块
JavaScript Redraw bricks when totalbrick == 0
我是 Whosebug 和 JS 的新手。
我的编码 class 有一个任务,我选择用 JS 创建游戏。目前,我仅使用 JS 创建了一个简单的突围游戏。
我现在的问题是,我希望游戏是无休止的,所以当球与所有砖块相撞时,砖块将重新绘制,但分数将保持不变。我试着做点什么,其中之一是:
function redrawBricks(){
if(brickColumnCount * brickRowCount < 1){
for(var c=0; c<brickColumnCount; c++){
for(var r=0; r<brickRowCount; r++){
if(bricks[c][r].status == 1){
var brickX = (c*(brickWidth+brickPadding)+brickOffsetleft);
var brickY = (r*(brickHight+brickPadding)+brickOffsetTop);
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHight);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath;
}
}
}
}
}
第一个 if 语句后的测试与原始 drawBricks 相同。然后我获取了那个函数并将它放在我调用函数的地方。
我根本无法让它工作。但我的想法是用 if 语句创建一个新函数,所以如果 brickColumn * brickRow < 1 然后画这个(砖块)
如果你需要看代码,你可以看here但是注意我的语言是丹麦语,所以评论你可能看不懂xD而且我还没有把它写清楚,所以它可能不符合标准
查看 link 中的代码,我可以看到您将与砖块碰撞时的状态设置为 0。这意味着它没有被渲染。
在此代码设计中,解决方案可能是检查所有 brick.status 何时为 0,然后将它们设置回 1。
function loop2DArray(arr, rows, cols, cb){
for(let c = 0; c < cols; c++){
for(let r = 0; r < rows; r++){
cb(arr[c][r])
}
}
}
function redrawBricks(){
let bricksRemaining = 0;
loop2DArray(bricks, brickRowCount, brickColumnCount, brick => {
if(brick.status == 1){
bricksRemaining ++;
var brickX = (c*(brickWidth+brickPadding)+brickOffsetleft);
var brickY = (r*(brickHight+brickPadding)+brickOffsetTop);
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHight);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath;
}
});
// if all bricks gone, recreate all of them
if(bricksRemaining === 0){
loop2DArray(bricks, brickRowCount, brickColumnCount, brick => {
brick.status = 1;
});
}
}
但是,您会注意到许多循环,其中有许多未使用的迭代。这是低效且令人困惑的代码。更好的解决方案是将积木存储在更易于迭代的更合理的数据结构中。
例如,您可以将它们存储在平面数组中,并存储它们的 x、y 坐标,而不是从行/列索引生成它们。你将有一个函数来生成这个扁平的砖块阵列。然后你的碰撞函数将用于从数组中移除砖块,这样当循环数组时,它不需要条件并且迭代次数越少,砖块越少。最后,要检查所有的砖块是否都消失了,只需检查砖块数组的长度,现在你可以调用生成平面数组中所有砖块的初始函数。
祝你好运。
我是 Whosebug 和 JS 的新手。 我的编码 class 有一个任务,我选择用 JS 创建游戏。目前,我仅使用 JS 创建了一个简单的突围游戏。 我现在的问题是,我希望游戏是无休止的,所以当球与所有砖块相撞时,砖块将重新绘制,但分数将保持不变。我试着做点什么,其中之一是:
function redrawBricks(){
if(brickColumnCount * brickRowCount < 1){
for(var c=0; c<brickColumnCount; c++){
for(var r=0; r<brickRowCount; r++){
if(bricks[c][r].status == 1){
var brickX = (c*(brickWidth+brickPadding)+brickOffsetleft);
var brickY = (r*(brickHight+brickPadding)+brickOffsetTop);
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHight);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath;
}
}
}
}
}
第一个 if 语句后的测试与原始 drawBricks 相同。然后我获取了那个函数并将它放在我调用函数的地方。
我根本无法让它工作。但我的想法是用 if 语句创建一个新函数,所以如果 brickColumn * brickRow < 1 然后画这个(砖块)
如果你需要看代码,你可以看here但是注意我的语言是丹麦语,所以评论你可能看不懂xD而且我还没有把它写清楚,所以它可能不符合标准
查看 link 中的代码,我可以看到您将与砖块碰撞时的状态设置为 0。这意味着它没有被渲染。 在此代码设计中,解决方案可能是检查所有 brick.status 何时为 0,然后将它们设置回 1。
function loop2DArray(arr, rows, cols, cb){
for(let c = 0; c < cols; c++){
for(let r = 0; r < rows; r++){
cb(arr[c][r])
}
}
}
function redrawBricks(){
let bricksRemaining = 0;
loop2DArray(bricks, brickRowCount, brickColumnCount, brick => {
if(brick.status == 1){
bricksRemaining ++;
var brickX = (c*(brickWidth+brickPadding)+brickOffsetleft);
var brickY = (r*(brickHight+brickPadding)+brickOffsetTop);
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHight);
ctx.fillStyle = "red";
ctx.fill();
ctx.closePath;
}
});
// if all bricks gone, recreate all of them
if(bricksRemaining === 0){
loop2DArray(bricks, brickRowCount, brickColumnCount, brick => {
brick.status = 1;
});
}
}
但是,您会注意到许多循环,其中有许多未使用的迭代。这是低效且令人困惑的代码。更好的解决方案是将积木存储在更易于迭代的更合理的数据结构中。
例如,您可以将它们存储在平面数组中,并存储它们的 x、y 坐标,而不是从行/列索引生成它们。你将有一个函数来生成这个扁平的砖块阵列。然后你的碰撞函数将用于从数组中移除砖块,这样当循环数组时,它不需要条件并且迭代次数越少,砖块越少。最后,要检查所有的砖块是否都消失了,只需检查砖块数组的长度,现在你可以调用生成平面数组中所有砖块的初始函数。
祝你好运。