Brownian Motion
This example simulates Brownian Motion. It demonstrates Flint’s built-in collision handling between particles.
The example also includes a custom action created to show and hide the air particles.
package { import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.renderers.DisplayObjectRenderer; import flash.display.Sprite; [SWF(width='500', height='500', frameRate='60', backgroundColor='#000000')] public class Main extends Sprite { private var emitter:Emitter2D; public function Main() { emitter = new BrownianMotion( stage ); var renderer:DisplayObjectRenderer = new DisplayObjectRenderer(); renderer.addEmitter( emitter ); addChild( renderer ); emitter.start(); } } }
package { import org.flintparticles.common.counters.Blast; import org.flintparticles.common.displayObjects.Dot; import org.flintparticles.common.initializers.ChooseInitializer; import org.flintparticles.common.initializers.CollisionRadiusInit; import org.flintparticles.common.initializers.ColorInit; import org.flintparticles.common.initializers.ImageClass; import org.flintparticles.common.initializers.InitializerGroup; import org.flintparticles.common.initializers.MassInit; import org.flintparticles.twoD.actions.BoundingBox; import org.flintparticles.twoD.actions.Collide; import org.flintparticles.twoD.actions.Move; import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.initializers.Position; import org.flintparticles.twoD.initializers.Velocity; import org.flintparticles.twoD.zones.DiscZone; import org.flintparticles.twoD.zones.RectangleZone; import flash.display.DisplayObject; import flash.geom.Point; public class BrownianMotion extends Emitter2D { public function BrownianMotion( stage:DisplayObject ) { counter = new Blast( 500 ); var air:InitializerGroup = new InitializerGroup(); air.addInitializer( new ImageClass( Dot, [2] ) ); air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) ); air.addInitializer( new MassInit( 1 ) ); air.addInitializer( new CollisionRadiusInit( 2 ) ); var smoke:InitializerGroup = new InitializerGroup(); smoke.addInitializer( new ImageClass( Dot, [10] ) ); smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) ); smoke.addInitializer( new MassInit( 10 ) ); smoke.addInitializer( new CollisionRadiusInit( 10 ) ); addInitializer( new Position( new RectangleZone( 0, 0, 500, 500 ) ) ); addInitializer( new Velocity( new DiscZone( new Point( 0, 0 ), 150, 100 ) ) ); addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) ); addAction( new Move() ); addAction( new Collide( 1 ) ); addAction( new BoundingBox( 0, 0, 500, 500, 1 ) ); addAction( new ShowAirAction( stage ) ); } } }
package { import flash.display.DisplayObject; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import org.flintparticles.common.actions.ActionBase; import org.flintparticles.common.emitters.Emitter; import org.flintparticles.common.particles.Particle; public class ShowAirAction extends ActionBase { private var _isDown:Boolean; public function ShowAirAction( stage:DisplayObject ) { _isDown = false; stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true ); stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true ); } private function keyDownListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = true; } } private function keyUpListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = false; } } override public function update( emitter:Emitter, particle:Particle, time:Number ):void { if( particle.mass == 1 ) { if( _isDown ) { particle.color = 0; } else { particle.color = 0xFF666666; } } } } }
import org.flintparticles.common.counters.Blast; import org.flintparticles.common.debug.Stats; import org.flintparticles.common.displayObjects.Dot; import org.flintparticles.common.initializers.ChooseInitializer; import org.flintparticles.common.initializers.CollisionRadiusInit; import org.flintparticles.common.initializers.ColorInit; import org.flintparticles.common.initializers.ImageClass; import org.flintparticles.common.initializers.InitializerGroup; import org.flintparticles.common.initializers.MassInit; import org.flintparticles.twoD.actions.BoundingBox; import org.flintparticles.twoD.actions.Collide; import org.flintparticles.twoD.actions.Move; import org.flintparticles.twoD.emitters.Emitter2D; import org.flintparticles.twoD.initializers.Position; import org.flintparticles.twoD.initializers.Velocity; import org.flintparticles.twoD.renderers.DisplayObjectRenderer; import org.flintparticles.twoD.zones.DiscZone; import org.flintparticles.twoD.zones.RectangleZone; var emitter:Emitter2D = new Emitter2D(); emitter.counter = new Blast( 500 ); var air:InitializerGroup = new InitializerGroup(); air.addInitializer( new ImageClass( Dot, [2] ) ); air.addInitializer( new ColorInit( 0xFF666666, 0xFF666666 ) ); air.addInitializer( new MassInit( 1 ) ); air.addInitializer( new CollisionRadiusInit( 2 ) ); var smoke:InitializerGroup = new InitializerGroup(); smoke.addInitializer( new ImageClass( Dot, [10] ) ); smoke.addInitializer( new ColorInit( 0xFFFFFFFF, 0xFFFFFFFF ) ); smoke.addInitializer( new MassInit( 10 ) ); smoke.addInitializer( new CollisionRadiusInit( 10 ) ); emitter.addInitializer( new Position( new RectangleZone( 0, 0, 500, 500 ) ) ); emitter.addInitializer( new Velocity( new DiscZone( new Point( 0, 0 ), 150, 100 ) ) ); emitter.addInitializer( new ChooseInitializer( [ air, smoke ], [ 30, 1 ] ) ); emitter.addAction( new Move() ); emitter.addAction( new Collide( 1 ) ); emitter.addAction( new BoundingBox( 0, 0, 500, 500, 1 ) ); emitter.addAction( new ShowAirAction( stage ) ); var renderer:DisplayObjectRenderer = new DisplayObjectRenderer(); renderer.addEmitter( emitter ); addChild( renderer ); emitter.start();
package { import flash.display.DisplayObject; import flash.events.KeyboardEvent; import flash.ui.Keyboard; import org.flintparticles.common.actions.ActionBase; import org.flintparticles.common.emitters.Emitter; import org.flintparticles.common.particles.Particle; public class ShowAirAction extends ActionBase { private var _isDown:Boolean; public function ShowAirAction( stage:DisplayObject ) { _isDown = false; stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true ); stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true ); } private function keyDownListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = true; } } private function keyUpListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = false; } } override public function update( emitter:Emitter, particle:Particle, time:Number ):void { if( particle.mass == 1 ) { if( _isDown ) { particle.color = 0; } else { particle.color = 0xFF666666; } } } } }
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:f="http://flintparticles.org/2009/flint2d" xmlns:local="*" width="500" height="500" backgroundColor="#000000"> <fx:Script> <![CDATA[ import org.flintparticles.common.displayObjects.Dot; ]]> </fx:Script> <f:DisplayObjectRenderer id="renderer" width="500" height="500"> <f:emitters> <f:Emitter id="emitter" autoStart="true"> <f:counter> <f:Blast startCount="500"/> </f:counter> <f:initializers> <f:Position> <f:RectangleZone left="0" right="500" top="0" bottom="500"/> </f:Position> <f:Velocity> <f:DiscZone centerX="0" centerY="0" innerRadius="100" outerRadius="150"/> </f:Velocity> <f:ChooseInitializer weights="1,19"> <f:InitializerGroup> <f:ImageClass imageClass="{Dot}" parameters="10"/> <f:CollisionRadiusInit radius="10"/> <f:MassInit mass="10"/> <f:ColorInit minColor="0xFFFFFFFF" maxColor="0xFFFFFFFF"/> </f:InitializerGroup> <f:InitializerGroup> <f:ImageClass imageClass="{Dot}" parameters="2"/> <f:CollisionRadiusInit radius="2"/> <f:MassInit mass="1"/> <f:ColorInit minColor="0xFF666666" maxColor="0xFF666666"/> </f:InitializerGroup> </f:ChooseInitializer> </f:initializers> <f:actions> <f:Move/> <f:Collide bounce="1"/> <f:BoundingBox top="0" left="0" bottom="500" right="500" bounce="1"/> <local:ShowAirAction/> </f:actions> </f:Emitter> </f:emitters> </f:DisplayObjectRenderer> </s:Application>
package { import org.flintparticles.common.actions.ActionBase; import org.flintparticles.common.emitters.Emitter; import org.flintparticles.common.particles.Particle; import mx.core.IMXMLObject; import flash.display.DisplayObject; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class ShowAirAction extends ActionBase implements IMXMLObject { private var _isDown:Boolean; public function ShowAirAction() { _isDown = false; } public function initialized( document:Object, id:String ):void { if( DisplayObject( document ).stage ) { setStage( DisplayObject( document ).stage ); } else { DisplayObject( document ).addEventListener( Event.ADDED_TO_STAGE, addedToStage ); } } private function addedToStage( ev:Event ):void { setStage( ev.target.stage ); } private function setStage( stage:DisplayObject ):void { stage.addEventListener( KeyboardEvent.KEY_DOWN, keyDownListener, false, 0, true ); stage.addEventListener( KeyboardEvent.KEY_UP, keyUpListener, false, 0, true ); } private function keyDownListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = true; } } private function keyUpListener( ev:KeyboardEvent ):void { if( ev.keyCode == Keyboard.SHIFT ) { _isDown = false; } } override public function update( emitter:Emitter, particle:Particle, time:Number ):void { if( particle.mass == 1 ) { if( _isDown ) { particle.color = 0; } else { particle.color = 0xFF666666; } } } } }