(转载http://tomyail.com/blog/1123

Nape定义了三种交互方式:

  • Collision(碰撞)
  • Sensor(感应)
  • Fluid(浮力)

默认情况下两个物体只会发生Collision交互,另外的两种交互需要设置Shape的sensorEnabled 和fluidEnabled 来手动开启.

如果一个Shape的这三种交互都是开启的,那么将只处理优先级最高的.

交互的优先级:Sensor>Fluid>Collision.

也就是说当三种交互都允许时,实际上只检测Sensor交互.

控制交互的两种方式:

  1. InteractionFilters
  2. InteractionGroups

InteractionFilters

说明:

所有的Shape类型都有一个filter属性,这个属性是InteractionFilter类型,通过控制filter的group和mask(掩码)来过滤不必要的交互

过滤规则:

当交互对象A的group和其被交互对象B的mask做按位和操作,(无论A和B对象是否互换)如果结果是0说明不交互,否则发生交互.

默认情况下

group都是1,二进制是00…01.

mask是-1,二进制是11…11.

所以默认下任意两个对象都会发生碰撞,因为它们的按位和非0

先来一个简单的demo(小球默认能和下面的木板发生碰撞,点击右边的按钮可以切换小球是否和木板发生碰撞):

filter版本小球碰撞的源码:

private function testSimpleFilter():void
{ var ball:Body = createCircleBody(BodyType.DYNAMIC, 60, 40, 30);
ball.shapes.at(0).material = new Material(Number.POSITIVE_INFINITY);
var box:Body = createRectBody(BodyType.KINEMATIC, 110, 150, 200, 20);
var btn:PushButton = new PushButton(this, 400, 100, box.shapes.at(0).filter.collisionMask.toString(2), clickCallback);
btn.width = 200;
function clickCallback(e:MouseEvent):void
{
box.shapes.at(0).filter.collisionMask = ~box.shapes.at(0).filter.collisionMask;
btn.label = box.shapes.at(0).filter.collisionMask.toString(2);
}
}
使用InteractionFilters的一般思路是

1:首先为需要过滤的对象分组,我们可以将它们抽象成A,B,C组之类的.

2:建立一张含有A,B,C的表格,看个人爱好决定横行表头是group,纵行表头是mask或者横行表头是mask,纵行表头是group.

3:然后为这些组的group表头设定值,这里分group有一个原则就是所有group的按位和操作必须是0(后面会演示如果不这么做会出现什么情况),最简单的方式就是依次按2的整数幂次方为它们编号.

4:按照给定的规则分别标记两两对象的是否可以交互.

5:计算对应的mask.

举个例子:我们想表示三组对象之间的碰撞关系:

0表示不碰撞(按位和=0),1表示碰撞(按位和!=0)
  Triangle(mask) Rect(mask) Circle(mask)
Triangle(group) 0(×) 1(√) 1(√)
Rect(group) 1(√) 1(√) 0(×)
Circle(group) 1(√) 0(×) 0(×)

定义了三个组,按照1,2规则建立一张表格,左边的假定是group

然后我们给group分配值,按照规则三我们假定

Triangle的group是2^0 >>001;

Rect的group是2^1 >>010;

Circle的group是2^2 >>100;

结合上表就能依次计算出:

Triangle的mask是110也就是十进制的6;(观察第一列:只有110和001按位和0,和010按位和非0,和100按位和非0,下同)

Rect的mask是011也就是十进制的3;

Circle的mask是001也就是十进制的1;

结果如下:

控制三组对象碰撞关系的filter版本源码:

private function testMultiFilter():void
{ var triangle1:Body = createRegular(BodyType.DYNAMIC,100,20,40,3);
var triangle2:Body = createRegular(BodyType.DYNAMIC,500,20,60,3); triangle1.shapes.at(0).filter.collisionGroup = 1;
triangle2.shapes.at(0).filter.collisionGroup = 1; triangle1.shapes.at(0).filter.collisionMask = ~1;
triangle2.shapes.at(0).filter.collisionMask = ~1; var rect1:Body = createRectBody(BodyType.DYNAMIC,200,50,120,40);
var rect2:Body = createRectBody(BodyType.DYNAMIC,550,50,50,50); rect1.shapes.at(0).filter.collisionGroup = 2;
rect2.shapes.at(0).filter.collisionGroup = 2; rect1.shapes.at(0).filter.collisionMask = ~4;
rect2.shapes.at(0).filter.collisionMask = ~4; var cirCle1:Body = createCircleBody(BodyType.DYNAMIC,300,100,40);;
var cirCle2:Body = createCircleBody(BodyType.DYNAMIC,420,100,80);; cirCle1.shapes.at(0).filter.collisionGroup = 4;
cirCle2.shapes.at(0).filter.collisionGroup = 4; cirCle1.shapes.at(0).filter.collisionMask = ~(4 | 2);
cirCle2.shapes.at(0).filter.collisionMask = ~(4 | 2);
}

所有group的按位和操作必须是0,如果不是会怎么样呢?做个实验就知道了.

我们假定

Triangle的group是001;

Rect的group是011;

Circle的group是101;

那么对于第一列能得出Triangle的mask是110.

但是对于第二列

第二列第一行能确定??1

第二列第二行能确定?11

第二列第三行需要101,但是101和?11都是互斥的,所以认定这个group组合不合法.

mask的快捷计算方式:

这个方法比较笨拙,如果对位操作比较熟悉,可以使用nape作者推荐的计算mask的方法:

对所有不和指定组发生交互的组的group取或(|)操作,并且将得到的结果按位取反(~).

比如:

A不和A发生碰撞那么计算掩码的直接表达式就是

maskA = ~(groupA) = 110;

C不和BC碰撞

maskC = ~(groupB|groupC) = ~(010|100) = ~(110) = 001;

nape.dynamics.InteractionFilter的更多相关文章

  1. nape.dynamics.InteractionGroup

    (转载http://tomyail.com/blog/1123) 说明: Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionG ...

  2. Nape 获取碰撞点加特效

    package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...

  3. Nape实现坐标旋转角度回弹

    乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图: 要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1. 向量取反: var v:vec2 = new V ...

  4. Dynamics CRM 2015-超大Solution导入问题

    我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...

  5. Dynamics CRM导出数据到Excel

    原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...

  6. Step by step Dynamics CRM 2011升级到Dynamics CRM 2013

    原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...

  7. Step by Step 创建一个新的Dynamics CRM Organization

    原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...

  8. Step by step Dynamics CRM 2013安装

    原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处   SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...

  9. Session for SSRS Report of Microsoft Dynamics AX

    Session for SSRS Report of Microsoft Dynamics AX 版权声明:本文为博主原创文章,未经博主允许不得转载. Contract •A data contrac ...

随机推荐

  1. dp和px,那些不得不吐槽的故事——Android平台图

    http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html 一个优秀的手机软件,不仅要有精巧的功能,流畅的速度,让人赏心悦目的UI也往往是用户选择的重要理 ...

  2. ORACLE DATAGURARD 折腾记二

    前文再续,书接上一回,这次折腾Data Guard的一个重要目的是利用switchover实现机器的升级,怎么switchover呢?按照我的理解,Data Guard的角色切换是这样一个过程: (1 ...

  3. Android 中的MVP 模式

    MVP模式的核心思想: MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成功接口,Model类还是原来的Model. MVC 其中View层其实就是程序的UI界面,用于向用户展示 ...

  4. 异常处理 Exception

    一.异常类 1.在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象: 2.在 ...

  5. DataTable 分页

    #region DataTable 分页 /// <summary> /// Datatable 分页 /// </summary> /// <param name=&q ...

  6. LA 6540 Fibonacci Tree

    以前做过的题···重新做一遍之后怎么做怎么wa···后来GG了···第二天看不知道为啥A了···难道我失忆了? 题意:无向图,边有黑色和白色两种颜色,求是否存在一个生成树中白边的个数是斐波那契数. 解 ...

  7. 犯罪构成三层次记忆口诀 zt

    犯罪构成三层次记忆口诀 2012-02-17 来源:为你辩护网 浏览次数:232 0 众所周知,犯罪构成“四要件”和犯罪构成“三层次”(“三阶层”)都是分析具体刑事案件的辅助性工具.犯罪构成四要件是指 ...

  8. (转载)HTML与XHTML有什么区别

    转自:http://zhidao.baidu.com/link?url=8wvu7Jbzr-wjeKdWCwWkIiJNSpO3HHLERkgQu1QzuLOPT0zvzkHn9HbAFEjPdchP ...

  9. HDU2859 Phalanx 简单DP

    dp[i][j]代表以s[i][j]字符为右上角的最大对称方阵的尺寸 最左边那一列都为1,然后按列更新,代码实现比较简单,感觉有点卡时间,如果对称度很好,时间应该比较高,我只会这种了 #include ...

  10. bzoj 1835 [ZJOI2010]base 基站选址(DP+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1835 [题意] 有n个村庄,每个村庄位于d[i],要求建立不多于k个基站,在第i个村庄 ...