Esempio n. 1
0
        public ParticleSystem()
        {
            freeParticles = new Queue <Particle>(MAX_PARTICLES);
            particles     = new List <Particle>(MAX_PARTICLES);

            for (var i = 0; i < MAX_PARTICLES; i++)
            {
                freeParticles.Enqueue(new Particle());
            }
            status = ParticleStatus.Dead;
        }
Esempio n. 2
0
        public ParticleSystem()
        {
            freeParticles = new Queue<Particle>(MAX_PARTICLES);
            particles = new List<Particle>(MAX_PARTICLES);

            for (var i = 0; i < MAX_PARTICLES; i++)
            {
                freeParticles.Enqueue(new Particle());
            }
            status = ParticleStatus.Dead;
        }
Esempio n. 3
0
 public void Initialize(ParticleSystemInfo particleInfo, Vector2 origin, float lifetime)
 {
     for (var i = particles.Count - 1; i > 0; i--)
     {
         particles[i].isAlive = false;
     }
     status            = ParticleStatus.Alive;
     this.particleInfo = particleInfo;
     this.origin       = origin;
     makeParticles();
     this.lifetime     = lifetime;
     this.time_elapsed = 0;
 }
Esempio n. 4
0
    void initParticle()
    {
        for (int i = 0; i < particleNum; i++)
        {
            // 普通的随机半径生成
            // float midRadius = (maxRadius + minRadius) / 2;
            // float minRate = Random.Range(1.0f, midRadius / minRadius);
            // float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
            // float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 使用高斯分布生成半径, 均值为midRadius,标准差为0.7
            float midRadius = (maxRadius + minRadius) / 2;
            float radius    = (float)normalGenerator.NextGaussian(midRadius, 0.7);

            float angle        = Random.Range(0.0f, 360.0f);
            float theta        = angle / 180 * Mathf.PI;
            float time         = Random.Range(0.0f, 360.0f);          // 给粒子生成一个随机的初始进度
            float radiusChange = Random.Range(0.0f, maxRadiusChange); // 随机生成一个轨道变化大小
            StatusArr[i]            = new ParticleStatus(radius, angle, time, radiusChange);
            particleArr[i].position = computePos(radius, theta);
        }
        particleSys.SetParticles(particleArr, particleArr.Length);
    }
Esempio n. 5
0
        public void Update(GameTime gameTime)
        {
            var delta = (float)gameTime.ElapsedGameTime.TotalSeconds;

            time_elapsed += delta;
            if (lifetime != 0)
            {
                if (time_elapsed > lifetime)
                {
                    status = ParticleStatus.Dying;
                }
            }
            for (var i = 0; i < particles.Count; i++)
            {
                if (particles[i].isAlive)
                {
                    particles[i].Update(delta);
                }
            }
            for (var i = 0; i < particles.Count; i++)
            {
                if (!particles[i].isAlive)
                {
                    freeParticles.Enqueue(particles[i]);
                    particles.RemoveAt(i);
                    i--;
                }
            }
            if (status != ParticleStatus.Dying)
            {
                makeParticles();
            }
            if (status == ParticleStatus.Dying && particles.Count == 0)
            {
                status = ParticleStatus.Dead;
            }
        }
Esempio n. 6
0
 public void Update(GameTime gameTime)
 {
     var delta = (float)gameTime.ElapsedGameTime.TotalSeconds;
     time_elapsed += delta;
     if (lifetime != 0)
     {
         if (time_elapsed > lifetime)
             status = ParticleStatus.Dying;
     }
     for (var i = 0; i < particles.Count; i++)
     {
         if (particles[i].isAlive)
         {
             particles[i].Update(delta);
         }
     }
     for (var i = 0; i < particles.Count; i++)
     {
         if (!particles[i].isAlive)
         {
             freeParticles.Enqueue(particles[i]);
             particles.RemoveAt(i);
             i--;
         }
     }
     if (status != ParticleStatus.Dying)
         makeParticles();
     if (status == ParticleStatus.Dying && particles.Count == 0)
         status = ParticleStatus.Dead;
 }
Esempio n. 7
0
 public void Initialize(ParticleSystemInfo particleInfo, Vector2 origin, float lifetime)
 {
     for (var i = particles.Count - 1; i > 0; i--)
     {
         particles[i].isAlive = false;
     }
     status = ParticleStatus.Alive;
     this.particleInfo = particleInfo;
     this.origin = origin;
     makeParticles();
     this.lifetime = lifetime;
     this.time_elapsed = 0;
 }