Search code examples
actionscript-3flashanimationmasking

Actionscript 3, flash: Erasing area dynamically?


long story short, I made image for it. I am beginner in actionscripting, found out that only animating is not enough.

What I try to accomplish: enter image description here


Solution

  • You can use a simple mask to achieve this. Here's a working example (using LEFT mouse button, though. I don't think RIGHT one would be suitable for this):

    SWF result

    package examples
    {
        import flash.display.Sprite;
        import flash.display.Stage;
        import flash.events.MouseEvent;
        import flash.ui.Mouse;
    
        public class MaskTest extends Example
        {
            private var _toBeErased:Sprite;
            private var _discoverable:Sprite;
            private var _holesContainer:Sprite;
    
            private var _mouseIsPressed:Boolean = false;
    
            public function MaskTest()
            {
    
            }
    
            // Call this method once this Class instance has been added to stage
            public function init():void
            {
                // Create sprites           
                _toBeErased = new Sprite();     
                addChild( _toBeErased );
    
                _discoverable = new Sprite();   
                addChild( _discoverable );
    
                _holesContainer = new Sprite(); 
                addChild( _holesContainer );
    
                // Draw sprites         
                _toBeErased.graphics.beginFill( 0xFFFF00 );
                _toBeErased.graphics.drawRect( 0, 0, 900, 600 );
                _toBeErased.graphics.endFill();
    
                _discoverable.graphics.beginFill( 0xFFAAAA );
                _discoverable.graphics.drawRect( 0, 0, 900, 600 );
                _discoverable.graphics.endFill();
    
                // Set mask
                _discoverable.mask = _holesContainer;
    
                // Add mouse listeners
                stage.addEventListener( MouseEvent.MOUSE_MOVE, onMouseMove );
                stage.addEventListener( MouseEvent.MOUSE_DOWN, onMouseDown );
                stage.addEventListener( MouseEvent.MOUSE_UP, onMouseUp );
            }
    
            // Mouse listeners callbacks...
            private function onMouseDown( e:MouseEvent ):void{
                _mouseIsPressed = true;
            }
    
            private function onMouseUp( e:MouseEvent ):void{
                _mouseIsPressed = false;
            }
    
            private function onMouseMove( e:MouseEvent ):void
            {
                if( !_mouseIsPressed )
                    return;
    
                // Get a random size for circle
                var radius:Number = 5 + (Math.random()*10-5);
    
                // Create new circle and paint it
                var circle:Sprite = new Sprite();
                circle.graphics.beginFill( 0x000000 );
                circle.graphics.drawCircle( 0, 0, radius );
                circle.graphics.endFill();
    
                // Move it randomly, just a bit
                circle.x = _holesContainer.mouseX + (Math.random()*20-10);
                circle.y = _holesContainer.mouseY + (Math.random()*20-10);
                _holesContainer.addChild( circle );
            }
        }
    }