物理エンジン 練習その1

今回は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);
	}
}