Fork me on GitHub

Explode Image

Flash required: You need version 10 or later of the free Flash player from Adobe to use this content. To download and install the free player from Adobe's web site click here.

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>