package { /** * @author nicoptere */ import flash.display.*; import flash.events.*; import flash.utils.*; import SuppressionButton; public class ForceField extends Sprite { static public var TYPE:String = 'Force'; public var forces:Array; public var isPressed:Boolean; public var vectorField:VectorField; public var tempForce:Force; public var currentForce:Force; private var container:Sprite; private var suppress:SuppressionButton; public function ForceField( vf:VectorField = null ) { forces = new Array(); isPressed = false; container = new Sprite(); addChild( container ); //creates the forces on press if ( vf != null ) { setVectorField( vf ); } } public function setVectorField( vf:VectorField ):void { vectorField = vf; vectorField.addChild(this); this.graphics.beginFill( 0x222222, 0); this.graphics.drawRect( 0, 0, vf.width, vf.height ); addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler ); addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler ); addEventListener( MouseEvent.ROLL_OUT, rollOutHandler ); addEventListener( MouseEvent.MOUSE_MOVE, mouseMoveHandler ); //creates a suppress button suppress = new SuppressionButton( this ); } function mouseDownHandler( e:Event ):void { suppress.show(); if( e.target is ForceField )//creates a new temporary force { //instantiate the Force according to the current TYPE var F:Class = getDefinitionByName( String( TYPE ) ) as Class; tempForce = new F( vectorField.mouseX, vectorField.mouseY ); container.addChild( tempForce ); forces.push( tempForce ); tempForce.setup( vectorField.mouseX, vectorField.mouseY ); vectorField.showForces(); vectorField.drawForces = true; currentForce = tempForce; suppress.assignForce( tempForce ); isPressed = true; }else if( e.target is Force )//we clicked on an existing force { var f:Force = ( e.target as Force ); f.startDrag(); currentForce = ( f ); suppress.show(); container.setChildIndex( f, container.numChildren - 1); }else if( e.target is Sprite )//we clicked on something else { ( e.target as Sprite ).startDrag(); try { suppress.assignForce( ( e.target as Sprite ).parent as Force ); }catch( error:Error ) { suppress.hide(); } } } function mouseUpHandler( e:Event ):void { isPressed = false; if( e.target is Force )//force { ( e.target as Force ).stopDrag(); }else if( e.target is Sprite )//handle { ( e.target as Sprite ).stopDrag(); } } public function mouseMoveHandler( e:Event ):void { if( isPressed) { var X:Number = vectorField.mouseX; var Y:Number = vectorField.mouseY; tempForce.setup(X, Y); tempForce.render(); } } public function rollOutHandler( e:Event ):void { if( isPressed ) { deleteForce( tempForce ); isPressed = false; suppress.hide(); } } public function deleteForce( F:Force ):void { var i:int; var f:Force; var FL:uint = forces.length; for( i = 0; i < FL; i++) { f = forces[ i ]; if( F == f ) { forces.splice( i, 1 ); F.dispose(); container.removeChild( F ); F = null; break; } } } public function reset():void { var i:int; var f:Force; var FL:uint = forces.length; for( i = 0; i < FL; i++) { f = forces[ i ]; f.dispose(); container.removeChild( f ); f = null; } forces = []; } } }