Verlet integration

Does anybody over here know about Verlet integration?

Between these three classes I’ve got a bitmap object moving around nicely with the arrow keys… but most of the time when I open the SWF there is a flash of the bitmap in the upper left corner before it goes to the location is was set to.

Of these classes, Verlet (document) and Hero deal with the movement and fence keeps the the bitmap on the stage.


package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Verlet extends Sprite
    {
        private var _heroPos:Hero;

        public function Verlet()
        {
            _heroPos = new Hero();
            addChild( _heroPos );
            
            _heroPos.setX = 200;
            _heroPos.setY = 200;
                    
            addEventListener( Event.ENTER_FRAME,enterFrameHandler );
        }
        
        private function enterFrameHandler( event:Event ):void
        {
            _heroPos.updatePos();
            _heroPos.x = _heroPos.xPos;
            _heroPos.y = _heroPos.yPos;
             
             Fence.stopBitmap( _heroPos, stage );
        }
    }
}

// + + + + +

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    public class Hero extends Sprite
    {
        private const SPEED:uint = 10;
        
        public var xPos:Number = 0;
        public var yPos:Number = 0;
        private var _previousX:Number = 0;
        private var _previousY:Number = 0;
        private var _temporaryX:Number = 0;
        private var _temporaryY:Number = 0;
        
        private var _heroBmd:BitmapData;
        private var _hero:Bitmap;

        public function Hero():void
        {    
            addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
        }
        
        private function onAddedToStage( event:Event ):void
        {
            makeHero();
            
            addEventListener( Event.REMOVED_FROM_STAGE, onRemovedFromStage );            
            stage.addEventListener( KeyboardEvent.KEY_DOWN, myKeyDown );
            stage.addEventListener( KeyboardEvent.KEY_UP, myKeyUp );
                    
            removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );            
        }
                
        private function onRemovedFromStage( event:Event ):void
        {
            removeEventListener( Event.REMOVED_FROM_STAGE, onRemovedFromStage );
        }
        
        private function makeHero():void
        { 
            _heroBmd = new BitmapData( 20, 40, false, 0x00CC00CC );
            _hero = new Bitmap( _heroBmd );
            addChild( _hero );
        }
        
        public function updatePos():void 
        {
            _temporaryX = xPos;
            _temporaryY = yPos;
            
            xPos += vx;
            yPos += vy;
            
            _previousX = _temporaryX;
            _previousY = _temporaryY;
        }
        
        // + + + + +
        
        public function get vx():Number
        
            { return xPos - _previousX; }
        
        public function set vx( value:Number ):void
        
            { _previousX = xPos - value; }
        
        public function get vy():Number
        
            { return yPos - _previousY; }
        
        public function set vy( value:Number ):void
        
            { _previousY = yPos - value; }

        public function set setX( value:Number ):void
        
            { _previousX = value - vx;  xPos = value; }

        public function set setY( value:Number ):void
        
            { _previousY = value - vy;  yPos = value; }
        
        // + + + + +
        
        private function myKeyDown( event:KeyboardEvent ):void
          {
              if ( event.keyCode == Keyboard.LEFT )
                  
                { vx = -SPEED; }
                
              if ( event.keyCode == Keyboard.RIGHT )
                  
                { vx = SPEED; }
                
              if ( event.keyCode == Keyboard.UP )
                  
                { vy = -SPEED; }
                
              if ( event.keyCode == Keyboard.DOWN )
                  
                { vy = SPEED; }
          }
        
        private function myKeyUp( event:KeyboardEvent ):void
        {
            if ( event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT )
            
                { vx = 0; }
            
            if ( event.keyCode == Keyboard.UP || event.keyCode == Keyboard.DOWN )
            
                { vy = 0; }
        }
    }
}

// + + + +

package
{
    import flash.display.Sprite;
    
    public class Fence
    {
        static public function stopBitmap( object:Object, stage:Object ):void
        {
            if ( object.xPos + ( object.width ) > stage.stageWidth )
            
                { object.setX = stage.stageWidth - ( object.width );  object.vx = 0; }

            if ( object.xPos < 0 ) 
            
                { object.setX = 0;  object.vx = 0; }
            
            if ( object.yPos < 0 )  
            
                { object.setY = 0;  object.vy = 0; }
                
            if ( object.yPos + object.height > stage.stageHeight )
            
                { object.setY = stage.stageHeight - object.height;  object.vy = 0; }
        }
    }
}