Box2Dサンプル maskBitsによる衝突フィルタリング
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)
package { import Box2D.Collision.Shapes.b2BoxDef; import Box2D.Collision.Shapes.b2CircleDef; import Box2D.Collision.Shapes.b2PolyDef; import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2World; import flash.text.TextField; import flash.text.TextFieldAutoSize; [SWF(width='500', height='500')] /** * ... * @author Default */ public class HandleCollision extends Box2DASDemoBase { public function HandleCollision() { super(); showDebug = true; var tf:TextField = new TextField(); tf.text = "Spaceキーでスタート・ストップします\n円は円・三角・四角と衝突\n三角は円と衝突\n四角は円と四角と衝突します。"; tf.autoSize = TextFieldAutoSize.LEFT; tf.x = 10; tf.y = 15; addChild(tf); } override protected function setupBodies(world:b2World):void { makeWall(world); var circle:b2CircleDef = new b2CircleDef(); circle.radius = 10; circle.density = 1; circle.friction = 0; circle.restitution = 1.0; circle.categoryBits = 0x0001; circle.maskBits = 0x0007; var bodyDef:b2BodyDef = new b2BodyDef(); var body:b2Body; bodyDef.AddShape(circle); for (var i:int = 0; i < 20; i++) { bodyDef.position.Set( 500 * Math.random(), 500 * Math.random()); body = world.CreateBody(bodyDef); body.ApplyForce(new b2Vec2(Math.random() * 1000000, Math.random() * 1000000), body.GetCenterPosition()); } bodyDef = new b2BodyDef(); var tri:b2PolyDef = new b2PolyDef(); tri.restitution = 1.0; tri.friction = 0; tri.density = 1; tri.vertexCount = 3; tri.categoryBits = 0x0002; tri.maskBits = 0x0001; var sqr3:Number = Math.sqrt(3); tri.vertices[0].Set( 0, -12); tri.vertices[1].Set( 6 * sqr3, 6); tri.vertices[2].Set(-6 * sqr3, 6); bodyDef.AddShape(tri); for (i = 0; i < 10; i++) { bodyDef.position.Set( 500 * Math.random(), 500 * Math.random()); bodyDef.rotation = Math.random() * Math.PI; body = world.CreateBody(bodyDef); body.ApplyForce(new b2Vec2(Math.random() * 1000000, Math.random() * 1000000), body.GetCenterPosition()); } var boxDef:b2BoxDef = new b2BoxDef(); boxDef.extents.Set(10, 10); boxDef.density = 1; boxDef.restitution = 1; boxDef.friction = 0; boxDef.categoryBits = 0x0004; boxDef.maskBits = 0x0005; bodyDef = new b2BodyDef(); bodyDef.AddShape(boxDef); for (i = 0; i < 10; i++) { bodyDef.position.Set(500 * Math.random(), 500 * Math.random()); bodyDef.rotation = Math.random() * Math.PI; world.CreateBody(bodyDef); } } private function makeWall( world:b2World ):void { var boxDef:b2BoxDef; var bodyDef:b2BodyDef; boxDef = new b2BoxDef(); bodyDef = new b2BodyDef(); boxDef.restitution = 1; boxDef.friction = 0; boxDef.categoryBits = 0x00F; boxDef.maskBits = 0x0007; //stage width and height var sw:Number = 500; var sh:Number = 500; //wall width and height; var w:Number = 500; var h:Number = 100; //top boxDef.extents.Set(w*0.5, h*0.5); bodyDef.AddShape(boxDef); bodyDef.position.Set(w * 0.5, - h * 0.5); world.CreateBody(bodyDef); //bottom bodyDef.position.Set(w * 0.5, sh + h * 0.5); world.CreateBody(bodyDef); //left boxDef.extents.Set(h * 0.5, w * 0.5 + h); bodyDef.AddShape(boxDef); bodyDef.position.Set( - h * 0.5, sh * 0.5); world.CreateBody(bodyDef); //right bodyDef.position.Set(sw + h * 0.5, sh * 0.5); world.CreateBody(bodyDef); } } }
| Print article | This entry was posted by motoki on 5月 21, 2008 at 11:31 pm, and is filed under ActionScript, Box2D, Flash. Follow any responses to this post through RSS 2.0. You can leave a response or trackback from your own site. |
