基于Canvas的JS游戏引擎(一)

本文介绍了基于Canvas的JS游戏引擎的基本原理,重点讲述了游戏循环的实现,包括窗口.requestAnimationFrame()的使用,以及动画重绘的三种方法。此外,还探讨了精灵的绘制策略,通过策略模式和命令模式实现精灵的行为解耦和动态组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

这是一个非常精简的游戏引擎,它仅仅包含了一般游戏所必须拥有的功能。

游戏引擎

主要功能如下
1. 游戏循环
2. 绘制精灵
3. 基于时间运动
4. 碰撞检测
5. 帧速率更新
4. 暂停游戏
5. 事件处理
6. 图片加载

动画循环 /游戏循环

其实游戏循环就是依赖动画循环实现的。
window.requestAnimationFrame()
传统的是window.setTimeout()

核心: 只需在播放动画时持续更新并绘制就行了。 持续更新和重绘:动画循环。
它是所有动画的核心逻辑。

setInterval setTimeout的缺点

使用setInterval实现动画循环,只需要调用一次,而setTimeOut() 则需要持续调用。
他们的问题: 对于setTimeout()它要明确告诉浏览器下一次执行动画循环的时间。所以,每次调用它都要把下次执行动画循环的时间点计算出来。
它不提供精确计时机制,它们只是让程序能在某个大致时间点上运行代码的通用方法而已。
“强制规定时间间隔的下限”。 况且浏览器也是在这么做。

比如FIREFOX 允许最小时间间隔是10ms。 后续调用的最小间隔是5ms。 这也就是说如果你以3ms 为参数来调用setTimeout()方法,浏览器就会根据规则认定参数无效。

不应主动命令浏览器何时去绘制下一frame动画,这应该由浏览器告诉你

虽然setTimeout() setInterval() 时间间隔机制不精确,不过调用的时候,会主动告知绘制下一frame的时间。然而调用者并不知道下一frame动画最佳时机,你可能根本不了解浏览器绘制动画内部机制。 我们应该让浏览器在它觉得可以绘制下一frame动画时通知你。我们用requestAnimationFrame() 实现。

function animate(time){
requestAnimationFrame(animate);
}
function animate() { ...}

实现动画效果

   animate:function(time,that){
        //let self=this; 
        if(this.paused){
            //check if the game is still paused , in PAUSE_TIMEOUT. no need to check
            //more frequently

            setTimeout(()=>{
                window.requestNextAnimationFrame((time)=>{
                    //this.animate.call(this,time);
                    this.animate(time,that);
                }) ; 
            },this.PAUSE_TIMEOUT);
        }else{  //game is not paused      
             this.updateSprites(time); //Invoke sprite behavirus
            //call this method again when 
随着html5 相关技术的兴起,因其跨平台的特性,和标准的日益完善。html5相关技术越来越多的被应用到前沿app的开发中,尤其是html5 小游戏的开发。 Laro 是个基于html5 canvas的用于平面2d或者2.5d游戏制作的轻量级游戏引擎。 因为当前canvas作为画布形态的dom元素,并提供了大量关于矢量图以及texture绘制的api,但是由于其本身提供的api太过于底层,在类似游戏这类交互性,逻辑性较为复杂的app时。需要开发者编写大量底层的api来实现本身的业务逻辑。 Laro出现的目的是为了简化使用canvas制作游戏时的api调用。同时提供了套“有限状态机”的开发模式,这种模式在对于游戏这类的典型的“事件驱动”的模型的开发上。能够很好的做到模块间的低耦合,利于开发者梳理整个开发逻辑。 Laro 游戏引擎目前已经完成了游戏开发中所需要的模块和api的封装,并有些实际的Demo和TestCase供使用者参考。而且随后会结合这个引擎整理出套用于html5 小游戏开发的可视化编辑工具。 旨在帮助开发者更快更容易的搭建款小游戏为目的。 目前已经开源到github (https://github.com/AlloyTeam/Laro) 我们团队希望通过Laro的不断完善,能够帮助更多的html5 小游戏开发者以更快的速度,更优的质量完成 html5小游戏 产业化的开发。 Version Log 0.1 - 基础模块搭建 0.2 - 融入jcanvas,配合鼠标事件处理 0.3 - 加强状态机模块 查看以下demo最好使用chrome  : ) http://hongru.github.com/proj/laro/examples/emberwind/ http://hongru.github.com/proj/laro/examples/typeshot/index.html http://hongru.github.com/proj/laro/examples/jxhome/ http://heroes.github.com/world-of-heroes/development/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值