package { import Box2D.Collision.b2AABB; import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.b2World; import Box2D.Dynamics.b2BodyDef; import Box2D.Dynamics.b2Body; import Box2D.Dynamics.b2DebugDraw; import Box2D.Collision.Shapes.b2ShapeDef; import Box2D.Collision.Shapes.b2PolygonDef; import Box2D.Collision.Shapes.b2Shape; import flash.display.Sprite; import flash.geom.Rectangle; /** * ... * @author nutsu */ public class Box2DUtil { private static var _usePixelSize:Boolean = true; private static var _scale:Number = 100; private static var _scale_trans:Number = 1.0 / 100; public static function get usePixelSize():Boolean { return _usePixelSize; } public static function set usePixelSize(value:Boolean):void { _usePixelSize = value; _scale_trans = ( _usePixelSize ) ? 1.0 / _scale : 1.0; } public static function get scale():Number { return _scale; } public static function set scale(value:Number):void { _scale = value; _scale_trans = ( _usePixelSize ) ? 1.0 / _scale : 1.0; } //---------------------------------------------------------------------------------- DEF private static function defShape( ps:b2ShapeDef, density:Number=0, restitution:Number=0, friction:Number=0.2 ):b2ShapeDef { ps.density = density; ps.restitution = restitution; ps.friction = friction; return ps; } public static function defBox( hx:Number, hy:Number, density:Number=0, restitution:Number=0, friction:Number=0.2 ):b2ShapeDef { var ps:b2PolygonDef = new b2PolygonDef(); ps.SetAsBox( hx*_scale_trans, hy*_scale_trans ); return defShape( ps, density, restitution, friction); } public static function defBody( x:Number, y:Number ):b2BodyDef { var b:b2BodyDef = new b2BodyDef(); b.position.Set( x*_scale_trans, y*_scale_trans ); return b; } //---------------------------------------------------------------------------------- TEMPLATE public static function buildWall( world:b2World, rect:Rectangle, size:Number = 10, left:Boolean=true, top:Boolean=true, right:Boolean=true, bottom:Boolean=true ):void { var wall_size:Number = 0.5*size; var half_width :Number = rect.width * 0.5; var half_height:Number = rect.height * 0.5; var zero_x :Number = rect.x; var zero_y :Number = rect.y; var center_x :Number = zero_x + half_width; var center_y :Number = zero_y + half_height; //ShapeなDef(形状決め) var wall_h_shape:b2ShapeDef = defBox( wall_size, half_height ); var wall_v_shape:b2ShapeDef = defBox( half_width, wall_size ); //BodyなDef(位置決め) var wall_left:b2BodyDef = defBody( zero_x, center_y ); var wall_right:b2BodyDef = defBody( zero_x + half_width*2, center_y ); var wall_bottom:b2BodyDef = defBody( center_x, zero_y + half_height*2 ); var wall_top:b2BodyDef = defBody( center_x, zero_y ); //world if( left ) world.CreateBody( wall_left ).CreateShape( wall_h_shape ); if( right ) world.CreateBody( wall_right ).CreateShape( wall_h_shape ); if( bottom ) world.CreateBody( wall_bottom ).CreateShape( wall_v_shape ); if( top ) world.CreateBody( wall_top ).CreateShape( wall_v_shape ); } //---------------------------------------------------------------------------------- WORLD public static function mkWorld( gx:Number=0, gy:Number=9.8, sleep:Boolean=true, left:Number = -1000, top:Number = -1000, right:Number = 1000, bottom:Number = 1000 ):b2World { //物理計算エリア var aabb:b2AABB = new b2AABB(); aabb.lowerBound.Set( left, top ); aabb.upperBound.Set( right, bottom ); //重加速度 var gravity:b2Vec2 = new b2Vec2( gx, gy ); //力が作用してないオブジェクトをスリープするか否か。 var dosleep:Boolean = sleep; return new b2World( aabb, gravity, dosleep ); } //---------------------------------------------------------------------------------- DEBUG public static function setDebugDraw( targetSprite:Sprite, world:b2World, alpha:Number=0.5 ):void { var debug_draw:b2DebugDraw = new b2DebugDraw(); debug_draw.m_sprite = targetSprite; debug_draw.m_drawScale = _scale; debug_draw.m_fillAlpha = alpha; debug_draw.m_lineThickness = 0; debug_draw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit; world.SetDebugDraw( debug_draw ); } } }