forked from: forked from: [Stardust] + [Box2D]

by marcsali forked from forked from: [Stardust] + [Box2D] (diff: 265)
♥0 | Line 59 | Modified 2013-02-11 01:47:13 | MIT License
play

ActionScript3 source code

/**
 * Copyright marcsali ( http://wonderfl.net/user/marcsali )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/2Y0e
 */

 package { 
    import Box2D.Collision.b2AABB;
    import Box2D.Collision.Shapes.b2PolygonDef;
    import Box2D.Collision.Shapes.*;
    import Box2D.Common.Math.b2Vec2; 
    import Box2D.Dynamics.*;
    import Box2D.Dynamics.b2Body;
    import Box2D.Dynamics.b2BodyDef;
    import Box2D.Dynamics.b2DebugDraw;
    import Box2D.Dynamics.b2World;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
 
  public class Main extends Sprite {
    /**
     * 床の上に箱を落とすFlash
     */
 private var world:b2World;
 private var worldScale:Number=30; 
 private var boxBody:b2Body; 
    
  public function Main() {
      var gravity:b2Vec2=new b2Vec2(0,9.81);
      var sleep:Boolean=true; 
      var bodyDef:b2BodyDef=new b2BodyDef();
      var circleShape:b2CircleShape; 
      
      
       stage.addEventListener(MouseEvent.CLICK, clickHandler);                
            ////////////////////////////////////////
            // 物理エンジンのセットアップ
            
            // 外枠を定義する
           // 重力を下方向に10m/s^2とする
                
            // Set the world boundaries:
      var worldAABB:b2AABB = new b2AABB();
      worldAABB.lowerBound.Set(-100, -100);
      worldAABB.upperBound.Set(100, 100);

            
            // 外枠と重力を指定して、物理エンジン全体をセットアップする
      
       world = new b2World(worldAABB, gravity,  sleep);
       bodyDef.position.Set(320/worldScale,30/worldScale); 
       
             
      // Create a body for the floor:
      var floorBodyDef:b2BodyDef = new b2BodyDef();
      floorBodyDef.position.Set(2.5, 4.5); 
      var floorBody:b2Body = world.CreateBody(floorBodyDef);
      
      // Create a shape for the floor:
      var floorShapeDef: b2PolygonDef = new b2PolygonDef();
      floorShapeDef.SetAsBox(2, 0.1);
      floorBody.CreateShape(floorShapeDef);
      
      // Create a body for the box:
      var boxBodyDef:b2BodyDef = new b2BodyDef();
      boxBodyDef.position.Set(3, 2);
 
      boxBody = world.CreateBody(boxBodyDef);
      
      // Create a shape for the box:
      var boxShapeDef: b2PolygonDef= new b2PolygonDef();
      boxShapeDef.SetAsOrientedBox(0.3, 0.2, new b2Vec2(0, 0), 0.8);
     // boxShapeDef.restitution = 0.4;
      
      // Make sure that the box has mass, so that it will be dynamic:
      boxShapeDef.density = 2;
      boxBody.CreateShape(boxShapeDef);
      boxBody.SetMassFromShapes();
      
      // Use Box2D's internal rendering engine to display the simulation for now.
      var debugDraw: b2DebugDraw = new b2DebugDraw();
      debugDraw.m_sprite = this; // = an empty container on the display list
      debugDraw.m_drawScale = 100; // 100 pixels per meter
      debugDraw.m_drawFlags = b2DebugDraw.e_shapeBit; // draw shapes
      world.SetDebugDraw(debugDraw);

      
      addEventListener(Event.ENTER_FRAME, enterFrameHandler);
      
    }
     
      private function clickHandler(event:Event):void { 
      boxBody.ApplyImpulse(new b2Vec2(0,-3), boxBody.GetWorldCenter());
    } 
 
     private function enterFrameHandler(e:Event):void {
     var timeStep:Number = 1/30;
     var velIterations:int = 10;
     world.Step(timeStep, velIterations);    
    }
  }  
}