topical media & game development

talk show tell print

animation-ch13-RealWalk.ax

animation-ch13-RealWalk.ax [swf] [flash] flex


  package {
          import flash.display.Sprite;
          import flash.display.StageScaleMode;
          import flash.display.StageAlign;
          import flash.events.Event;
          import flash.geom.Point;
  
          public class @ax-animation-ch13-RealWalk extends Sprite
          {
                  private var segment0:animation_ch13_Segment;
                  private var segment1:animation_ch13_Segment;
                  private var segment2:animation_ch13_Segment;
                  private var segment3:animation_ch13_Segment;
                  private var speedSlider:animation_ch13_SimpleSlider;
                  private var thighRangeSlider:animation_ch13_SimpleSlider;
                  private var thighBaseSlider:animation_ch13_SimpleSlider;
                  private var calfRangeSlider:animation_ch13_SimpleSlider;
                  private var calfOffsetSlider:animation_ch13_SimpleSlider;
                  private var gravitySlider:animation_ch13_SimpleSlider;
                  private var cycle:Number = 0;
                  private var vx:Number = 0;
                  private var vy:Number = 0;
                  
                  public function @ax-animation-ch13-RealWalk()
                  {
                          init();
                  }
                  
                  private function init():void
                  {
                          stage.scaleMode = StageScaleMode.NO_SCALE;
                          stage.align = StageAlign.TOP_LEFT;
                          
                          segment0 = new animation_ch13_Segment(50, 15);
                          addChild(segment0);
                          segment0.x = 200;
                          segment0.y = 100;
                          
                          segment1 = new animation_ch13_Segment(50, 10);
                          addChild(segment1);
                          segment1.x = segment0.getPin().x;
                          segment1.y = segment0.getPin().y;
                          
                          segment2 = new animation_ch13_Segment(50, 15);
                          addChild(segment2);
                          segment2.x = 200;
                          segment2.y = 100;
                          
                          segment3 = new animation_ch13_Segment(50, 10);
                          addChild(segment3);
                          segment3.x = segment2.getPin().x;
                          segment3.y = segment2.getPin().y;
                          
                          speedSlider = new animation_ch13_SimpleSlider(0, 0.3, 0.12);
                          addChild(speedSlider);
                          speedSlider.x = 10;
                          speedSlider.y = 10;
                          
                          thighRangeSlider = new animation_ch13_SimpleSlider(0, 90, 45);
                          addChild(thighRangeSlider);
                          thighRangeSlider.x = 30;
                          thighRangeSlider.y = 10;
                          
                          thighBaseSlider = new animation_ch13_SimpleSlider(0, 180, 90);
                          addChild(thighBaseSlider);
                          thighBaseSlider.x = 50;
                          thighBaseSlider.y = 10;
                          
                          calfRangeSlider = new animation_ch13_SimpleSlider(0, 90, 45);
                          addChild(calfRangeSlider);
                          calfRangeSlider.x = 70;
                          calfRangeSlider.y = 10;
                          
                          calfOffsetSlider = new animation_ch13_SimpleSlider(-3.14, 3.14, -1.57);
                          addChild(calfOffsetSlider);
                          calfOffsetSlider.x = 90;
                          calfOffsetSlider.y = 10;
                          
                          gravitySlider = new animation_ch13_SimpleSlider(0, 1, 0.2);
                          addChild(gravitySlider);
                          gravitySlider.x = 110;
                          gravitySlider.y = 10;
                          
                          addEventListener(Event.ENTER_FRAME, onEnterFrame);
                  }
                  
                  private function onEnterFrame(event:Event):void
                  {
                          doVelocity();
                          walk(segment0, segment1, cycle);
                          walk(segment2, segment3, cycle + Math.PI);
                          cycle += speedSlider.value;
                          checkFloor(segment1);
                          checkFloor(segment3);
                          checkWalls();
                  }
                  
                  private function walk(segA:animation_ch13_Segment, segB:animation_ch13_Segment, cyc:Number):void
                  {
                          var foot:Point = segB.getPin();
                          var angleA:Number = Math.sin(cyc) *
                                                                  thighRangeSlider.value + 
                                                                  thighBaseSlider.value;
                          var angleB:Number = Math.sin(cyc + calfOffsetSlider.value) *
                                                                  calfRangeSlider.value +
                                                                  calfRangeSlider.value;
                          segA.rotation = angleA;
                          segB.rotation = segA.rotation + angleB;
                          segB.x = segA.getPin().x;
                          segB.y = segA.getPin().y;
                          segB.vx = segB.getPin().x - foot.x;
                          segB.vy = segB.getPin().y - foot.y;
                  }
  
                  private function doVelocity():void
                  {
                          vy += gravitySlider.value;
                          segment0.x += vx;
                          segment0.y += vy;
                          segment2.x += vx;
                          segment2.y += vy;
                  }
  
                  private function checkFloor(seg:animation_ch13_Segment):void
                  {
                          var yMax:Number = seg.getBounds(this).bottom;
                          if(yMax > stage.stageHeight)
                          {
                                  var dy:Number = yMax - stage.stageHeight;
                                  segment0.y -= dy;
                                  segment1.y -= dy;
                                  segment2.y -= dy;
                                  segment3.y -= dy;
                                  vx -= seg.vx;
                                  vy -= seg.vy;
                          }
                  }
                  
                  private function checkWalls():void
                  {
                          var w:Number = stage.stageWidth + 200;
                          if(segment0.x > stage.stageWidth + 100)
                          {
                                  segment0.x -= w;
                                  segment1.x -= w;
                                  segment2.x -= w;
                                  segment3.x -= w;
                          }
                          else if(segment0.x < -100)
                          {
                                  segment0.x += w;
                                  segment1.x += w;
                                  segment2.x += w;
                                  segment3.x += w;
                          }
                  }
          }
  }
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.