Box2DでのmaskBitsによる衝突フィルタリングのサンプルです。
衝突フィルタリングはgroupIndexによるものと、ShapeクラスのcategoryBits/maskBitsによるものの2通りの方法があり、このサンプルはcategoryBits/maskBitsによるものです。
body同士が重なった時に一方のcategoryBitsともう一方のmaskBitsの論理積(AND)が0でなかった場合に衝突を処理します。
例えば、categoryBitsが0x01と0x08との両方と衝突するようなmaskBitsは(0x09)となる。
0000 0000 0000 0001 (categoryBits = 0x01)
0000 0000 0000 1000 (categoryBits = 0x08)
0000 0000 0000 1001 (maskBits = 0x09)

 

  1. package {
  2. import Box2D.Collision.Shapes.b2BoxDef;
  3. import Box2D.Collision.Shapes.b2CircleDef;
  4. import Box2D.Collision.Shapes.b2PolyDef;
  5. import Box2D.Common.Math.b2Vec2;
  6. import Box2D.Dynamics.b2Body;
  7. import Box2D.Dynamics.b2BodyDef;
  8. import Box2D.Dynamics.b2World;
  9. import flash.text.TextField;
  10. import flash.text.TextFieldAutoSize;
  11. [SWF(width='500', height='500')]
  12. /**
  13. * ...
  14. * @author Default
  15. */
  16. public class HandleCollision extends Box2DASDemoBase {
  17. public function HandleCollision() {
  18. super();
  19. showDebug = true;
  20. var tf:TextField = new TextField();
  21. tf.text = "Spaceキーでスタート・ストップします\n円は円・三角・四角と衝突\n三角は円と衝突\n四角は円と四角と衝突します。";
  22. tf.autoSize = TextFieldAutoSize.LEFT;
  23. tf.x = 10;
  24. tf.y = 15;
  25.  
  26. addChild(tf);
  27. }
  28.  
  29. override protected function setupBodies(world:b2World):void {
  30. makeWall(world);
  31.  
  32. var circle:b2CircleDef = new b2CircleDef();
  33. circle.radius = 10;
  34. circle.density = 1;
  35. circle.friction = 0;
  36. circle.restitution = 1.0;
  37. circle.categoryBits = 0x0001;
  38. circle.maskBits = 0x0007;
  39. var bodyDef:b2BodyDef = new b2BodyDef();
  40. var body:b2Body;
  41. bodyDef.AddShape(circle);
  42. for (var i:int = 0; i < 20; i++) {
  43. bodyDef.position.Set( 500 * Math.random(), 500 * Math.random());
  44.  
  45. body = world.CreateBody(bodyDef);
  46. body.ApplyForce(new b2Vec2(Math.random() * 1000000, Math.random() * 1000000), body.GetCenterPosition());
  47. }
  48.  
  49. bodyDef = new b2BodyDef();
  50. var tri:b2PolyDef = new b2PolyDef();
  51. tri.restitution = 1.0;
  52. tri.friction = 0;
  53. tri.density = 1;
  54. tri.vertexCount = 3;
  55. tri.categoryBits = 0x0002;
  56. tri.maskBits = 0x0001;
  57.  
  58. var sqr3:Number = Math.sqrt(3);
  59. tri.vertices[0].Set( 0, -12);
  60. tri.vertices[1].Set( 6 * sqr3, 6);
  61. tri.vertices[2].Set(-6 * sqr3, 6);
  62.  
  63. bodyDef.AddShape(tri);
  64. for (i = 0; i < 10; i++) {
  65. bodyDef.position.Set( 500 * Math.random(), 500 * Math.random());
  66. bodyDef.rotation = Math.random() * Math.PI;
  67.  
  68. body = world.CreateBody(bodyDef);
  69. body.ApplyForce(new b2Vec2(Math.random() * 1000000, Math.random() * 1000000), body.GetCenterPosition());
  70. }
  71.  
  72. var boxDef:b2BoxDef = new b2BoxDef();
  73. boxDef.extents.Set(10, 10);
  74. boxDef.density = 1;
  75. boxDef.restitution = 1;
  76. boxDef.friction = 0;
  77. boxDef.categoryBits = 0x0004;
  78. boxDef.maskBits = 0x0005;
  79. bodyDef = new b2BodyDef();
  80. bodyDef.AddShape(boxDef);
  81.  
  82. for (i = 0; i < 10; i++) {
  83. bodyDef.position.Set(500 * Math.random(), 500 * Math.random());
  84. bodyDef.rotation = Math.random() * Math.PI;
  85. world.CreateBody(bodyDef);
  86. }
  87.  
  88. }
  89. private function makeWall( world:b2World ):void {
  90. var boxDef:b2BoxDef;
  91. var bodyDef:b2BodyDef;
  92. boxDef = new b2BoxDef();
  93. bodyDef = new b2BodyDef();
  94.  
  95. boxDef.restitution = 1;
  96. boxDef.friction = 0;
  97. boxDef.categoryBits = 0x00F;
  98. boxDef.maskBits = 0x0007;
  99. //stage width and height
  100. var sw:Number = 500;
  101. var sh:Number = 500;
  102.  
  103. //wall width and height;
  104. var w:Number = 500;
  105. var h:Number = 100;
  106.  
  107. //top
  108. boxDef.extents.Set(w*0.5, h*0.5);
  109. bodyDef.AddShape(boxDef);
  110. bodyDef.position.Set(w * 0.5, - h * 0.5);
  111. world.CreateBody(bodyDef);
  112.  
  113. //bottom
  114. bodyDef.position.Set(w * 0.5, sh + h * 0.5);
  115. world.CreateBody(bodyDef);
  116.  
  117. //left
  118. boxDef.extents.Set(h * 0.5, w * 0.5 + h);
  119. bodyDef.AddShape(boxDef);
  120. bodyDef.position.Set( - h * 0.5, sh * 0.5);
  121. world.CreateBody(bodyDef);
  122.  
  123. //right
  124. bodyDef.position.Set(sw + h * 0.5, sh * 0.5);
  125. world.CreateBody(bodyDef);
  126. }
  127. }
  128. }