Impact 主题(四):碰撞

概述
Impact 中的碰撞检测由两个单独的步骤来完成:“静态”碰撞(实体与世界)和“动态”碰撞(实体与实体)。

静态碰撞是实体在移动过程中自己解决的,也就是说,实体检测是否可以移动到它想要去的地方。在实体移动之前,它做了一个从当前位置到目的地的追踪。游戏的 CollisionMap 用追踪结果回应——是否以及哪里有一个碰撞。Kilofox.Net

动态碰撞是在所有实体都移动以后解决的。动态碰撞只检查当前两个实体是否是重叠的——如果是的话,就把它们移开。

重要的是,要注意,静态碰撞始终是准确的、帧率独立的,而动态碰撞却不是这样的。这就意味着,快速移动的实体不能穿墙移动,但是两个快速移动的实体之间的碰撞可能被忽视。Kilofox.Net

Impact 始终保持最低每秒20帧的帧率,以使所有的动态碰撞仍然足够准确。见 ig.Timer.maxStep。

静态碰撞
默认情况下,所有的实体都会与游戏的 .collisionMap 碰撞。实体的 .update() 方法根据实体的属性计算移动速度,然后对CollisionMap 做一个追踪。然后,追踪的结果由实体的 .handleMovementTrace() 方法处理。Kilofox.Net

所以,如果你不想让实体参与静态碰撞,最简单的办法,就是像下面这样为该实体重写 .handleMovementTrace() 方法:
  1. handleMovementTrace: function( res ) {
  2.     // 完全忽略追踪结果(res),总是根据实体的速度移动。
  3.     this.pos.x += this.vel.x * ig.system.tick;
  4.     this.pos.y += this.vel.y * ig.system.tick;
  5. },
复制代码
您也可以检测实体与哪个“块”碰撞了,并采取相应的行动(例如,是否有光滑的“块”)。Kilofox.Net

如果你想在玩家实体以一定的速度落地时播放一段声音,你可以重写 .handleMovementTrace() ,检查碰撞和速度。
  1. EntityPlayer = ig.Entity.extend({



  2. handleMovementTrace: function( res ) {
  3.     if( res.collision.y && this.vel.y > 32 ) {
  4.         this.soundBounce.play();
  5.     }

  6.     // 继续照常解决碰撞
  7.     this.parent(res); 
  8. },



  9. });
复制代码
您可以使用 Weltmeister 创建 CollisionMap。默认情况下,游戏的 .loadLevel() 方法假定一个名为“collision”的层为关卡的CollisionMap。

您可以随时手动创建一个 CollisionMap:Kilofox.Net
  1. // 在你的游戏的 init() 方法里
  2. var map = [
  3.     0,0,0,0
  4.     0,1,1,0
  5.     0,0,0,0
  6. ];
  7. this.collisionMap = new ig.CollisionMap( 8, map );
复制代码
如果你不指定 CollisionMap,将使用一个空的虚拟层(ig.CollisionMap.staticNoCollision)。

动态碰撞
实体与实体的碰撞有一点复杂,因为一个实体可以有多种碰撞模式。如果两个实体相互碰撞,则它们两个的碰撞模式决定了是否以及如何解决碰撞。Kilofox.Net

实体的碰撞模式是由它的 .collides 属性决定的。默认情况下,该属性设置为 ig.Entity.COLLIDES.NEVER,忽略所有的碰撞,不管其他实体拥有哪种碰撞模式。

其他的碰撞模式有 LITE、 PASSIVE、ACTIVE 和 FIXED。

如果一个 PASSIVE 实体与一个 ACTIVE 实体碰撞,则分开两个实体。ACTIVE 与 ACTIVE 碰撞的情况也是如此。

PASSIVE 模式存在的原因,是 PASSIVE 与 PASSIVE 碰撞根本不会被解决(换言之,他们只会重叠)。这可是有用的,敌人能够“穿过”对方,而不是挡住道路。这些 PASSIVE 实体仍然会与 ACTIVE 实体碰撞。Kilofox.Net

其他两个模式实际上是为相互碰撞定义了一个“弱”实体和一个“强”实体。在这种情况下,只移动“弱”实体来解决碰撞。

设置为 LITE 碰撞模式的实体始终是“弱”实体,也就是移动的实体。设置为 FIXED 碰撞模式的实体始终是“强”实体,它就待在那里。Kilofox.Net

LITE 实体只和 ACTIVE 或 FIXED 实体碰撞。FIXED 实体会与 LITE、PASSIVE 和 ACTIVE 实体碰撞。

还迷惑吗?下面是一些常规建议:Kilofox.Net

玩家和敌人角色通常应该是 PASSIVE 的,以使他们不互相碰撞,但是可以与 ACTIVE 实体(如箱子)碰撞。

平台和电梯应该是 FIXED 的,以使他们不用理会是否有其它实体挡住了它们的路。

所有纯视觉的、不影响游戏的实体,都应该为 Lite 或 NEVER。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值