打灰机是怎样炼成的

   游戏循环:

  每一个游戏都是由获得用户输入,更新游戏状态,处理AI,播放音乐,还有画面显示这些行为组成。游戏主循环就是用来处理这个行为序列的。

  所以首先我们最基本的就是创建一个游戏主循环。对于javascript来说,实现这个游戏循环只有setTimeout和setInterval 这两个方法可选了。

  那到底是setTimeout好还是setInterval 好呢。其实毫无疑问的,setTimeout比较好。setTimeout是在设定的时间后执行一次指定方法,而setInterval是每隔一定的时间久执行指定方法。可能很多人会存在疑问,这样不是setInterval更好吗,直接就可以实现循环了,setTimeout还要用递归实现循环。没错,setInterval实现循环更简单,但是却不是更好。

  因为:

  无论是setTimeout还是setInterval,触发时,如果当前进程不为空,都得去排队等待执行,这一点上是无差异的。

  区别是,setTimeout只需排一次队,setInterval则需要按照预设的间隔时间,每到时间点都去排一下。

  setInterval去排队时,如果发现自己还在队列中未执行,则会被drop掉。也就是说,同一个Interval,在队列里只会有一个。

  因为队列机制,无论是setTimeout还是setInterval,第一次触发时的时间,只会等于大于预设时间,不可能小于。

  对于setInterval来说,如果执行时间大于预设间隔时间,很可能导致连续执行,中间没有时间间隔,这是很糟糕的,很可能会耗费大量cpu。

  所以对于动画来说,如果单帧的执行时间大于间隔时间,用setTimeout比用setInterval更保险。

  于是利用setTimeout这样实现了游戏循环:

1 setTimeout(function(){ 
2 //循环体
3  setTimeout(arguments.callee, 10); 
4 },10);

  不过,真的这样简单吗?要知道javascript是单线程的,当要处理的事务比较多时,setTimeout的执行时间根本得不到保证,这样在不同性能的浏览器上就会有不同的表现了。这时我们可以利用时间差来控制循环体的执行时间。

01 var _last = new Date().getTime();
02   
03 setTimeout(function(){
04   
05 var _now = new Date().getTime();
06   
07 if(_now - _last > delay){
08   
09 _last = _now;
10   
11 //循环体…
12   
13 }
14   
15 setTimeout(arguments.callee, 10);
16   
17 },10);

  这样,循环体执行的时间间隔就比较精准了。

  游戏帧:

  游戏循环有了,现在我们要明确的就是每个循环里要做些什么了。这里的每个循环就是我们所说的帧了。在我们的打灰机游戏里每一帧要做的事情无非就是下面这些 :

  移动敌机

  移动子弹

  碰撞检测

  游戏结束检测

  补充敌机

  移动敌机和子弹只要在当前的位置上加上当前的速度变量就可以了,比较简单。

  我重点说说做碰撞检测。

  碰撞检测:

  打灰机游戏里的碰撞检测主要是检测子弹和敌机,敌机和玩家灰机的碰撞。在这里我们只做简单的矩形碰撞检测。在dom的世界全是方方块块的东东,至于飞机的形状,我想说 不要在意这些细节。要知道,我们是在用javascript做游戏,还得兼容该死的IE6,性能才是最重要的。忽略灰机的形状,这样碰撞检测就简单了,只要根据两个dom元素的位置和长宽判断是否有重叠就可以了。不过更简单的是,直接使用YUI里面的inRegion方法就可以了,哈哈。

  既然如此简单,兴高采烈的开始代码了。开开心心的写个for循环,对每一架敌机和子弹做碰撞检测,然后对每一架敌机和玩家灰机做碰撞检测。大功告成,迫不及待的运行观看效果,然后小伙伴们都惊呆了!chrome下灰机机卡得一顿一顿的,而IE6直接罢工了有木有!我还是高估了javascript的性能,当务之急是对碰撞检测的性能做个优化。

  性能优化:

  每一屏内有十几架飞机,子弹和玩家灰机都分别和敌机做碰撞检测,则每一帧内要做上百次碰撞检测。如果只对可能发生碰撞的进行检测,每一帧的碰撞检测可以减少到十次以内。但是怎么知道哪些灰机是可能发出碰撞的呢。如果敌机可以出现在任意的位置上,那肯定是没办法做到的。所以只好把敌机固定在不同的航线上。如下图所示,


  把游戏区域根据敌机的宽度划分成一条条固定的航线,敌机会随机出现在其中的一条航线上。于是,用子弹的x坐标除以敌机的宽度计算出子弹所处的航线,子弹只要和它所处的航线上的敌机作碰撞检测就可以了。

  如果整个游戏区域分成10条航线,性能就提升了10倍!!同理,对于敌机和玩家灰机的检测也是如此处理。如此,性能提升20倍!!

  操作优化:

  实现玩家灰机的方向控制也是比较简单的,检测键盘事件的上下左右按键事件,对玩家灰机的x,y坐标做相应的增减即可。

  但是在游戏中我们会发现玩家灰机的移动很不流畅,如果把移动速度增大,则会出现一跳一跳的感觉,如果移动速度变小玩家灰机的移动却很慢。这是因为键盘的事件响应频率太慢,所以只要提高移动控制的频率就可以解决这个问题了。类似上文所说的游戏循环,我们可以创建一个专门控制玩家灰机的移动的循环体,在循环体内不停检测标志位direction的值,根据direction的控制玩家灰机的移动方向。而在键盘响应事件中依据玩家按下的键对direction赋予不同的值,其中direction的值0表示静止,1表示向上移动,2表示向下移动,3表示向左移动,4表示向右移动。

  实现代码如下:


  现在玩家灰机的移动控制就流畅很多了。

  一款简单的打灰机游戏就这样炼成啦,最后我们再去打一把灰机吧。

时间: 2024-08-04 04:34:27

打灰机是怎样炼成的的相关文章

技术高手如何炼成

郑昀 创建于2015/6/30 最后更新于2015/10/13 关键词:成长,知识体系,学习金字塔,论坛,博客,RCA,分享会 本文档适用人员:技术人员   面试的时候,我会问面试者,你日常如何构建自己的知识体系,如何让自己更高更快更强?多数工程师并没有深入地思考过这个问题,基本上是零敲碎打,随机性大. 本着不能让你白来一趟的精神,好为人师的我会娓娓道来:   第一阶段 认真构建完整的知识体系 十几年前我投身软件行业的时候,光是讲解数据库原理.操作系统.TCP/IP.组网.算法等等基础知识的英文

一部iPhone洗白史是怎样炼成的?

本文讲的是一部iPhone洗白史是怎样炼成的?,前阵子,手机评测网站ZEALER创始人王自如在滴滴专车上丢失了一部iPhone .(对,就是那个被认成刘翔.和老罗约架的王自如) 丢手机之痛不光是金钱,还有数不尽的隐私泄露之忧.好在,当苹果手机开启了"查找我的iPhone",并在第一时间设置为"丢失模式",这部手机就变成砖头了. 然而,2月1日,在澳洲的王自如竟然收到了一条解锁短信▼ 原来,是有人捡到了手机并尝试激活,贴心的苹果公司"善意"提醒用户

Netflix的牛逼是如何炼成的?

 Netflix是一家在线影片租赁提供商.公司能够提供Netflix超大数量的DVD,而且能够让顾客快速方便的挑选影片,同时免费递送.Netflix已经连续五次被评为顾客最满意的网站.可以通过PC.TV及iPad.iPhone收看电影.电视节目,可通过Wii,Xbox360,PS3等设备连接TV. Netflix的牛逼在哪里? 可以看几个信息. 使用AWS之前,Netflix使用的是Oracle和IBM的技术来支撑其业务发展的.而现在,Netflix基于AWS构建自己的技术生态. Netflix

一个网站的炼成

本文背景:主要以媒体中国(www.cn-media.com)建站的经历做为引导,指出一些观点和思想. 媒体中国是一个以信息分享为主的交流平台,以"观点评论.调查.思想分享.共参与"为主导方向. 更多的背景资料请访问http://www.cn-media.com/seit.shtm 本文评点:观点本没有统一可言,如果读者觉得有误欢迎指正交流.邮件:21media@163.com 述 记得媒体中国(www.cn-media.com)是03年的一个夏季正式发布的.起初只是,纯个人爱好而建的一

优秀博客是如何炼成的?

今天看到方兴东写的一篇文章"优秀博客是如何炼成的?",文章是去年写的,不过现在看看也有很多可圈可点的地方. 其中有几点不能苟同:使用真实的姓名在中国的环境内是极不现实的,很容易吃大亏.关于哗众取宠,贩卖个人隐私,下半身写作等等,我记得方兴东的博客中国不正式靠这些起家的吗?后来不是还特意请来木子美来做市场总监吗?看来方兴东的记性也不太好啊.另外我替方博士补充一个,那就是要有政府公关能力,把那些海外的BLOG服务全都封了(目前只有MSN SPACE还没有被封,大概因为微软的名头比较大),W

一个网站的炼成-媒体中国

媒体 本文背景:主要以媒体中国(www.cn-media.com)建站的经历做为引导,指出一些观点和思想. 媒体中国是一个以信息分享为主的交流平台,以"观点评论.调查.思想分享.共参与"为主导方向. 更多的背景资料请访问http://www.cn-media.com/seit.shtm 本文评点:观点本没有统一可言,如果读者觉得有误欢迎指正交流.邮件:21media@163.com 述 记得媒体中国(www.cn-media.com)是03年的一个夏季正式发布的.起初只是,纯个人爱好而

企业站点SEO是怎样炼成的

对于企业站来说SEO们经常会遇到网站无内容可更新,找不到相关的行业网站的友链,在推广优化过程中总会遇到各种各样的尴尬,下面A5站长网SEO诊断团队(http://seo.admin5.com/seozhenduan)在这里和大家简单的说下最常见的企业站SEO是怎样炼成的,怎样克服企业站自身尴尬的境地? 内容更新 原创成难题 相信企业站的SEO们都有同感,为了搜索引擎蜘蛛每次来抓取有新的内容,企业站每天都要保持网站内容的更新,可网站基本上又没有对应的栏目或是很难找到此方面的信息,想要原创企业站的内

外链是怎么炼成的 一个SEOer的经验分享

网站优化,无非是内部优化和外部优化,两种方式相结合,只要网站内部结构组织好,保持文章内容的原创度,持续更新,然后再加上持之以恒的外部链接建设,那么你的网站一定不会差到哪里去,那么外链是怎么炼成的呢?这里总结了一些外部链接建设经常用到的方法,和大家分享一下. 软文投稿 效果是最好的一个,也是新手seoer比较头疼的方式之一,其实,只要在工作中,总结经验,结合实际问题,写出自己的感受,文笔通顺,表达清楚,一般还是很容易通过的,投稿网站的包括像admin5,chinaz这种免费的站长门户网站,通过率还

月入2万的SEO是怎么样炼成的——重获新生

之前我已经写了<月入2万的seo是怎么样炼成的--初出茅庐><月入2万的seo是怎么样炼成的--跌倒谷底>,虽然很多朋友都不屑于看这种文章,而是喜欢追求一些seo方面的术,举个简单的例子,比如nofollow.相信有很多朋友都会非常的纠结于这个nofollow,以为用好这个 nofollow就好像是学会了一种高超的seo技术一样.其实真的是这样么,如果有时间你可以看看A5的首页有木有,这就是为什么很多人觉得seo很迷茫的原因所在,包括之前我也是一样,太追求术了.   闲话不扯,咱们