2012-07-13 1 views
1

J'ai le code suivant dans Box2D, je veux déplacer mon corps dynamique au point où la souris est cliquée. Aussi dans le futur je veux être en mesure de supprimer le corps dynamique, je ne suis pas capable de trouver quelque chose d'équivalent à world.DeleteBody (...). S'il vous plaît aidez.Box2DWeb - Ajout et suppression de corps dans le monde

var world; 
var b2Vec2 = Box2D.Common.Math.b2Vec2 
     , b2BodyDef = Box2D.Dynamics.b2BodyDef 
     , b2Body = Box2D.Dynamics.b2Body 
     , b2FixtureDef = Box2D.Dynamics.b2FixtureDef 
     , b2Fixture = Box2D.Dynamics.b2Fixture 
     , b2World = Box2D.Dynamics.b2World 
     , b2MassData = Box2D.Collision.Shapes.b2MassData 
     , b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape 
     , b2CircleShape = Box2D.Collision.Shapes.b2CircleShape 
     , b2DebugDraw = Box2D.Dynamics.b2DebugDraw 
     ; 
var canvas = document.getElementById("canvas"); 
var context = canvas.getContext("2d"); 

var mouseX, mouseY, isMouseDown; 
var bBallBody, bBallbodyDef; 

function init() { 
    world = new b2World(
      new b2Vec2(0, 10) //gravity 
     , true     //allow sleep 
    ); 
    setupWorld() ; 
    //setup debug draw 
    var debugDraw = new b2DebugDraw(); 
     debugDraw.SetSprite(document.getElementById("canvas").getContext("2d")); 
     debugDraw.SetDrawScale(1.0); 
     debugDraw.SetFillAlpha(0.3); 
     debugDraw.SetLineThickness(1.0); 
     debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit); 

    world.SetDebugDraw(debugDraw); 
    window.setInterval(update, 1000/60); 
    }; 

    function setupWorld() { 
     setupGround(); 
     addBouncingBall(); 
    } 

    function setupGround() { 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 0.5; 
    fixDef.restitution = 0.2; 
    var bodyDef = new b2BodyDef; 
    //create ground 
    bodyDef.type = b2Body.b2_staticBody; 
    bodyDef.position.x = 300; 
    bodyDef.position.y = 400; 
    fixDef.shape = new b2PolygonShape; 
    fixDef.shape.SetAsBox(290, 10); 
    world.CreateBody(bodyDef).CreateFixture(fixDef); 
    } 

    function addBouncingBall() { 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 1.0; 
    fixDef.restitution = 0.1; 
    var bBallbodyDef = new b2BodyDef; 
    bBallbodyDef.type = b2Body.b2_dynamicBody; 
    fixDef.shape = new b2CircleShape(Math.random() + 30); 
    bBallbodyDef.position.x = Math.random() * 300; 
    bBallbodyDef.position.y = Math.random() * 300; 
    bBallBody = world.CreateBody(bBallbodyDef).CreateFixture(fixDef); 
    console.log(bBallBody.m_body.GetPosition().x); 

    }; 

    document.addEventListener("mousedown", handleMouseMove, true); 

    function handleMouseMove(e) { 
     isMouseDown = true; 
     mouseX = e.clientX; 
     mouseY = e.clientY; 
    }; 

    function update() { 

    if(isMouseDown) 
     { 
      for (b = world.GetBodyList() ; b; b = b.GetNext()) { 
       if (b.GetType() == b2Body.b2_dynamicBody) { 
        console.log(b.x, b.y); 
        b.x = 100; 
        b.y = 100; 
        } 
        } 
     isMouseDown = false; 
     } 
     world.Step(1/60, 10, 10); 
     world.DrawDebugData(); 
     world.ClearForces(); 
    }; 

Mise à jour:

Suppression d'un objet du monde se fait comme suit,

  1. Créer une minuterie pour Schdule amé la suppression de l'objet.

    window.setInterval(removeObjScheduledForRemoval, 1000/90); 
    
  2. Collectez les objets à supprimer dans un tableau.

    var bricksScheduledForRemoval = Array(); 
        var index = -1; 
        function removeObjScheduledForRemoval() 
        { 
        for(var i = 0; i <= index; i++){ 
        world.DestroyBody(bricksScheduledForRemoval[i]);  
        bricksScheduledForRemoval[i] = null;  
         } 
    bricksScheduledForRemoval = Array(); 
        index = -1; 
        } 
    

Le code complet est disponible ici, http://box2dinabox.blogspot.in/2012/07/the-completed-bananamonkey-game.html

+0

Salut merci, Box2DWeb manque sérieusement de documentation, je me suis cassé la tête dessus. Compris quelques-uns des flux de travail de base, ont blogué à ce sujet dans http://box2dinabox.blogspot.in/. J'espère que quelqu'un le trouvera utile :) – sri

Répondre

0

La documentation de box2dweb est loin d'être aussi complet que pour la version originale C, alors pensez à la recherche de « BOX2D » au lieu de "box2dweb". En outre, en regardant dans le source et en recherchant l'orthographe de certaines méthodes pourrait être utile. Ou regardez simplement dans la documentation flash box2d. Fondamentalement, box2dweb a les méthodes DestroyJoint et DestroyBody.

Pour plus de considérations, cela pourrait être utile: http://www.iforce2d.net/b2dtut/removing-bodies

+0

Salut merci, Box2DWeb manque sérieusement de documentation, je me suis cassé la tête dessus. Compris quelques-uns des flux de travail de base, ont blogué à ce sujet dans http://box2dinabox.blogspot.in/. espoir Quelqu'un le trouvera utile :) – sri

-2

Vous pouvez retirer le corps ou changer le corps statique dynamique cet exemple de jeu fait. http://pixsansar.com/box2dweb-jumping-and-puzzle-ball-level4

Box2dweb a l'option removebody ou changeBodyType, voir son code source.

+0

La page ci-dessus liée renvoie cette erreur: '' GET http://return.uk.domainnamesales.com/return_js.php?d=pixsansar.com&s=1393187553 net :: ERR_BLOCKED_BY_CLIENT'' – droidballoon

Questions connexes