home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Puzzle / filler.swf / scripts / org / cove / ape / SpringConstraint.as < prev    next >
Encoding:
Text File  |  2008-09-02  |  5.9 KB  |  233 lines

  1. package org.cove.ape
  2. {
  3.    import flash.display.DisplayObject;
  4.    
  5.    public class SpringConstraint extends AbstractConstraint
  6.    {
  7.        
  8.       
  9.       private var _collidable:Boolean;
  10.       
  11.       private var _restLength:Number;
  12.       
  13.       private var p1:AbstractParticle;
  14.       
  15.       private var p2:AbstractParticle;
  16.       
  17.       private var _scp:SpringConstraintParticle;
  18.       
  19.       public function SpringConstraint(param1:AbstractParticle, param2:AbstractParticle, param3:Number = 0.5, param4:Boolean = false, param5:Number = 1, param6:Number = 1, param7:Boolean = false)
  20.       {
  21.          super(param3);
  22.          this.p1 = param1;
  23.          this.p2 = param2;
  24.          checkParticlesLocation();
  25.          _restLength = currLength;
  26.          setCollidable(param4,param5,param6,param7);
  27.       }
  28.       
  29.       public function set rectScale(param1:Number) : void
  30.       {
  31.          if(scp == null)
  32.          {
  33.             return;
  34.          }
  35.          scp.rectScale = param1;
  36.       }
  37.       
  38.       override public function init() : void
  39.       {
  40.          cleanup();
  41.          if(collidable)
  42.          {
  43.             scp.init();
  44.          }
  45.          else if(displayObject != null)
  46.          {
  47.             initDisplay();
  48.          }
  49.          paint();
  50.       }
  51.       
  52.       internal function initDisplay() : void
  53.       {
  54.          if(collidable)
  55.          {
  56.             scp.initDisplay();
  57.          }
  58.          else
  59.          {
  60.             displayObject.x = displayObjectOffset.x;
  61.             displayObject.y = displayObjectOffset.y;
  62.             displayObject.rotation = displayObjectRotation;
  63.             sprite.addChild(displayObject);
  64.          }
  65.       }
  66.       
  67.       private function checkParticlesLocation() : void
  68.       {
  69.          if(p1.curr.x == p2.curr.x && p1.curr.y == p2.curr.y)
  70.          {
  71.             p2.curr.x += 0.0001;
  72.          }
  73.       }
  74.       
  75.       public function get radian() : Number
  76.       {
  77.          var _loc1_:Vector = null;
  78.          _loc1_ = delta;
  79.          return Math.atan2(_loc1_.y,_loc1_.x);
  80.       }
  81.       
  82.       public function setDisplay(param1:DisplayObject, param2:Number = 0, param3:Number = 0, param4:Number = 0) : void
  83.       {
  84.          if(collidable)
  85.          {
  86.             scp.setDisplay(param1,param2,param3,param4);
  87.          }
  88.          else
  89.          {
  90.             displayObject = param1;
  91.             displayObjectRotation = param4;
  92.             displayObjectOffset = new Vector(param2,param3);
  93.          }
  94.       }
  95.       
  96.       internal function get scp() : SpringConstraintParticle
  97.       {
  98.          return _scp;
  99.       }
  100.       
  101.       public function get rectHeight() : Number
  102.       {
  103.          return scp.rectHeight;
  104.       }
  105.       
  106.       public function set restLength(param1:Number) : void
  107.       {
  108.          if(param1 <= 0)
  109.          {
  110.             throw new ArgumentError("restLength must be greater than 0");
  111.          }
  112.          _restLength = param1;
  113.       }
  114.       
  115.       public function get currLength() : Number
  116.       {
  117.          return p1.curr.distance(p2.curr);
  118.       }
  119.       
  120.       public function get fixedEndLimit() : Number
  121.       {
  122.          return scp.fixedEndLimit;
  123.       }
  124.       
  125.       public function get rectScale() : Number
  126.       {
  127.          return scp.rectScale;
  128.       }
  129.       
  130.       internal function get delta() : Vector
  131.       {
  132.          return p1.curr.minus(p2.curr);
  133.       }
  134.       
  135.       public function get angle() : Number
  136.       {
  137.          return radian * MathUtil.ONE_EIGHTY_OVER_PI;
  138.       }
  139.       
  140.       public function get center() : Vector
  141.       {
  142.          return p1.curr.plus(p2.curr).divEquals(2);
  143.       }
  144.       
  145.       public function set rectHeight(param1:Number) : void
  146.       {
  147.          if(scp == null)
  148.          {
  149.             return;
  150.          }
  151.          scp.rectHeight = param1;
  152.       }
  153.       
  154.       public function get restLength() : Number
  155.       {
  156.          return _restLength;
  157.       }
  158.       
  159.       override public function paint() : void
  160.       {
  161.          var _loc1_:Vector = null;
  162.          if(collidable)
  163.          {
  164.             scp.paint();
  165.          }
  166.          else if(displayObject != null)
  167.          {
  168.             _loc1_ = center;
  169.             sprite.x = _loc1_.x;
  170.             sprite.y = _loc1_.y;
  171.             sprite.rotation = angle;
  172.          }
  173.          else
  174.          {
  175.             sprite.graphics.clear();
  176.             sprite.graphics.lineStyle(lineThickness,lineColor,lineAlpha);
  177.             sprite.graphics.moveTo(p1.px,p1.py);
  178.             sprite.graphics.lineTo(p2.px,p2.py);
  179.          }
  180.       }
  181.       
  182.       public function setCollidable(param1:Boolean, param2:Number, param3:Number, param4:Boolean = false) : void
  183.       {
  184.          _collidable = param1;
  185.          _scp = null;
  186.          if(_collidable)
  187.          {
  188.             _scp = new SpringConstraintParticle(p1,p2,this,param2,param3,param4);
  189.          }
  190.       }
  191.       
  192.       public function get collidable() : Boolean
  193.       {
  194.          return _collidable;
  195.       }
  196.       
  197.       public function isConnectedTo(param1:AbstractParticle) : Boolean
  198.       {
  199.          return param1 == p1 || param1 == p2;
  200.       }
  201.       
  202.       override internal function resolve() : void
  203.       {
  204.          var _loc1_:Number = NaN;
  205.          var _loc2_:Number = NaN;
  206.          var _loc3_:Vector = null;
  207.          if(p1.fixed && p2.fixed)
  208.          {
  209.             return;
  210.          }
  211.          _loc1_ = currLength;
  212.          _loc2_ = (_loc1_ - restLength) / (_loc1_ * (p1.invMass + p2.invMass));
  213.          _loc3_ = delta.mult(_loc2_ * stiffness);
  214.          p1.curr.minusEquals(_loc3_.mult(p1.invMass));
  215.          p2.curr.plusEquals(_loc3_.mult(p2.invMass));
  216.       }
  217.       
  218.       public function get fixed() : Boolean
  219.       {
  220.          return p1.fixed && p2.fixed;
  221.       }
  222.       
  223.       public function set fixedEndLimit(param1:Number) : void
  224.       {
  225.          if(scp == null)
  226.          {
  227.             return;
  228.          }
  229.          scp.fixedEndLimit = param1;
  230.       }
  231.    }
  232. }
  233.