H5游戏-Canvas绘制与JS基础

一、Promise 与 async await

Promise和async await是一个东西,async await是Promise的语法糖。

async await类似UnityC#的async await。

async修饰的function中,需要返回一个new Promise((resoleve)=>{})。

async await用同步的写法写异步,避免回调地域,是推荐写法,不用.then。

二、ctx.save与ctx.restore

一个典型使用:

复制代码
ctx.save();
ctx.xxxx();例如ctx.translate(x,y); 改变了ctx的状态
ctx.restore();

ctx很明显是content上下文缩写,ctx保存了canvans绘制的状态。

关键问题在于为什么要ctx.save,并且在更改了某些状态后要restore。

ctx.save():把当前「画布设置」拍一张快照存起来。

ctx.restore():把画布恢复到最近一次 save 时的快照。

比如:

复制代码
ctx.fillStyle = 'red';
drawCircle(100, 100);   // 红圆

ctx.fillStyle = 'blue';
drawCircle(200, 200);   // 蓝圆

drawCircle(300, 300);   // 还是蓝圆!因为没改回去

如果 drawCircle 内部想「暂时用红色画完再恢复」,不用 save/restore 就得自己记下原来的 fillStyle 再设回去,很麻烦。

用 save/restore 就可以:

复制代码
ctx.save();              // 存档:当前是默认状态
ctx.fillStyle = 'red';
ctx.translate(50, 50);
drawSomething();         // 在「临时状态」下画
ctx.restore();           // 读档:fillStyle、坐标等都恢复
// 这里又回到存档时的状态,不影响后面的绘制

所以:save/restore 的作用 = 把一段代码里的「设置改动」限制在这段代码内部,不污染外面。

通常会被save/restore的东西

复制代码
样式:fillStyle、strokeStyle、lineWidth、globalAlpha、font 等
变换:translate()、rotate()、scale() 等
裁剪区域:clip()
其他绘图状态(合成方式等)

三、如何驱动Canvas的帧循环

利用requestAnimationFrame(方法名如Update或者GameLoop)。

requestAnimationFrame 是浏览器/JS 运行环境自带的"系统函数"。

参数方法比如GameLoop会在绘制下一帧的时候调用,然后在GameLoop中再调用requestAnimationFrame,形成帧循环。

四、一个典型的一帧的过程

  1. 计算这一帧的时间
  2. 一个方法计算数值
  3. 一个方法负责利用计算后的数值进行绘制
  4. 调用requestAnimationFrame(自己)形成帧循环。

五、简单的分离UI和游戏Canvas,让UI粗暴的展示在Canvas前。

复制代码
    <canvas id="gameCanvas"></canvas>
     <!-- 没有z-index,会盖在canvas上面。 -->
    <div id="uiOverlay" class="ui-overlay"></div>
相关推荐
椰猫子11 小时前
html、css入门
开发语言·javascript·ecmascript
SuniaWang12 小时前
《Spring AI + 大模型全栈实战》学习手册系列·专题一:《RAG技术全景解析:从原理到架构设计》
java·javascript·人工智能·spring boot·后端·spring·架构
Irene199112 小时前
通过JavaScript创建新的img元素并指定onload事件,为什么要在赋值src属性之前指定事件处理程序?
javascript
~无忧花开~12 小时前
React元素渲染:核心概念全解析
开发语言·前端·javascript·react.js
qq_2837200512 小时前
nestjs实战(六):诺依Nest.js + MySQL 项目改造为兼容达梦8数据库详细教程
javascript·数据库·mysql·达梦·nest.js·诺依
Mr数据杨12 小时前
【通用Vue】学生管理模块通用功能
javascript·vue.js·ecmascript
前端小菜鸟也有人起12 小时前
vue中is的作用和用法
前端·javascript·vue.js
m0_5027249512 小时前
vue3在线预览excel表格
javascript·vue.js·excel
酉鬼女又兒12 小时前
零基础入门前端JavaScript 基础语法详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·chrome·蓝桥杯
该怎么办呢12 小时前
packages\engine\Source\Core\Cartesian3.js
前端·javascript·cesium