/src/couk/psyked/box2d/utils/Box2DPointUtils.as

https://bitbucket.org/astrism/simple-box2d
ActionScript | 98 lines | 84 code | 11 blank | 3 comment | 10 complexity | 63fbb21b938de29c05880d6117b93d31 MD5 | raw file
  1. package couk.psyked.box2d.utils
  2. {
  3. import Box2D.Collision.Shapes.b2Shape;
  4. import Box2D.Collision.b2AABB;
  5. import Box2D.Common.Math.b2Vec2;
  6. import Box2D.Common.Math.b2XForm;
  7. import Box2D.Dynamics.b2Body;
  8. import Box2D.Dynamics.b2World;
  9. import flash.display.Sprite;
  10. import flash.geom.Point;
  11. public class Box2DPointUtils
  12. {
  13. private static var accuracy:Number = 0.1; //0.001;
  14. private static var k_maxCount:int = 100; //10;
  15. private static var m_physScale:Number;
  16. private static var m_sprite:Sprite;
  17. private static var m_world:b2World;
  18. private static var mousePVec:b2Vec2 = new b2Vec2();
  19. public static function getAllBodiesAtPoint( point:Point, includeStatic:Boolean = false ):Array
  20. {
  21. //trace( "Getting all bodies at", point.x, ",", point.y );
  22. var mousePVec:b2Vec2 = new b2Vec2();
  23. var real_x_mouse:Number;
  24. var real_y_mouse:Number;
  25. real_x_mouse = ( point.x ) / m_physScale;
  26. real_y_mouse = ( point.y ) / m_physScale;
  27. mousePVec.Set( real_x_mouse, real_y_mouse );
  28. var aabb:b2AABB = new b2AABB();
  29. aabb.lowerBound.Set( real_x_mouse - accuracy, real_y_mouse - accuracy );
  30. aabb.upperBound.Set( real_x_mouse + accuracy, real_y_mouse + accuracy );
  31. var shapes:Array = new Array();
  32. var count:int = m_world.Query( aabb, shapes, k_maxCount );
  33. var bodies:Array = new Array();
  34. for ( var i:int = 0; i < count; ++i )
  35. {
  36. if ( shapes[ i ].GetBody().IsStatic() == false || includeStatic )
  37. {
  38. var tShape:b2Shape = shapes[ i ] as b2Shape;
  39. //trace(tShape, tShape.GetBody().GetXForm());
  40. var a:b2XForm = tShape.GetBody().GetXForm();
  41. var inside:Boolean = tShape.TestPoint( tShape.GetBody().GetXForm(), mousePVec );
  42. if ( inside )
  43. {
  44. bodies.push( tShape.GetBody());
  45. // break;
  46. }
  47. }
  48. }
  49. return bodies;
  50. }
  51. public static function getTopBodyAtPoint( point:Point, includeStatic:Boolean = false ):b2Body
  52. {
  53. var mousePVec:b2Vec2 = new b2Vec2();
  54. var real_x_mouse:Number;
  55. var real_y_mouse:Number;
  56. real_x_mouse = ( point.x ) / m_physScale;
  57. real_y_mouse = ( point.y ) / m_physScale;
  58. mousePVec.Set( real_x_mouse, real_y_mouse );
  59. var aabb:b2AABB = new b2AABB();
  60. aabb.lowerBound.Set( real_x_mouse - accuracy, real_y_mouse - accuracy );
  61. aabb.upperBound.Set( real_x_mouse + accuracy, real_y_mouse + accuracy );
  62. var shapes:Array = new Array();
  63. var count:int = m_world.Query( aabb, shapes, k_maxCount );
  64. var body:b2Body = null;
  65. for ( var i:int = 0; i < count; ++i )
  66. {
  67. if ( shapes[ i ].GetBody().IsStatic() == false || includeStatic )
  68. {
  69. var tShape:b2Shape = shapes[ i ] as b2Shape;
  70. var inside:Boolean = tShape.TestPoint( tShape.GetBody().GetXForm(), mousePVec );
  71. if ( inside )
  72. {
  73. body = tShape.GetBody();
  74. break;
  75. }
  76. }
  77. }
  78. return body;
  79. }
  80. public static function initialise( _m_world:b2World, _m_physScale:Number, _m_sprite:Sprite ):void
  81. {
  82. m_world = _m_world;
  83. m_physScale = _m_physScale;
  84. m_sprite = _m_sprite;
  85. }
  86. }
  87. }