最近研究了一下出来了很久的HTML5,总结了一下,准备来个系列,文中也许有很多问题,欢迎大家指正。

Canvas介绍

canvas用于在网页中绘制图形的一个元素,具体内容请查看 -> HTML5 Canvas

这里说些w3school中没有的。

立即模式

canvas元素是立即模式的图形系统,意味着当你提出要求时,他会立即绘制,然后立即忘记(绘制完成一个对象,就会销毁这个对象)。其它的图形系统(例如:SVG),使用了保留模式的图形系统,就是说绘制时他们会保留一系列将要绘制的对象。正因未Canvas不需要维护这一系列对象,所以Canvas的运行速度要快很多。

双缓存机制

在上面,我们提到了立即模式,但这里的“立即绘制”并不是大家所谓的立即,此处需要进一步说明。

在浏览器调用我们定义的绘制方法(假设这个方法是DrawGame)绘制当前动画帧时,Canvas元素并不是立即绘制出你指定的内容。相反,它会创建另一个Canvas元素(我们叫它Canvas2),所有的绘制实际上都在Canvas2中进行。当DrawGame方法返回时,浏览器会通过一个图形操作,复制Canvas2内容到屏幕上,我们将这种技术称为双缓存技术,双缓存技术让动画的实现变得平滑。

坐标系统(translate)

translate(x,y)这是Canvas元素的一个方法,游戏的背景移动,大多通过该方法来实现。游戏中,我们不会通过频繁对大量元素进行坐标计算来实现对象的滚动,因为这样的计算不仅消耗计算机性能,还增加了代码的维护难度。

注意:为了不影响后续的绘制,在使用translate(x,y)修改坐标系统后,需要再次调用translate(-x,-y)来恢复坐标系统。

具体内容请查看 -> HTML5 canvas translate()

创建Canvas镜像和恢复Canvas

在进行动画绘制时,我们会经常的对Canvas元素的绘图环境(context)进行修改,例如strokeStyle,lineWidth等。这些修改操作都是永久的,也就意味着对他们的修改将会影响接下来任何你在Canvas元素的图形操作。那么如何让这些操作只是临时有效呢?这里我们可以使用save()和restore()方法对当前Canvas元素的绘图环境状态创建镜像和恢复。任何写在这两个方法间的环境属性修改,在执行restore后,都会恢复成save时的状态。

注意:save()和restore()需要成对出现,也就是有save,就要有restore。

实现平滑的HTML5动画

所谓的动画,说白了就是一张一张的图片不断的连续更换。所以,通过编程实现动画也就是不断的通过替换图片,来达到动画的效果。

但是,这种不断地替换,当然不能使用死循环while(true)来实现,传统的方法是使用setTimeout()和setInterval()方法,这两个方法虽然都提供了毫秒级的精确度,但实际上,却达不到毫秒级(参考此处:setTimeout精度测试setInterval精度测试)。所以为了保证动画的平滑度,我们不应该继续使用setTimeout和setInterval方法来实现对时间有着苛刻要求的动画,用什么来代替?我们在下一节讲到。

requestAnimationFrame()方法

在w3c中的Timing Control for Script-based Animations(参考此处 -> w3c-Script-based Animations)说明中,定义了一个requestAnimationFrame()窗口对象的方法。不同于setTimeout和setInterval方法,requestAnimationFrame是专门用来实现动画的,它使用浏览器的时间间隔进行绘制,不会掉帧。

这里需要注意的是,requestAnimationFrame方法在窗体没激活或者页签不可见的时候,动画会暂停。

下面是盗的图,支持requestAnimationFrame方法的浏览器及版本(来源:HTML5 requestAnimationFrame( ) 动画API

javascript实例:

 function animate(now)
{
DrawGame(now);
requestAnimationFrame(animate);
}
...
requestAnimationFrame(animate);

制作基于时间的运动

游戏帧速率是不稳定的,也许此时能够60帧/秒,下一刻也许就成了10帧/秒。游戏帧的速率是变化的,我们不能让游戏帧的速率影像到游戏中物体运动的速率,例如:人物的运动,背景的滚动,子弹的速度等等。所以,游戏中物体的运动必须是基于时间的,并且仅仅依赖于时间(例如:像素/秒),而不是动画帧速率。

在上一节的实例中,我们可以发现animate有个参数是now,它代表当前绘制的时间,既然有了这个参数,我们就能知道两次时间间隔,从而计算出运动的距离。

javascript实例:

 var speed = 50;
var lastAnimationTime = new Date();
var offsetX = 0;
function SetBackgroundOffsetX(now)
{
offsetX += speed * (now - lastAnimationTime)/1000
...
//如果一直加下去,背景会慢慢移出屏幕,下面的代码自己写吧
}

结尾

到这里,关于图形与动画的内容就差不多结束了,内容不多,代码很少,但是我觉得已经够了,毕竟大部分的基础知识都能在网上找到哈哈。

本人不是HTML5大佬,如文中有问题,请大家帮忙指正,谢谢大家~

Html5游戏开发-图形与动画(一)的更多相关文章

  1. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

  2. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏

    开言: 以前lufy前辈写过叫“ HTML5游戏开发-零基础开发RPG游戏”的系列文章,在那里面我学习了他的引擎以及了解了游戏脚本.自从看了那几篇文章,我便对游戏开发有了基本的认识.今天我也以零基础为 ...

  3. CutJS – 用于 HTML5 游戏开发的 2D 渲染引擎

    CutJS 是轻量级的,快速的,基于 Canvas 开发的 HTML5  2D 渲染引擎,可以用于游戏开发.它是开源的,跨平台的,与现代的浏览器和移动设备兼容.CutJS 提供了一个类似 DOM 树的 ...

  4. HTML5游戏开发引擎,初识CreateJS

    CreateJS为CreateJS库,可以说是一款为HTML5游戏开发的引擎.打造 HTML5 游戏,构建新游戏,提供构建最新 HTML5 的技术.你可以通过这个网站学习如何构建跨平台和跨终端游戏.这 ...

  5. HTML5游戏开发进阶指南(亚马逊5星畅销书,教你用HTML5和JavaScript构建游戏!)

    HTML5游戏开发进阶指南(亚马逊星畅销书,教你用HTML5和JavaScript构建游戏!) [印]香卡(Shankar,A.R.)著 谢光磊译 ISBN 978-7-121-21226-0 201 ...

  6. HTML5游戏开发技术基础整理

    随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...

  7. html5游戏开发--"动静"结合用地图块拼成大地图 & 初探lufyl

    一.前言   本次教程将向大家讲解如何用html5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏.   首先让我们来了解了解如何用html5实现动画 ...

  8. HTML5游戏开发进阶指南

    <HTML5游戏开发进阶指南> 基本信息 作者: (印)香卡(Shankar,A.R.)    译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121212260 上架时间:20 ...

  9. html5游戏开发--"动静"结合(二)-用地图块拼成大地图 & 初探lufylegend

    一.前言 本次教程将向大家讲解如何用HTML5将小地图块拼成大地图,以及如何用现有的高级html5游戏开发库件lufylegend.js开发游戏. 首先让我们来了解了解如何用html5实现动画,毕竟“ ...

随机推荐

  1. 关于http与https的注意点

    背景:在一次项目生产上线中遇到地址在IOS版本的app中打不开或者接口请求不返回的情况,在安卓机和PC上表现正常,经排查,问题出在http请求上,原因详解 在早期PC上和安卓手机上比较不严格,在htt ...

  2. c++中的const与指针

    const修饰符 使用const修饰变量时,该变量的值不可修改,因此需要初始化. 例如 const int s = 0: 此时s为值不可变的变量. 那么基于此,当const修饰指针时的情况有三种: ( ...

  3. vue组件通信新姿势

    在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的, 子组件传递数据给父组件是通过$emit触发事件来做到的.例如: Vue. ...

  4. 因为曾经装过Mysql导致再次装时windows无法启动MySQL服务报错1067的解决方法

    找到这里 MySQL右击属性 检查这里的可执行文件的路径是否正确,因为我这里显示的是原先的文件夹所以会一直启动失败,修改一下 这里你去百度经验 windows服务修改可执行文件路径 网址https:/ ...

  5. 装mongondb数据库

    装mongondb数据库装好以后进入c盘mongondb bin里边 复制地址 将其放入环境变量里边 放之前需要往前边加一个英语的;在 d盘 建一个data文档 里边简历一个db文件夹 cmd命令框输 ...

  6. 简单操作django中session和cookie

    cookie 1.会话技术 2.客户端的会话技术( 数据库保存在浏览器上) 3.问题导致原因: 在web应用中,一次网络请求是从request开始,到response结束,跟以后的请求或者跟其他请求没 ...

  7. 代码覆盖率 EclEmma

    1. EclEmma的介绍 EclEmma是一个开源的软件测试工具,可以在编码过程中查看代码调用情况.也可以检测单覆盖率. 2. Eclipse下EclEmma安装 1. 选择Help->Ecl ...

  8. Ajax原理与封装详解

    Ajax大家每天都在用,jquery库对Ajax的封装也很完善.很好用,下面我们看一下他的内部原理,并手动封装一个自己的Ajax库. 更多有关ajax封装及数据处理,请参看上海尚学堂<Ajax中 ...

  9. 使用Consul 实现 MagicOnion(GRpc) 服务注册和发现

    1.下载打开Consul 笔者是windows下面开发的(也可以使用Docker). 官网下载windows的Consul https://www.consul.io/ 使用cmd窗口打开,输入con ...

  10. Kali学习笔记13:操作系统识别

    为什么要扫描操作系统呢? 其实和上一篇博客:<服务扫描>类似,都是为了能够发现漏洞 发现什么漏洞? 不同的操作系统.相同操作系统不同版本,都存在着一些可以利用的漏洞 而且,不同的系统会默认 ...