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

HTML Canvas绘制方块异常:仅能显示单个填充方块问题排查

排查Canvas填充方块仅显示一个的问题

嘿,我来帮你揪出这个问题的根源!虽然你只贴了部分代码,但根据你描述的现象——空心方块能正常显示多个,填充方块却每次只显示一个,而且你说二者逻辑一致,那大概率是填充方块的数组操作或者绘制状态有隐形的差异,我给你列几个最可能的排查方向:

1. 数组操作是不是不小心覆盖了?

这是最常见的坑!你说逻辑一致,但很可能在添加填充方块时,不是往数组里push新元素,而是直接把数组重置成了只有一个新方块。比如:

  • 错误写法(每次覆盖数组,只能保留最后一个):
// 填充方块数组操作
filledBlocks = [new FilledBlock(x, y, size)];
  • 正确写法(往数组里追加元素,保留所有方块):
filledBlocks.push(new FilledBlock(x, y, size));

你去对比下空心方块和填充方块的数组添加逻辑,肯定能发现差异!

2. 动画循环的绘制逻辑有没有疏漏?

检查你的动画循环顺序,是不是先清屏,再遍历两个数组绘制所有方块?比如正确的流程应该是:

function animate() {
  // 1. 先清屏,避免上一帧的内容残留
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  
  // 2. 遍历绘制所有空心方块
  hollowBlocks.forEach(block => block.draw());
  
  // 3. 遍历绘制所有填充方块
  filledBlocks.forEach(block => block.draw());
  
  requestAnimationFrame(animate);
}

如果填充方块的绘制逻辑里,不小心把某个方块的坐标/尺寸设置成了全局变量,导致所有填充方块都叠加在同一个位置,看起来就像只显示了一个。

3. 快速验证方法

在动画循环里打印两个数组的长度,先确认数据层面有没有问题:

console.log("空心方块数量:", hollowBlocks.length);
console.log("填充方块数量:", filledBlocks.length);

如果填充方块的长度一直是1,那肯定是数组添加逻辑错了;如果长度正常,再检查每个填充方块的draw方法,看fillRect的参数(x、y、宽高)是不是被错误覆盖了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:31:54