Rope physics - poor performance, any suggestions please?

Post about the Flash World Construction Kit and the Alchemy port of Box2D.
pluginpizzaman
Posts: 9
Joined: Wed Jun 16, 2010 6:52 am

Rope physics - poor performance, any suggestions please?

Postby pluginpizzaman » Mon Aug 12, 2013 1:59 am

Hi All - based on the great tutorial at http://www.emanueleferonato.com/, Ive had a stab at using WCK to recreate the implementation. It doesn't perform as well as I was expecting, the frame rate drops as we add more links and the elasticity of the revolute joints is limited by increasing the iterations during the world step. I would be really grateful if anyone could throw their eye over my class and suggest any optimisations. It would also help me get my head round using this awesome WCK. The pertinent methods are the addLink() and revoluteJoint() methods. Thanks!

Code: Select all

   [SWF( frameRate="30", width="720", height="440",  backgroundColor="0xFFFFFF" )]   
   public class wckTest extends Sprite
   {
      protected var debug:b2DebugDraw;   
      protected var world : wck.World ;
      protected var worldScale : Number = 60 ;
      protected var links : Array = [] ;
      protected var chainLength : int = 5 ;
      protected var topFixture : DanTopBox ;
      protected var steelBall : DanLinkBox ;
      protected var endJoint : b2Joint ;
      
      public function wckTest()
      {
         addChild( new TheMiner() ) ;
         
         world = new wck.World() ;
         addChild( world ) ;
                  
         topFixture = new DanTopBox() ;
         topFixture.y = 10 ;
         topFixture.x = 720 / 2 ;
         topFixture.type = 'Kinematic' ;
         topFixture.awake = true ;
         world.addChild( topFixture ) ;
         
         debug = new b2DebugDraw( world.b2world , worldScale );
         addChild(debug);
         
         addEventListener( Event.ENTER_FRAME , handleEnterFrame ) ;
         KeyboardUtils.initialise( stage ) ;
         
         steelBall = new DanLinkBox( 20 ) ;
         
         steelBall.x = 720 / 2 ;
         steelBall.y = 50 ;
         world.addChild( steelBall ) ;
         
         addLink() ;
      }
      
      protected function addLink() : void
      {
         if( endJoint ) world.b2world.DestroyJoint( endJoint ) ;
         
         var finalLink : DanLinkBox = links[ links.length-1 ] ;
         var link : DanLinkBox = new DanLinkBox( chainLength ) ;
         
         if( finalLink )
         {
            link.x = finalLink.x ;
            link.y = finalLink.y + ( chainLength * 4 );
         }
         else
         {
            link.x = topFixture.x ;
            link.y = topFixture.y + ( chainLength  ) ;
         }         
         
         world.addChild( link ) ;
         
         if( links.length == 0 ) revoluteJoint(topFixture.b2body,link.b2body,new V2(0,(chainLength ) /worldScale),new V2(0,-(chainLength  ) /worldScale))
         else revoluteJoint(links[ links.length-1 ].b2body,link.b2body,new V2(0,(chainLength / 2 ) /worldScale),new V2(0,-(chainLength /2 ) /worldScale));         
                  
         links.push( link ) ;
         
         attachEnd() ;
      }
      
      protected function attachEnd() : void
      {
         var finalLink : DanLinkBox = links[ links.length-1 ] ;
         endJoint = revoluteJoint( finalLink.b2body,steelBall.b2body,new V2(0,chainLength/worldScale),new V2(0,-chainLength/worldScale));
      }
      
      protected function revoluteJoint(bodyA:b2Body,bodyB:b2Body,anchorA:V2,anchorB:V2):b2Joint {
         var revoluteJointDef:b2RevoluteJointDef=new b2RevoluteJointDef();
         revoluteJointDef.localAnchorA.v2 = new V2(anchorA.x,anchorA.y);
         revoluteJointDef.localAnchorB.v2 = new V2(anchorB.x,anchorB.y);
         revoluteJointDef.bodyA=bodyA;
         revoluteJointDef.bodyB=bodyB;
         return world.b2world.CreateJoint(revoluteJointDef) ;
      }
      
      protected function removeLink() : void
      {
         if( links.length > 1 )
         {
            if( endJoint ) world.b2world.DestroyJoint( endJoint ) ;
            world.b2world.DestroyBody( links.pop().b2body ) ;
            attachEnd() ;
         }   
      }
      
      protected var ctr : int = 0 ;      
      protected function handleEnterFrame( e : Event ) : void
      {
         if( KeyboardUtils.keyIsDown( Keyboard.LEFT ) ) topFixture.b2body.SetLinearVelocity( new V2( -2 , 0 ) ) ;
         else if( KeyboardUtils.keyIsDown( Keyboard.RIGHT ) ) topFixture.b2body.SetLinearVelocity( new V2( 2 , 0 ) ) ;
         else topFixture.b2body.SetLinearVelocity( new V2( 0 , 0 ) ) ;
         
         if( KeyboardUtils.keyIsDown( Keyboard.DOWN ) )
         {
            if( ctr % 1 == 0 ) addLink() ;
            ctr ++ ;
         }               
         else if( KeyboardUtils.keyIsDown( Keyboard.UP ) )
         {
            if( ctr % 1 == 0 ) removeLink() ;
            ctr ++ ;
         }
                  
         world.b2world.Step(1/30,100,100);
         world.b2world.ClearForces();
         debug.Draw() ;      
      }      
   }

Return to “WCK”



Who is online

Users browsing this forum: No registered users and 1 guest