Search code examples
actionscript-3movieclipflash-cs6

bend line 90 degrees at a point where another movieclip intersects with it in actionscript 3


Essentially, I'm making a game in Flash CS6 where a light source is projected onto the screen. You get a mirror that you can drag around. When the mirror touches the light, however, it should bounce off it and end up 90 degrees offset after it hit the mirror.
I don't have enough reputation to post pictures, but here's a link to an explanation of the problem: http://raphaelhennessy.com/misc/explanation.png
If you can help me solve this I would be really happy.

Thanks in advance,
-Raph


Solution

  • This is an extremely quick and dirty example to get the ball rolling. There are many issues with this code, so I suggest you use it only as a jumping off point. Details are commented within the code.

    package 
    {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
    
        public class MirrorTest extends Sprite 
        {
    
            private var _mirror:Sprite;
            private var _line:Sprite;
    
            public function MirrorTest() 
            {
                super();
    
                // create the line clip
                _line = addChild(new Sprite()) as Sprite;
                _line.graphics.clear();
                _line.graphics.lineStyle(3, 0xFF0000);
                _line.graphics.moveTo(0, 0);
                _line.graphics.lineTo(500, 0); // starting it off at an arbitrary width
                _line.y = 100; // positioning line so that we can see when it bends upwards
    
                // create the mirror clip
                _mirror = addChild(new Sprite()) as Sprite;
    
                // draw a square and rotate it so we have a diamond shape
                _mirror.graphics.beginFill(0);
                _mirror.graphics.drawRect(-20, -20, 40, 40);
                _mirror.graphics.endFill();
                _mirror.rotation = 45;
                _mirror.x = _mirror.y = 200; // position the mirror away from the line
    
                // add even listeners to trigger dragging/dropping
                _mirror.addEventListener(MouseEvent.MOUSE_DOWN, dragMirror);
                _mirror.addEventListener(MouseEvent.MOUSE_UP, dropMirror);
    
            }
    
            private function dragMirror($event:MouseEvent):void 
            {
                // start dragging the mirror. 
                _mirror.startDrag(true);
                // add the ENTER_FRAME listener so that we can check for colision as the mirror is being moved around
                addEventListener(Event.ENTER_FRAME, onTick);
            }
    
            private function dropMirror($event:MouseEvent):void 
            {
                // stop dragging the mirror
                _mirror.stopDrag();
                // remove the ENTER_FRAME listener so we don't waste cycles checking for collision when the mirror is not being moved around
                removeEventListener(Event.ENTER_FRAME, onTick);
            }
    
            private function onTick($event:Event):void 
            {
                // check to see if the mirror has collided with the line
                if (_mirror.hitTestObject(_line))
                {
                    // if so, redraw the line as a right-angle, using the mirror's position as the "collision point"
                    _line.graphics.clear();
                    _line.graphics.lineStyle(3, 0xFF0000);
                    _line.graphics.moveTo(0, 0);
                    _line.graphics.lineTo(_mirror.x - _mirror.width * .5, 0);
                    _line.graphics.lineTo(_mirror.x - _mirror.width * .5, -100);
                }
                else
                {
                    // if not, redraw the original line
                    _line.graphics.clear();
                    _line.graphics.lineStyle(3, 0xFF0000);
                    _line.graphics.moveTo(0, 0);
                    _line.graphics.lineTo(500, 0);
                }
    
            }
    
        }
    
    }