绘制背景

下载图片资源

将图片资源放到 asset/img 下面。

在项目里面我们可能用到 requestAnimationFrame ,关于兼容,大家请查看 目前 requestAnimationFrame 兼容性

为了语义化,规范化,大家可以参考以下规范。

写出一份优雅的代码,是每一位工程师的责任。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Luvdisc</title>
  <link rel="stylesheet" href="assets/css/main.css" />
</head>
<body>

<!--
  HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读性。
  class
  id 、 name
  data-*
  src、for、 type、 href
  title、alt
  aria-*、 role
-->

  <section class="wrapper">
    <figure class="canvas-container">
      <canvas class="canvas-item" id="one" width="800" height="600"></canvas>
      <canvas class="canvas-item" id="two" width="800" height="600"></canvas>
    </figure>
  </section>
  <script async src="bundle.js"></script>
</body>
</html>
  • 添加 main.css

首先我们封装获取一个获取 DOM 和 context 的函数

为什么会知道是 HTMLCanvasElement ?

把鼠标移动到 document.querySelector 上面,按 F12,跳转到原生定义文件里面,搜索 canvas 就可以搜索得到,因为是 HTMLEelemnt 实例,所以必然有 Element 单词在里面。

而这个 CanvasRenderingContext2D ,直接查看 dom.getContext 的返回值类型即可知道。

这里的返回值我们用了元组的解构。

所以获取我们应该这样解构,并且放在了 window.onload 函数里面,报错 DOM 加载完成之后再执行代码。

我们设置的 #one 的 z-index 层级比较高,所以我们会在 one 这一层上面绘制一些 UI、结构之类的逻辑,而 two 则是绘制背景。

  • 接下来我们要用到 requestAnimationFrame 来优化 Web 动画性能

大家可以看一下这一篇文章 requestAnimationFrame简介

我们知道游戏的运行,是需要浏览器不停的重新绘制的,所以说一定有一个循环,在不停的重绘。

这里有一个 deltaTime 来记录一下每一次requestAnimationFrame的时间

而我们的 DOM 实例和 Context 是需要在其他函数里面使用的,所以说,我们必须拿到外面来,但是又必须等 DOM 完成之后再获取。

所有我们小小的修改一下之前的代码

  • 接下来我们添加绘制背景的函数

因为背景是处于游戏中,所以我们要把它写到游戏循环里面。

现在你应该可以看到一个背景图片了。

这样的代码看起来非常的乱,现在我们该来想一想如何重构了。

首先我们理清逻辑,初始化 Init -> 游戏循环 ,目前来说就这么2个逻辑,所以,我们把这 2 个函数分成 2 个文件。

分别创建 init.ts 、game-loop.ts 文件

重构搞定!

Last updated