box2d的碰撞控制FilterData
来源:互联网 发布:小米手机如何连mac 编辑:程序博客网 时间:2024/04/30 01:36
/*
FilterData
补漏:
filterData.categoryBits指自己所属的碰撞种类
filterData.maskBits指与其碰撞的种类
注意 filterData.categoryBits 的值必须是2的倍数
假如有两个body 他们的 filterData.categoryBits分别为2,4
则另一个body要想与他们两个都发生碰撞 则其filterData.maskBits应该为: 2+4= 6;
对于filterData.groupIndex 属性:
当其为负值时,表示该组的对象不发生碰撞
为正值则表示该组的对象发生碰撞
另外 要使两个对象不发生碰撞,则: groupIndex 属性必须为负, 并且groupIndex 的值一样,这样才能不发生碰撞 其他情况都会发生碰撞(即两个不相同的负值的body也会发生碰撞)
由上述可知:控制body是否发生碰撞有两种方法:
法1: 用filterData.categoryBits(自己所属的碰撞种类)和filterData.maskBits(指定碰撞种类)
法2:直接使用filterData.groupIndex即可
当上述两种情况都使用的话,则由filterData.groupIndex决定 因为filterData.groupIndex的优先级高些 。
*/
package {
import flash.display.Sprite;
import flash.events.Event;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
public class bound extends Sprite {
var body:b2Body;
public var m_world:b2World;
public var m_iterations:int=10;
public var m_timeStep:Number=1.0/30.0;
var m_boundaryListener=new b2BoundaryListener();
var bodyDef:b2BodyDef;
var boxDef:b2PolygonDef;
var circleDef:b2CircleDef;
public function bound() {
addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
var worldAABB:b2AABB = new b2AABB();
worldAABB.lowerBound.Set(-100.0, -100.0);
worldAABB.upperBound.Set(100.0, 100.0);
var gravity:b2Vec2=new b2Vec2(0.0,10.0);
var doSleep:Boolean=true;
m_world=new b2World(worldAABB,gravity,doSleep);
m_world.SetBoundaryListener(m_boundaryListener);
// debug draw start
var m_sprite:Sprite;
m_sprite = new Sprite();
addChild(m_sprite);
var dbgDraw:b2DebugDraw = new b2DebugDraw();
var dbgSprite:Sprite = new Sprite();
m_sprite.addChild(dbgSprite);
dbgDraw.m_sprite=m_sprite;
dbgDraw.m_drawScale=30;
dbgDraw.m_alpha=1;
dbgDraw.m_fillAlpha=0.5;
dbgDraw.m_lineThickness=1;
dbgDraw.m_drawFlags=b2DebugDraw.e_shapeBit;
m_world.SetDebugDraw(dbgDraw);
// ground
bodyDef = new b2BodyDef();
bodyDef.position.Set(4, 12);
boxDef = new b2PolygonDef();
boxDef.filter.categoryBits=2;
boxDef.filter.groupIndex =2
boxDef.SetAsOrientedBox(10, 1,new b2Vec2(5, 1.5), Math.PI/32);
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
// another object
bodyDef = new b2BodyDef();
bodyDef.position.Set(8, 12);
boxDef = new b2PolygonDef();
boxDef.filter.categoryBits=4;
boxDef.filter.groupIndex =-3;
boxDef.SetAsBox(1, 3);
boxDef.friction=0.3;
boxDef.density=0;
body=m_world.CreateBody(bodyDef);
body.CreateShape(boxDef);
body.SetMassFromShapes();
// circle
create_circle();
}
public function create_circle() {
bodyDef = new b2BodyDef();
bodyDef.position.x=6;
bodyDef.position.y=2;
circleDef = new b2CircleDef();
// circleDef.filter.maskBits=Math.ceil(Math.random()*3)*2;
circleDef.filter.groupIndex =-3;
circleDef.radius=2;
circleDef.density=1.0;
circleDef.friction=0.5;
circleDef.restitution=0.2;
body=m_world.CreateBody(bodyDef);
body.CreateShape(circleDef);
body.SetMassFromShapes();
}
public function Update(e:Event):void {
m_world.Step(m_timeStep, m_iterations);
//if (m_boundaryListener.get_contact()) {
// m_boundaryListener.no_contact();
// m_world.DestroyBody(body);
// bodyDef = new b2BodyDef();
// create_circle();
// }
}
}
}
- box2d的碰撞控制FilterData
- Box2d的碰撞筛选
- box2d碰撞的一些细节
- Box2D的Edge Shape的碰撞处理
- Box2D 射线和AABB的碰撞检测
- Box2d碰撞粘滞的问题(java)
- Box2d 物体互相碰撞的条件
- &运算(关于box2d的碰撞过滤)
- box2d碰撞规则说明
- box2d 碰撞筛选
- Box2D 碰撞过滤规则
- box2d 碰撞过滤
- box2d碰撞过滤
- Box2d碰撞筛选
- Box2dの碰撞筛选
- box2d碰撞设定顶点
- Box2dの碰撞筛选
- box2d 获得碰撞冲量
- 调用存储过程方法 (asp.net C#)
- 聚冠因尚仓储管理系统(转载)
- 初到大学的感想
- 基于OHCI的USB主机 —— 寄存器(复位)
- 细数Android平台5大不足
- box2d的碰撞控制FilterData
- ABAP 字符与ASCII互转
- 阿里软件API
- 基于OHCI的USB主机 —— 寄存器(设备连接)
- 基于OHCI的USB主机 —— 寄存器(其它)
- 各取所需,VMware的三种网络模式设置
- DB2数据库全量备份1
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(2): 关于子表达式
- C#网站Menu不能展开