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

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

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

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

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

window.setInterval()        window.requestAnimationFrame()

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

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

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

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

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

  

有了这个循环,我们的游戏框架就大体搭起来了,接下来只要把每一帧动画都需要发生的事情写入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. .net学习笔记--序列化与反序列化

    序列化其实就是将一个对象的所有相关的数据保存为一个二进制文件(注意:是一个对象) 而且与这个对象相关的所有类型都必须是可序列化的所以要在相关类中加上 [Serializable]特性 对象类型包括:对 ...

  2. 数组 Arrays类

    1.数组是一组变量集合,用来存储相同数据类型的一组数据的连续的空间. *数组名(标识符)连续空间首地址. *元素下标标明元素在数组中的位置,从0开始. *每个元素都可以通过下标来访问. *数组长度固定 ...

  3. PHP从mysqli中获取的资源$result是不是不能while($row = $result->fetch_assoc())这样两次?【坑】

    PHP从mysqli中获取的资源$result是不是不能while($row = $result->fetch_assoc())这样两次? 因为我这样做,结果后面的查询结果就无法显示了,目前尚不 ...

  4. Ext.Net TreePanel 修改Icon图标

    分类: Ext.Net2012-09-24 13:44 1779人阅读 评论(0) 收藏 举报 webformserverextassemblyxhtmlobject 1.默认icon 2.自定义ic ...

  5. 【Leetcode-Mysql】Trips and Users

    思路不总结了,看过题目自己尝试过之后,看下方代码应该能理解的 SELECT Request_at AS DAY, round( sum( CASE WHEN STATUS = 'completed' ...

  6. XE3随笔19:实例 - 借用 Google 实现全文翻译

    调用 Google 翻译的地址格式: http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + ...

  7. EF for Firebird

    今天用了Firebird,记录下怎么用,不然下次给忘记了 1.官网下载包 1.DDEXProvider-3.0.1.0.msi 2.FirebirdSql.Data.FirebirdClient-4. ...

  8. 图表插件使用汇总(echarts,highchairts)

    1.echarts之饼图显示数字 option={ title: { text: '某站点用户访问来源', subtext: '纯属虚构', x: 'center' }, tooltip: { tri ...

  9. C#实现:给定任意数字,输出在该数字下所有()括号的集合

    class Program { static void Main(string[] args) { getPairs(, , , , ""); Console.ReadKey(); ...

  10. prism4 StockTrader RI 项目分析一些体会

    StockTrader RI 代码分析也有一段时间了 刚从codeplex获取到源代码的时候,看得一头雾水,不知所云(因为之前没做过wpf的项目,看文档也静不下那心来看) 后来就想了个笨办法,模拟项目 ...