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; }
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; }
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; }
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); }
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; } }
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; }
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; }