Advertisement
sombriks

MouseManager.js

Nov 6th, 2012
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * helper to create dynamically the mousejoint
  3.  *
  4.  * usage:
  5.  *
  6.  * var _escala = 25;
  7.  * var world = new b2World(new b2Vec2(0, 0), true);
  8.  * var canvas = document.getElementById("c");
  9.  *
  10.  * //(...)
  11.  *
  12.  * var mm = new MouseManager({
  13.  *  world : world,
  14.  *  canvas : canvas,
  15.  *  scale : _escala
  16.  * });
  17.  *
  18.  * //(...)
  19.  *
  20.  * function update(){
  21.  *  world.Step(1 / 60, 10, 10);
  22.  *  world.DrawDebugData();
  23.  *  world.ClearForces();        
  24.  *  mm.step();
  25.  * }
  26.  *
  27.  * @param cfg.world
  28.  *            Box2D world
  29.  * @param cfg.canvas
  30.  *            DOM element to track mouse position
  31.  * @param cfg.scale
  32.  *            pixel to meters proportion used
  33.  *
  34.  */
  35. function MouseManager(cfg) {
  36.  
  37.     var mouseX = undefined;
  38.     var mouseY = undefined;
  39.     var mousePVec = undefined;
  40.     var isMouseDown = undefined;
  41.     var selectedBody = undefined;
  42.     var mouseJoint = undefined;
  43.     var canvasPosition = undefined;
  44.  
  45.     // http://js-tut.aardon.de/js-tut/tutorial/position.html
  46.     function getElementPosition(element) {
  47.         var elem = element, tagname = "", x = 0, y = 0;
  48.         while ((typeof (elem) == "object")
  49.                 && (typeof (elem.tagName) != "undefined")) {
  50.             y += elem.offsetTop;
  51.             x += elem.offsetLeft;
  52.             tagname = elem.tagName.toUpperCase();
  53.             if (tagname == "BODY")
  54.                 elem = 0;
  55.             if (typeof (elem) == "object") {
  56.                 if (typeof (elem.offsetParent) == "object")
  57.                     elem = elem.offsetParent;
  58.             }
  59.         }
  60.         return {
  61.             x : x,
  62.             y : y
  63.         };
  64.     }
  65.  
  66.     function handleMouseMove(e) {
  67.         mouseX = (e.clientX - canvasPosition.x) / cfg.scale;
  68.         mouseY = (e.clientY - canvasPosition.y) / cfg.scale;
  69.     }
  70.  
  71.     function getBodyAtMouse() {
  72.         mousePVec = new b2Vec2(mouseX, mouseY);
  73.         var aabb = new b2AABB();
  74.         aabb.lowerBound.Set(mouseX - 0.001, mouseY - 0.001);
  75.         aabb.upperBound.Set(mouseX + 0.001, mouseY + 0.001);
  76.         // Query the world for overlapping shapes.
  77.         selectedBody = null;
  78.         cfg.world.QueryAABB(getBodyCB, aabb);
  79.         return selectedBody;
  80.     }
  81.  
  82.     function getBodyCB(fixture) {
  83.         if (fixture.GetBody().GetType() != b2Body.b2_staticBody) {
  84.             if (fixture.GetShape().TestPoint(fixture.GetBody().GetTransform(),
  85.                     mousePVec)) {
  86.                 selectedBody = fixture.GetBody();
  87.                 return false;
  88.             }
  89.         }
  90.         return true;
  91.     }
  92.  
  93.     this.step = function() {
  94.         if (isMouseDown && (!mouseJoint)) {
  95.             var body = getBodyAtMouse();
  96.             if (body) {
  97.                 var md = new b2MouseJointDef();
  98.                 md.bodyA = world.GetGroundBody();
  99.                 md.bodyB = body;
  100.                 md.target.Set(mouseX, mouseY);
  101.                 md.collideConnected = true;
  102.                 md.maxForce = 300.0 * body.GetMass();
  103.                 mouseJoint = cfg.world.CreateJoint(md);
  104.                 body.SetAwake(true);
  105.             }
  106.         }
  107.         if (mouseJoint) {
  108.             if (isMouseDown) {
  109.                 mouseJoint.SetTarget(new b2Vec2(mouseX, mouseY));
  110.             } else {
  111.                 cfg.world.DestroyJoint(mouseJoint);
  112.                 mouseJoint = null;
  113.             }
  114.         }
  115.     };
  116.  
  117.     canvasPosition = getElementPosition(cfg.canvas);
  118.  
  119.     document.addEventListener("mousedown", function(e) {
  120.         isMouseDown = true;
  121.         handleMouseMove(e);
  122.         document.addEventListener("mousemove", handleMouseMove, true);
  123.     }, true);
  124.  
  125.     document.addEventListener("mouseup", function() {
  126.         document.removeEventListener("mousemove", handleMouseMove, true);
  127.         isMouseDown = false;
  128.         mouseX = undefined;
  129.         mouseY = undefined;
  130.     }, true);
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement