سؤال

i'm learning box2dweb with html5, and i'm trying to use applyforce to objects when the circle and square almost near the ground, how to do that?

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>test</title>


<script type="text/javascript" src="box2d/Box2dWeb-2.1.a.3.min.js"></script>

   <script type="text/javascript">
      var world;

      function init() {
         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
            ;



         world = new b2World(
               new b2Vec2(0, 10)    //gravity
            ,  true                 //allow sleep
         );

         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 = 9;
         bodyDef.position.y = 13;
         fixDef.shape = new b2PolygonShape;
         fixDef.shape.SetAsBox(10, 0.5);
         world.CreateBody(bodyDef).CreateFixture(fixDef);

         //create some objects
         bodyDef.type = b2Body.b2_dynamicBody;
         for(var i = 0; i < 10; ++i) {
            if(Math.random() > 0.5) {
               fixDef.shape = new b2PolygonShape;
               fixDef.shape.SetAsBox(
                     Math.random() + 0.1 //half width
                  ,  Math.random() + 0.1 //half height
               );
            } else {
               fixDef.shape = new b2CircleShape(
                  Math.random() + 0.1 //radius
               );
            }
            bodyDef.position.x = Math.random() * 10;
            bodyDef.position.y = Math.random() * 30;
        var direction = new b2Vec2(-5,0);
    world.ApplyForce( direction , world.GetPosition() );
            world.CreateBody(bodyDef).CreateFixture(fixDef);
         }


         //setup debug draw
         var debugDraw = new b2DebugDraw();
            debugDraw.SetSprite(document.getElementById("canvas").getContext("2d"));
            debugDraw.SetDrawScale(30.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 update() {
         world.Step(
               1 / 60   //frame-rate
            ,  10       //velocity iterations
            ,  10       //position iterations
         );
         world.DrawDebugData();
         world.ClearForces();
      };

   </script>

</head>

   <body onLoad="init();">
      <canvas id="canvas" width="600" height="400"></canvas>
   </body>
</html>

the above code is the example from official web, i've added

var direction = new b2Vec2(-5,0);
world.ApplyForce( direction , world.GetPosition() ); 

there is an error

Uncaught TypeError: Object # has no method 'GetPosition'

هل كانت مفيدة؟

المحلول

You apply forces to bodies, not to the world, so the first thing you need is a reference to the body itself. Try this.-

var body = world.CreateBody(bodyDef);
body.CreateFixture(fixDef);
body.ApplyForce(direction, body.GetWorldCenter());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top