You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打砖块游戏砖块颜色切换过快,求优化方案(附代码)

打砖块游戏砖块颜色切换优化方案

你当前的砖块颜色切换速度过快,原因是drawBricks函数每帧都会为每个砖块生成新的随机颜色。以下是针对老师提出的两个优化方向的具体实现:

方案一:降低颜色切换速度

通过给每个砖块添加计时器,控制颜色切换的时间间隔,比如每2秒切换一次颜色。

修改后的关键代码:

// 新增全局配置:颜色切换间隔(毫秒)
const colorSwitchInterval = 2000;

// 初始化砖块时添加颜色和计时器属性
const bricks = [];
for(let c=0; c<brickColumnCount; c++) {
  bricks[c] = [];
  for(let r=0; r<brickRowCount; r++) {
    bricks[c][r] = { 
      x: 0, 
      y: 0, 
      status: 1,
      color: randBrick(), // 初始颜色
      lastSwitchTime: Date.now() // 上次切换时间
    };
  }
}

// 修改drawBricks函数
function drawBricks() {
  const now = Date.now();
  for(let c=0; c<brickColumnCount; c++) {
    for(let r=0; r<brickRowCount; r++) {
      const brick = bricks[c][r];
      if(brick.status == 1) {
        // 检查是否到切换时间
        if(now - brick.lastSwitchTime > colorSwitchInterval) {
          brick.color = randBrick();
          brick.lastSwitchTime = now;
        }
        const brickX = (r*(brickWidth+brickPadding))+brickOffsetLeft;
        const brickY = (c*(brickHeight+brickPadding))+brickOffsetTop;
        brick.x = brickX;
        brick.y = brickY;
        ctx.beginPath();
        ctx.rect(brickX, brickY, brickWidth, brickHeight);
        ctx.fillStyle = brick.color; // 使用砖块自身的颜色
        ctx.fill();
        ctx.closePath();
      }
    }
  }
}

调整colorSwitchInterval的值可以改变切换速度,数值越大,切换越慢。


方案二:砖块被击中时切换颜色

只在砖块被球击中时改变其颜色,而不是自动切换。

修改后的关键代码:

// 初始化砖块时添加颜色属性
const bricks = [];
for(let c=0; c<brickColumnCount; c++) {
  bricks[c] = [];
  for(let r=0; r<brickRowCount; r++) {
    bricks[c][r] = { 
      x: 0, 
      y: 0, 
      status: 1,
      color: randBrick() // 初始颜色
    };
  }
}

// 修改碰撞检测函数,击中时切换颜色
function collisionDetection() {
  for(let c=0; c<brickColumnCount; c++) {
    for(let r=0; r<brickRowCount; r++) {
      const b = bricks[c][r];
      if(b.status == 1) {
        if(x > b.x && x < b.x+brickWidth && y > b.y && y < b.y+brickHeight) {
          dy = -dy;
          b.color = randBrick(); // 击中时切换颜色
          // 如果你希望击中后砖块消失,保留b.status=0;如果想让砖块继续存在,注释掉下面这行
          // b.status = 0;
          score++;
          if(score == brickRowCount*brickColumnCount) {
            document.getElementById('gameWin').style.display = 'block';
            clearInterval(interval); 
          }
        }
      }
    }
  }
}

// 修改drawBricks函数
function drawBricks() {
  for(let c=0; c<brickColumnCount; c++) {
    for(let r=0; r<brickRowCount; r++) {
      const brick = bricks[c][r];
      if(brick.status == 1) {
        const brickX = (r*(brickWidth+brickPadding))+brickOffsetLeft;
        const brickY = (c*(brickHeight+brickPadding))+brickOffsetTop;
        brick.x = brickX;
        brick.y = brickY;
        ctx.beginPath();
        ctx.rect(brickX, brickY, brickWidth, brickHeight);
        ctx.fillStyle = brick.color; // 使用砖块自身的颜色
        ctx.fill();
        ctx.closePath();
      }
    }
  }
}

注意:如果希望砖块被击中后不消失,而是只变色,需要注释掉b.status = 0这行代码;如果保持原逻辑(击中后消失),则保留该行,此时颜色切换只会在击中瞬间显示一次。


内容的提问来源于stack exchange,提问作者SINNERS_EMBRACE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:55:09