今天这一部分主要讲游戏的实现原理与游戏循环的代码实现。

先说原理,大家都看过动画吧。在我看来,游戏就是玩家能人为控制动画剧情发展方向的动画。所以,我们的游戏引擎其实说白了就是个动画引擎再加上鼠标事件、键盘事件等这些能告诉动画接下来剧情走向的模块。你点一下鼠标,动画下一个画面就开枪了,你按一下方向键,动画人物下一个画面就朝着那个方向走一步,就这么简单。

具体到代码,我大概列出了游戏运行需要的主要模块以及他们在源代码的位置。其中最核心的模块就是中间的动画循环模块。他就像一列火车,每个模块就是一个火车站。当火车停靠了所有站台跑完一圈时游戏画面就进入下一帧,除非游戏暂停,动画循环会一直跑下去。

火车跑一圈叫做一帧。火车一秒钟跑过的圈数叫做帧数率(fps)。

所以我们首先要做的就是找到一个方法能让这个循环一直进行下去。我们知道window.setInterval()可以传入一个函数与一个毫秒为单位的时间间隔。每当到了间隔时间就会执行传入的函数。但这里我们不用他,而用HTML5标准定义的window.requestAnimationFrame()方法,这个方法接受一个函数作为参数,浏览器将根据绘制的最佳时机调用这个函数。 在这里比较下二者的优劣。

window.setInterval()        window.requestAnimationFrame()

接受参数:  回调函数,间隔时间    |    回调函数

用处:       通用方法          |    专门处理动画,会对动画循环机制做优化

时间间隔: 手动设置,虽然以毫秒为单位但达不到毫秒级精确度 | 浏览器自动根据绘制的最佳时机设置

接下来,就是我们游戏循环的实现。 代码见game-engine 663行起

Game.prototype= {

	// 调用start方法会根据浏览器最佳时机调用animate方法
start: function () {
var me=this; //保存this值,因为requestAnimationFrame()方法是window上的,直接在其中使用this会指向window而不是game的实例
this.startTime=getTimeNow(); //设置游戏开始时间
window.requestAnimationFrame(function (time) { //开始循环
me.animate.call(me,time);
});
},
animate: function (time) { //这就是循环要执行的函数
var me=this;
if (this.paused) { //如果游戏暂停了,不会执行下面的操作
setTimeout(function () {
me.animate.call(me,time);
},this.PAUSE_TIMEOUT);
} else { //如果游戏没有暂停,依次执行下面的方法
this.tick(time); //用于更新游戏时间
this.clearScreen(); //清空游戏画面。 因为每一帧都会重绘游戏,所有的内容都会在新的位置绘制,所以得把上一帧的内容清除了
this.startAnimate(time);      //当开始动画时运行的函数        
this.paintUnderSprites(); //在精灵对象(也就是玩家和怪物)下绘制的内容
this.updateSprites(time);     //更新精灵对象的行为
this.paintSprites(); //绘制精灵对象的新位置
this.paintOverSprites(); //精灵对象之后运行的函数
this.endAnimate(); //一帧动画结束时要运行的函数 window.requestAnimationFrame(function (time) {
me.animate.call(me,time);
});
}
},
//后续代码省略

  

有了这个循环,我们的游戏框架就大体搭起来了,接下来只要把每一帧动画都需要发生的事情写入animate方法中相应的部分,浏览器就会自动帮我们运行了。

今天就到这里吧,下一篇将介绍游戏运行需要的基本模块。

用canvas制作酷炫射击游戏--part2的更多相关文章

  1. 用canvas制作酷炫射击游戏--part1

    好久没写博客了,因为过年后一直在学游戏制作方面的知识.学得差不多后又花了3个月时间做了个作品出来,现在正拿着这个作品找工作. 作品地址:https://betasu.github.io/Crimonl ...

  2. 用canvas制作酷炫射击游戏--part3

    今天介绍下 游戏中的sprite模块,也就是构建玩家及怪物的模块.有了这个模块,就可以在咱们的游戏里加入人物了. 想必用过css的朋友都知道sprite,一种将需要加载的图片拼接在一张图里以减少请求的 ...

  3. html5+Canvas实现酷炫的小游戏

    最近除了做业务,也在尝试学习h5和移动端,在这个过程中,学到了很多,利用h5和canvas做了一个爱心鱼的小游戏.点这里去玩一下 PS: 貌似有点闪屏,亲测多刷新两下就好了==.代码在本地跑都不会闪, ...

  4. 怎样用HTML5 Canvas制作一个简单的游戏

    原文连接: How To Make A Simple HTML5 Canvas Game 自从我制作了一些HTML5游戏(例如Crypt Run)后,我收到了很多建议,要求我写一篇关于怎样利用HTML ...

  5. [译]怎样用HTML5 Canvas制作一个简单的游戏

    这是我翻译自LostDecadeGames主页的一篇文章,原文地址:How To Make A Simple HTML5 Canvas Game. 下面是正文: 自从我制作了一些HTML5游戏(例如C ...

  6. canvas实现酷炫气泡效果

    canvas实现动画主要是靠设置定时器(setinterval())和定时清除画布里的元素实现,canvas动画上手很简单,今天可以自己动手来实现一个酷炫气泡效果. 气泡炸裂效果(类似水面波纹) 代码 ...

  7. 教你使用Python制作酷炫二维码

    这篇文章讲的是如何利用python制作狂拽酷炫吊炸天的二维码,非常有趣哦! 可能你见过的二维码大多长这样: 普普通通,平平凡凡,没什么特色... 但,如果二维码长这样呢! 或者 这样! 是不是炒鸡好看 ...

  8. Unity3D游戏开发从零单排(三) - 极速创建狂拽酷炫的游戏地形

    提要 在Unity工作流程内,地形是一个必不可少的重要元素.不论是游戏或虚拟现实都会使用到各种类型的地形效果,在这个教学中我们须要了解到地形的制作基本概念与,当中对于Unity的地形操作部分须要大量的 ...

  9. 腾讯AlloyTeam正式发布pasition - 制作酷炫Path过渡动画

    pasition Pasition - Path Transition with little JS code, render to anywhere - 超小尺寸的Path过渡动画类库 Github ...

随机推荐

  1. codeforces Codeforces Round #380 (Div. 1, Rated, Based on Technocup 2017 - Elimination Round 2)// 二分的题目硬生生想出来ON的算法

    A. Road to Cinema 很明显满足二分性质的题目. 题意:某人在起点处,到终点的距离为s. 汽车租赁公司提供n中车型,每种车型有属性ci(租车费用),vi(油箱容量). 车子有两种前进方式 ...

  2. JavaWeb 学习003-简单登录页面功能实现

    先说下题外话:学习不是看你学了多久,重点是学到多少: 这就要求   效率.我在这三个小时,但是有效率的又有多久?只是做了这么一点简单的事. 登录页面 跟数据库交互,进行判断是否登陆成功.我只是实现了一 ...

  3. Nginx配置proxy_pass

    nginx配置proxy_pass,需要注意转发的路径配置 1.location /test/ { proxy_pass http://t6:8300; } 2.location /test/ { p ...

  4. NPOI 导入导出excel 支持 03 07

    因为微软的office成本太高了,所以开发项目的时候电脑上没安装office,而是安装了wps.但开发语言用的是C#,所以直接调用微软的office组件是很方便的,但一方面慢,一方面成本高,所以从网上 ...

  5. PHP的文件格式应该以UTF-8无BOM编码

    前一段时间写PHP,经常在解析文件之前就要对数据进行处理判断,并以header()的方式进行页面跳转.然而后来将文件放到 linux 服务器时常碰到header()解析出错的情况,而在 windows ...

  6. [LeetCode][Java]Candy@LeetCode

    Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  7. jQueryAjax笔记

    ajax优点:能在不刷新整个页面的前提下更新数据,使用户操作与服务器响应异步化. ajax缺点:破坏浏览器“前进”.“后退”按钮的正常功能,搜索引擎爬虫不能理解那些奇怪的JS代码和因此引起的页面内容的 ...

  8. 使用AsyncTask实现文件下载并且在状态中显示下载进度

    2013年10月24日 上班的第二天 昨天我是用afinal完成的则个功能,但是公司里并不希望使用第三方的代码,所以要求我在不使用第三方开源项目的情况下实现. 最先我是使用Thread开启一个子线程, ...

  9. vios 虚拟光驱 安装vioc

    一.VIO server 创建虚拟光驱 1 检查是否创建Library $lsrep 2 创建 VMLibrary :vg 和size都可以自己定义 $mkrep -sp rootvg -size 1 ...

  10. VM安装OracleLinux

    http://blog.csdn.net/highning/article/details/11556077 一步一步教你在VMware Workstation 10 安装 Oracle Linux ...