今回はBox2Dを勉強します。
明日から旅行なので作成途中ですけど一応書きます。(また拡張するつもりです)
こんな感じ
http://about-hiroppy.com/flash/work2.swf
package { import flash.display.Sprite; import flash.events.Event; import flash.filters.GlowFilter; import flash.net.drm.AddToDeviceGroupSetting; import Box2D.Collision.Shapes.b2CircleShape; import Box2D.Collision.Shapes.b2PolygonShape; import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2DebugDraw; import Box2D.Dynamics.b2Fixture; import Box2D.Dynamics.b2FixtureDef; import Box2D.Dynamics.b2World; import Box2D.Dynamics.Joints.b2RevoluteJointDef; [SWF(width="500",height="500",backgroundColor="0")] public class work2 extends Sprite { public static var world:b2World; private var gravity:b2Vec2 = new b2Vec2(0,9.8); private var circles:Vector.<Circle> = new Vector.<Circle>; private var N:int = 50; private var box:b2PolygonShape = new b2PolygonShape(); public function work2() { world = new b2World(gravity,true); wall(stage.stageWidth/(2*30),5,1,0.2); var fixtureDef:b2FixtureDef = new b2FixtureDef(); var bodyDef:b2BodyDef = new b2BodyDef(); fixtureDef.density = 0.4; fixtureDef.friction = 0.4; fixtureDef.restitution = 0.3; for (var i:int = 1; i <= 5; i++) { bodyDef.type = b2Body.b2_staticBody; box.SetAsBox((20*i)/30,10/30); fixtureDef.shape = box; bodyDef.position.Set((20*i)/30,(350 + 20*i)/30); bodyDef.userData = new Sprite(); bodyDef.userData.graphics.lineStyle(3,0x00ffff); bodyDef.userData.graphics.beginFill(0x00ffff); bodyDef.userData.graphics.drawRect(-20*i,-10,20*i*2,(350+20*i)*2); bodyDef.userData.graphics.endFill(); addChild(bodyDef.userData); var body:b2Body = world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); } for (i = 1; i <= 5; i++){ box = new b2PolygonShape(); box.SetAsBox((20 *i)/30,10/30); fixtureDef.shape = box; bodyDef.position.Set((stage.stageWidth-20*i)/30,(350 + 20*i)/30); bodyDef.userData = new Sprite(); bodyDef.userData.graphics.lineStyle(3,0x00ffff); bodyDef.userData.graphics.beginFill(0x00ffff); bodyDef.userData.graphics.drawRect(-20*i,-10,20*i*2,(350+20*i)*2); bodyDef.userData.graphics.endFill(); addChild(bodyDef.userData); body = world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); } while(N--){ var c:Circle = new Circle(Math.random()*stage.stageWidth,Math.random()*150-50,Math.random()*10+5,Math.random()*0xffffff); addChild(c); circles.push(c); } addEventListener(Event.ENTER_FRAME,onEnterFrame); // world.SetContactListener(new ContactListener()); } private function onEnterFrame(e:Event):void{ for(var body:b2Body = world.GetBodyList(); body != null; body = body.GetNext()){ if(body.GetUserData() != null && body.GetUserData() != undefined){ body.GetUserData().x = body.GetPosition().x*30; body.GetUserData().y = body.GetPosition().y*30; if(body.GetUserData().y > 600) body.SetPosition(new b2Vec2(body.GetPosition().x, 0)); if(body.GetUserData().x < -100) body.SetPosition(new b2Vec2(stage.stageWidth/30,body.GetPosition().y)); if(body.GetUserData().x > 600) body.SetPosition(new b2Vec2(0,body.GetPosition().y)); } } world.Step(1/30, 10 ,20); world.ClearForces(); world.DrawDebugData(); } private function wall(position_x:Number,position_y:Number,box_x:Number,box_y:Number):void{ var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set(position_x, position_y); var boxShape:b2PolygonShape = new b2PolygonShape(); boxShape.SetAsBox(box_x,box_y); var fixtureDef:b2FixtureDef = new b2FixtureDef(); fixtureDef.shape = boxShape; fixtureDef.friction = 0.3; fixtureDef.density = 0; fixtureDef.restitution = 0; bodyDef.userData = new Sprite(); bodyDef.userData.graphics.lineStyle(3,0x00ffff); bodyDef.userData.graphics.drawRect(-30,-5,box_x*60,box_y*60); addChild(bodyDef.userData); var body:b2Body = world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); var ground:b2Body = world.GetGroundBody();//goundの設定 //RevoluteJoint var jointDef:b2RevoluteJointDef = new b2RevoluteJointDef(); jointDef.Initialize(body, ground, body.GetWorldCenter()); world.CreateJoint(jointDef); } public function effect(ob:Sprite):void{ for(var i:Number = 0;i < 3;i++){ } } } } import flash.display.BlendMode; import flash.display.Sprite; import flash.filters.BevelFilter; import flash.filters.GlowFilter; import Box2D.Collision.b2ContactPoint; import Box2D.Collision.Shapes.b2CircleShape; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2ContactListener; import Box2D.Dynamics.b2FixtureDef; import Box2D.Dynamics.b2World; import Box2D.Dynamics.Contacts.b2Contact; class Circle extends Sprite{ private var bodyDef:b2BodyDef = new b2BodyDef(); private var body:b2Body; private var fixtureDef:b2FixtureDef = new b2FixtureDef(); private var circleDef:b2CircleShape = new b2CircleShape(); public function Circle(position_x:Number,position_y:Number,r:Number,color:uint):void{ fixtureDef.density = 1; fixtureDef.friction = 0.4; fixtureDef.restitution = 0.7; circleDef.SetRadius(r/30); fixtureDef.shape = circleDef; bodyDef.position.Set(position_x/30,position_y/30); bodyDef.type = b2Body.b2_dynamicBody; bodyDef.userData = new Sprite(); bodyDef.userData.graphics.lineStyle(3,0xffffff); bodyDef.userData.graphics.drawCircle(0,0,r); filters = [new GlowFilter(color,1,18,18,6,2)]; blendMode = BlendMode.ADD; addChild(bodyDef.userData); var body:b2Body = work2.world.CreateBody(bodyDef); body.CreateFixture(fixtureDef); } }