Fork me on GitHub
Not signed in (Sign In)

Welcome, Guest

Want to take part in these discussions? Sign in if you have an account, or apply for one below

    • CommentAuthorMihaPro
    • CommentTimeJan 8th 2011 edited
     
    ???????????? ????? ???:

    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 );
    }
    }
    }
    • CommentAuthorRichard
    • CommentTimeJan 18th 2011
     
    That should be useful. Thank you.