nape.dynamics.InteractionFilter
(转载http://tomyail.com/blog/1123)
Nape定义了三种交互方式:
- Collision(碰撞)
- Sensor(感应)
- Fluid(浮力)
默认情况下两个物体只会发生Collision交互,另外的两种交互需要设置Shape的sensorEnabled 和fluidEnabled 来手动开启.
如果一个Shape的这三种交互都是开启的,那么将只处理优先级最高的.
交互的优先级:Sensor>Fluid>Collision.
也就是说当三种交互都允许时,实际上只检测Sensor交互.
控制交互的两种方式:
- InteractionFilters
- 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.
举个例子:我们想表示三组对象之间的碰撞关系:
| 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的更多相关文章
- nape.dynamics.InteractionGroup
(转载http://tomyail.com/blog/1123) 说明: Filter只是Shape的属性,Nape为Interactor类提供了group属性,这个属性是一个InteractionG ...
- Nape 获取碰撞点加特效
package { import nape.phys.Body; import nape.shape.Shape; import nape.shape.Circle; import flash.dis ...
- Nape实现坐标旋转角度回弹
乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图: 要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1. 向量取反: var v:vec2 = new V ...
- Dynamics CRM 2015-超大Solution导入问题
我们在将比较大的solution导入CRM的时候,经常会遇到超时的问题,这是因为CRM的本身的优化限制导致的,那么如何解决呢? 官方已经有了解决方案了. 在浏览完两种解决方法之后,我们要知道的是: 1 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
- Step by step Dynamics CRM 2011升级到Dynamics CRM 2013
原创地址:http://www.cnblogs.com/jfzhu/p/4018153.html 转载请注明出处 (一)检查Customizations 从2011升级到2013有一些legacy f ...
- Step by Step 创建一个新的Dynamics CRM Organization
原创地址:http://www.cnblogs.com/jfzhu/p/4012833.html 转载请注明出处 前面演示过如何安装Dynamics CRM 2013,参见<Step by st ...
- Step by step Dynamics CRM 2013安装
原创地址:http://www.cnblogs.com/jfzhu/p/4008391.html 转载请注明出处 SQL Server可以与CRM装在同一台计算机上,也可安装在不同的计算机上.演示 ...
- Session for SSRS Report of Microsoft Dynamics AX
Session for SSRS Report of Microsoft Dynamics AX 版权声明:本文为博主原创文章,未经博主允许不得转载. Contract •A data contrac ...
随机推荐
- [转] Android自动测试之monkeyrunner工具(二)
monkeyrunner工具 前言: 最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框架.CTS.Monkey.Monkeyru ...
- Android反编译教程
本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...
- poj 1850 code(组合数学)
题目:http://poj.org/problem?id=1850 题意:按给定的规则给字母编号. 一个很简单的题目,但是却做了好久.................................. ...
- poj 1860 Currency Exchange (最短路bellman_ford思想找正权环 最长路)
感觉最短路好神奇呀,刚开始我都 没想到用最短路 题目:http://poj.org/problem?id=1860 题意:有多种从a到b的汇率,在你汇钱的过程中还需要支付手续费,那么你所得的钱是 mo ...
- [原]Unity3D深入浅出 - 认识开发环境中的Project面板
前面几个是用来创建脚步的,从Prefab说起: Prefab:预设物体,若一个Object在Scene中多处用到,即可选择为改对象创建一个Prefab.创建一个Prefab后,将源Object拖拽 ...
- UVa 12171 (离散化 floodfill) Sculpture
题意: 三维空间中有n个长方体组成的雕塑,求表面积和体积. 分析: 我们可以在最外边加一圈“空气”,然后求空气的连通块的体积,最后用总体积减去即是雕塑的体积. 还有一个很“严重”的问题就是5003所占 ...
- 银行爱“IOE”爱得有多深
本文由阿尔法工场欧阳长征推荐 导读:如果银行是一家海鲜酒楼,把IBM换掉相当于大搞一次装修,把Oracle换掉相当于把厨子和菜谱全部换掉,把EMC换掉相当于把放食材工具的储物间换个地方.难度在于,这海 ...
- 【Grunt】
GRUNT The JavaScript Task Runnerhttp://gruntjs.com/ Grunt打造前端自动化工作流http://tgideas.qq.com/webplat/inf ...
- hibernate注解影射表
@MappedSuperclass的用法 用在实体的继承过程中的父类上: 父类Cat package com.xj.model; import javax.persistence.GeneratedV ...
- 【转】Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 -- 不错
原文网址:http://tutuge.me/2015/03/11/Effective-Objective-C-%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-Item-4-% ...