使用 HTML5 Canvas 和原生 JavaScript 构建一个简单的绘画游戏

当谈到 HTML5 Canvas 时,你通常会听到关于让它在传统浏览器上运行的库、像离屏 Canvas 这样的性能技巧,以及绘制和动画化精灵和瓷砖的方法。但这只是 Canvas 的一部分。在最底层,Canvas 是一种用来操纵屏幕一部分像素的方法。无论是通过绘画 API 还是直接操纵像素数组(顺便说一下,这是一个 类型化数组,因此性能非常出色)。

利用这些知识,我认为创建一个我曾在平板电脑广告中看到的小游戏会很有趣:一款简单的小游戏,可以让孩子们画字母。结果是针对 FirefoxOS 的一个演示,名为 Letterpaint,它很快将在 应用商店 上线。代码在 GitHub 上

letterpaint

构建 Letterpaint 的有趣之处在于我走了一些捷径。在画布上绘画很容易(使用 Jacob Seidelin 的 Canvas 速查表 会更容易),但乍一看,确保用户停留在特定形状内很棘手。找出字母的填充程度也是如此。但是,通过重新将 Canvas 看作像素集合,我找到了一个简单的方法来实现这一点。

  • 当我绘制字母时,我会读取具有字母颜色的像素数量。
  • 当你点击鼠标按钮或触摸屏幕时,我会测试当前鼠标/手指位置的像素颜色。
  • 当像素不是透明时,你就在字母内部,因为默认情况下,主画布是透明的。
  • 当你释放鼠标或停止触摸屏幕时,我会将油漆颜色的像素数量与字母的像素数量进行比较。

很简单,不是吗?所有这些都可以用两个可重用的函数实现。

/*
  getpixelcolour(x, y)
  returns the rgba value of the pixel at position x and y
*/
function getpixelcolour(x, y) {
  var pixels = cx.getImageData(0, 0, c.width, c.height);
  var index = ((y * (pixels.width * 4)) + (x * 4));
  return {
    r: pixels.data[index],
    g: pixels.data[index + 1],
    b: pixels.data[index + 2],
    a: pixels.data[index + 3]
  };
}

/*
  getpixelamount(r, g, b)
  returns the amount of pixels in the canvas of the colour
  provided
*/
function getpixelamount(r, g, b) {
  var pixels = cx.getImageData(0, 0, c.width, c.height);
  var all = pixels.data.length;
  var amount = 0;
  for (i = 0; i < all; i += 4) {
    if (pixels.data[i] === r &&
        pixels.data[i + 1] === g &&
        pixels.data[i + 2] === b) {
      amount++;
    }
  }
  return amount;
}

在里面添加一些绘画函数,你就完成了游戏。你可以在 网上查看一步一步的指南(以及 从 GitHub 获取代码),还有一个关于技巧和决定的屏幕截图 在 YouTube 上

这里要记住的最重要的事情是,使用库和工具来快速完成事情非常诱人,但这可能意味着你思考得过于复杂。浏览器为我们内置了非常强大的工具,在很多情况下,这意味着你只需要保持更新,并大胆地尝试一些“新”的东西,这些东西都是开箱即用的。

关于 Chris Heilmann

HTML5 和开放网络的布道者。让我们来修复它!

更多 Chris Heilmann 的文章...


4 条评论

  1. Yannick L.

    很棒且简单的小游戏。有趣的解决方案,用于确定图像的填充程度以及何时超出字母范围。很棒的东西,Chris。

    如果使用 HTML5 音频在他们正确绘制字母时也发音,那就更酷了。:)

    2013 年 6 月 6 日 下午 06:39

    1. Chris Heilmann

      这个正在制作中。现在它在游戏中播放“错误”和“获胜”的声音。我的同事现在正在录制 a-z,我将在她完成后添加。

      2013 年 6 月 6 日 下午 07:15

  2. Tin Aung Linn

    非常简单,并且源代码是开放的。我必须去看看并学习它。

    谢谢您
    分享。

    2013 年 6 月 7 日 下午 04:59

  3. Aras

    喜欢这个应用程序和你聪明直观的做法。我想现在看起来很直观,因为你已经解决了所有难题的部分。做得好!

    2013 年 6 月 14 日 上午 00:53

本文的评论已关闭。