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

接着上一节,我们来讲一下引擎后面的部分

碰撞检测

碰撞检测分事前检测和事后检测:
priori collision detection / posteriori collision detection
提前探知是否会发生碰撞 或 事发之后才检测到碰撞

事前碰撞可能会失效,因为计算小球在下一帧的位置来检测碰撞,容易出错。它是根据当前速率估算的,而帧速率突然改变,估算的结果就不准了。
事前的准确度不够高!

外接图形判断法

以下是外接矩形检测法

ballWillHitLedge:function(sprite,ledge){
        let fps=sprite.fps;
        let spriteRight=sprite.left+sprite.width,
            ledgeRight=ledge.left+ledge.width,
            spriteBottom=sprite.top+sprite.height*2, //here is sprite.height*2!!! not so accureately!
            nextSpriteBottomEstimate=spriteBottom+sprite.velocityY/fps;
            //外接矩形 碰撞检测
            //此处的碰撞检测包含了3种情况,sprite在ledge的左边缘上,但还没超出
            //sprite在ledge的右边缘上,但还没超出,
            //sprite整体在ledge里面。 后面的identify会判断出来
        return spriteRight>ledge.left&&
                sprite.left<ledgeRight&&
                spriteBottom<ledge.top&&
                nextSpriteBottomEstimate>ledge.top;
    },

分离轴定理SAT与最小平移向量MTV

外接矩形 外接圆 和 光线投射法检测碰撞。 不适用于检测任意多边形之间的碰撞。

分离轴定理:只适用于凸多变形!
把受测的两个多边形置于一堵墙前面,用光线照射它们,然后根据其阴影部分是否相交来判断二者有没有相撞。

它们在任意一条轴上都不重叠就是没有碰撞。 只要能在任何一条轴上找到互相分离的投影,就说明两个多边形没有发生碰撞,一旦发生了碰撞就肯定在所有的轴上都找不到互相分离的投影。
我们要对 两个图形的 每个边都做一次投影, 也就是说 这个多边形有几条边就有多少个投影轴!
不过只要在任何一个投影轴上检测到互相分离的投影就可以结束检测!

帧速率更新

解释

动画是由一系列FRAME图像组成的。 这些图像的显示频率就叫做“frame速率”
frame rate 。

更新公式
我们要计算frame rate (每秒 frame per second fps)

上次绘制frame的时间从当前时间中减去,得到了这两frame动画的时间差,然后再用1000除以这个以ms为单位的时间差。 于是就得出了动画每秒播放的frame数。

以不同的frame rate 执行各种任务
很多动画程序是播放动画的时候还要执行其他任务。 比如,播放动画时还要执行其他任务。
所以要学把不同的任务安排在不同的frame rate上执行。

   //有关帧速率的对象属性
  //Time
    this.startTime=0;
    this.lastTime=0;
    this.gameTime=0;
    this.fps=0;
    this.STARTING_FPS=60;

  //Update the frame rate, game time, and the last time the application 
    //drew an animation frame
    tick:function(time){
   
        this.updateFrameRate(time);
        this.gameTime=(getTimeNow())-this.startTime;
    },
 // Update the frame rate, based on the amount of time it took
   // for the last animation frame only.
    updateFrameRate:function(time){
   
        //Here calculate the fps!
        if (this.lastTime===0)
            this.fps=this.STARTING_FPS;
        else
            this.fps=1000/(time-this.lastTime);
    },

我们在游戏循环中会调用这个tick来更新游戏时间,以及更新游戏帧速率。
time-lastTime 即帧之间的相隔时间,然后用1000除以它就是每秒多少帧, fps的值

暂停游戏


                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随着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、付费专栏及课程。

余额充值