Explode Image

Here we use one of Flint’s utility functions to create many small particles from a single image. Then, by applying the Explode activity at the location of the mouse click, we blow the image apart.

package
{
  import org.flintparticles.common.events.EmitterEvent;
  import org.flintparticles.common.particles.Particle;
  import org.flintparticles.threeD.actions.DeathZone;
  import org.flintparticles.threeD.actions.Explosion;
  import org.flintparticles.threeD.actions.Move;
  import org.flintparticles.threeD.emitters.Emitter3D;
  import org.flintparticles.threeD.particles.Particle3DUtils;
  import org.flintparticles.threeD.renderers.DisplayObjectRenderer;
  import org.flintparticles.threeD.zones.FrustrumZone;

  import flash.display.BitmapData;
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  import flash.geom.Point;
  import flash.geom.Rectangle;
  import flash.geom.Vector3D;

  [SWF(width='500', height='350', frameRate='60', backgroundColor='#000000')]
  
  public class Main extends Sprite
  {
    private var emitter:Emitter3D;
    private var bitmap:BitmapData;
    private var renderer:DisplayObjectRenderer;
    private var explosion:Explosion;
    
    public function Main()
    {
      bitmap = new Image1( 384, 255 );
      
      renderer = new DisplayObjectRenderer();
      renderer.camera.dolly( -400 );
      renderer.camera.projectionDistance = 400;
      renderer.y = 175;
      renderer.x = 250;
      addChild( renderer );
      
      emitter = new Emitter3D();
      emitter.addAction( new Move() );
      emitter.addAction( new DeathZone( new FrustrumZone( renderer.camera, new Rectangle( -290, -215, 580, 430 ) ), true ) );
      prepare();
      
      renderer.addEmitter( emitter );
      emitter.start();
      stage.addEventListener( MouseEvent.CLICK, explode, false, 0, true );
      emitter.addEventListener( EmitterEvent.EMITTER_EMPTY, prepare );
    }
    
    private function prepare( event:EmitterEvent = null ):void
    {
      if( explosion )
      {
        emitter.removeAction( explosion );
        explosion = null;
      }
      var particles:Vector.<Particle> = Particle3DUtils.createRectangleParticlesFromBitmapData( bitmap, 12, emitter.particleFactory, new Vector3D( -192, -127, 0 ) );
      emitter.addParticles( particles, false );
    }
    
    private function explode( ev:MouseEvent ):void
    {
      if( !explosion )
      {
        var p:Point = renderer.globalToLocal( new Point( ev.stageX, ev.stageY ) );
        explosion = new Explosion( 8, new Vector3D( p.x, p.y, 50 ), 500 );
        emitter.addAction( explosion );
      }
    }
  }
}
import org.flintparticles.common.events.EmitterEvent;
import org.flintparticles.common.particles.Particle;
import org.flintparticles.threeD.actions.*;
import org.flintparticles.threeD.emitters.Emitter3D;
import org.flintparticles.threeD.particles.Particle3DUtils;
import org.flintparticles.threeD.renderers.DisplayObjectRenderer;
import org.flintparticles.threeD.zones.FrustrumZone;

var explosion:Explosion;
var bitmap:BitmapData = new Image1( 384, 255 );

var renderer:DisplayObjectRenderer = new DisplayObjectRenderer();
renderer.camera.dolly( -400 );
renderer.camera.projectionDistance = 400;
renderer.y = 175;
renderer.x = 250;
addChild( renderer );

var emitter:Emitter3D = new Emitter3D();
emitter.addAction( new Move() );
emitter.addAction( new DeathZone( new FrustrumZone( renderer.camera, new Rectangle( -290, -215, 580, 430 ) ), true ) );
emitter.position = new Vector3D( 0, 0, 0 );
prepare();

renderer.addEmitter( emitter );
emitter.start();

stage.addEventListener( MouseEvent.CLICK, explode, false, 0, true );
emitter.addEventListener( EmitterEvent.EMITTER_EMPTY, prepare );

function prepare( event:EmitterEvent = null ):void
{
  if( explosion )
  {
    emitter.removeAction( explosion );
    explosion = null;
  }
  var particles:Vector.<Particle> = Particle3DUtils.createRectangleParticlesFromBitmapData( bitmap, 12, emitter.particleFactory, new Vector3D( -192, -127, 0 ) );
  emitter.addParticles( particles, false );
}

function explode( ev:MouseEvent ):void
{
  if( !explosion )
  {
    var p:Point = renderer.globalToLocal( new Point( ev.stageX, ev.stageY ) );
    explosion = new Explosion( 8, new Vector3D( p.x, p.y, 50 ), 500 );
    emitter.addAction( explosion );
  }
}
<?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/flint3d"
  xmlns:geom="flash.geom.*"
  width="500" height="350"
  backgroundColor="#000000" creationComplete="complete()">

<fx:Script>
  <![CDATA[
    import org.flintparticles.common.events.EmitterEvent;
    import org.flintparticles.common.particles.Particle;
    import org.flintparticles.threeD.actions.Explosion;
    import org.flintparticles.threeD.particles.Particle3DUtils;
    
    private var explosion:Explosion;
    private var bitmap:BitmapData;
    
    private function complete():void
    {
      bitmap  = new Image1( 384, 255 );
      prepare();
      addEventListener( MouseEvent.CLICK, explode, false, 0, true );
      emitter.addEventListener( EmitterEvent.EMITTER_EMPTY, prepare );
    }
    
    private function prepare( event:EmitterEvent = null ):void
    {
      if( explosion )
      {
        emitter.removeAction( explosion );
        explosion = null;
      }
      var particles:Vector.<Particle> = Particle3DUtils.createRectangleParticlesFromBitmapData( bitmap, 12, emitter.particleFactory, new Vector3D( -192, -127, 0 ) );
      emitter.addParticles( particles, false );
    }

    private function explode( ev:MouseEvent ):void
    {
      if( !explosion )
      {
        var p:Point = renderer.globalToLocal( new Point( ev.stageX, ev.stageY ) );
        explosion = new Explosion( 8, new Vector3D( p.x - renderer.width / 2, p.y - renderer.height / 2, 50 ), 500 );
        emitter.addAction( explosion );
      }
    }
  ]]>
</fx:Script>

<f:DisplayObjectRenderer x="0" y="0" id="renderer" width="500" height="350">
  <f:camera>
    <f:Camera id="camera" projectionDistance="400">
      <f:position>
        <geom:Vector3D x="0" y="0" z="-400"/>
      </f:position>
    </f:Camera>
  </f:camera>
  <f:emitters>
    <f:Emitter id="emitter" autoStart="true">
      <f:actions>
        <f:Move/>
        <f:DeathZone zoneIsSafe="true">
          <f:FrustrumZone camera="{camera}">
            <f:viewRect>
              <geom:Rectangle left="-290" top="-215" width="580" height="430"/>
            </f:viewRect>
          </f:FrustrumZone>
        </f:DeathZone>
      </f:actions>
    </f:Emitter>
  </f:emitters>
</f:DisplayObjectRenderer>
</s:Application>