【问题标题】:HTML5 canvas clearing and redrawing with for loop使用 for 循环清除和重绘 HTML5 画布
【发布时间】:2013-05-13 05:33:22
【问题描述】:

我在玩 JS,发现了一个小的 HTML5 游戏教程,我认为修改它会很酷。 (这是结果:http://www.lostdecadegames.com/demos...e_canvas_game/

所以我稍微修改了一下,让 for 循环绘制背景。绘图本身成功,但它有问题。 我发现我必须清除画布并将所有内容重绘到每一帧。我是这样做的:

ctx.clearRect(0,0,canvas.width,canvas.height);

结果是清除发生在循环完成绘制图像之前。

循环是:

  • 透明帆布
  • for 循环绘制背景图块
  • 画别的东西

不知何故,它不输出背景图块...

我在这里包含了我的修改: http://jsfiddle.net/swenn/6mWkU/

可能是什么问题?

【问题讨论】:

  • 找不到你的画布清理方法?对于您的运行循环,最好尝试使用requestAnimationFrame。我认为更新延迟 1 毫秒可能是您的问题的一部分。

标签: javascript html image canvas for-loop


【解决方案1】:

我发现您的代码存在问题,您没有在绘制地板后将 tileY 变量设置回零。这会导致画布将其绘制得越来越远,例如不在画布的视图空间中。

//Start of your render function.
tileY = 0;
tileX = 0;

Working version, webkit

正如我在评论中所写,您应该 requestAnimationFrame 安排您的绘图。

您可能还想研究一种更好的绘制地板的方法,也许制作一个更大的纹理并只绘制一次而不是在 for 循环中。

编辑:将 jsfiddle 链接修复为实际上是更新版本。

【讨论】:

  • 如果我每次都将 tileY 设置为 0,那么它只会绘制第一行,不是吗?关于循环:有 2 个。一个用于 Y,另一个用于 X。我让它们都循环了 10 次,所以 Y 不能永远循环。此外,包含的链接似乎与我的相同。
  • 是的,如果你在第一个 for 循环结束时这样做,但你应该在第一个 for 循环开始之前设置它。在渲染函数的顶部。
  • 在代码的上半部分实际上都设置为0。
  • 代码的最上面部分只运行一次,您需要在每次渲染函数运行时设置它,因为 clearRect 方法会清除所有内容,包括地板。查看我更新的小提琴。
  • 哦。我现在明白了。谢谢你的帮助。 :)
猜你喜欢
  • 2016-08-22
  • 2014-01-10
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多