Flint Particle System Forum - Pool for DisplayObject 2011-12-11T01:48:21+00:00 http://flintparticles.org/forum/ Lussumo Vanilla & Feed Publisher Pool for DisplayObject http://flintparticles.org/forum/comments.php?DiscussionID=443&Focus=1506#Comment_1506 2011-01-08T18:27:58+00:00 2011-01-18T08:28:55+00:00 MihaPro http://flintparticles.org/forum/account.php?u=456 ???????????? ????? ???: var pool:DisplayObjectsPool2D = new DisplayObjectsPool2D(); ... emitter1.addInitializer(new PooledImageClass2D(pool, Dot, ... ???????????? ????? ???:

var pool:DisplayObjectsPool2D = new DisplayObjectsPool2D();
...
emitter1.addInitializer(new PooledImageClass2D(pool, Dot, 1,16777215,"normal"));
...
emitter2.addInitializer(new PooledImageClass2D(pool, RadialDot));

One pool can be used for different classes inherited of DisplayObject.

Source code:

File DisplayObjectsPool2D.as:

package
{
import flash.display.DisplayObject;
import flash.utils.Dictionary;
import flash.utils.getQualifiedClassName;
import org.flintparticles.common.particles.Particle;
import org.flintparticles.twoD.particles.Particle2D;
import org.flintparticles.twoD.particles.ParticleCreator2D;

/**
* Factory for creating Image for particles from pool.
* @author MihaPro
*/
public class DisplayObjectsPool2D extends ParticleCreator2D
{
public var dict:Dictionary = new Dictionary;

public function DisplayObjectsPool2D()
{
}

override public function disposeParticle(particle:Particle):void
{
// ?????? ???????? ? ???
RecycleImage(Particle2D(particle));

super.disposeParticle(particle);
}

private function RecycleImage(p:Particle2D):void
{
var image_class:Class = p.image.constructor as Class;
var v:Vector.<*> = dict[image_class];
if (!v)
{
v = new Vector.<*>();
dict[image_class] = v;
}
v.push(p.image);
p.image = null;
}

public function GetImage(for_class:Class):*
{
var v:Vector.<*> = dict[for_class];
if (v && v.length) return v.pop();
return null;
}

public function Clear():void
{
dict = new Dictionary();
}
}

}


File PooledImageClass2D.as:

package
{
import org.flintparticles.common.emitters.Emitter;
import org.flintparticles.common.initializers.InitializerBase;
import org.flintparticles.common.particles.Particle;
import org.flintparticles.common.utils.construct;
import org.flintparticles.twoD.emitters.Emitter2D;

/**
* Pooled image class.
* @author MihaPro
*/
public class PooledImageClass2D extends InitializerBase
{
private var _imageClass:Class;
private var _parameters:Array;
protected var pool:DisplayObjectsPool2D;

public function PooledImageClass2D(_pool:DisplayObjectsPool2D, imageClass:Class, ...parameters)
{
pool = _pool;
_imageClass = imageClass;
_parameters = parameters;
}

override public function addedToEmitter(emitter:Emitter):void
{
super.addedToEmitter(emitter);
Emitter2D(emitter).particleFactory = pool;
}

override public function initialize(emitter:Emitter, particle:Particle):void
{
particle.image = pool.GetImage(_imageClass);
if(!particle.image) // if not in pool
particle.image = construct( _imageClass, _parameters );
}
}
}
]]>
Pool for DisplayObject http://flintparticles.org/forum/comments.php?DiscussionID=443&Focus=1513#Comment_1513 2011-01-18T08:29:31+00:00 2011-12-11T01:48:21+00:00 Richard http://flintparticles.org/forum/account.php?u=1 That should be useful. Thank you.