public void Update() { bool DoSpawn = false; if (!_SpawnTimer.IsRunning) { _SpawnTimer.Start(); _NextSpawnTime = 0f; DoSpawn = true; } if (_SpawnTimer.ElapsedMilliseconds / 1000f > _NextSpawnTime && _NextSpawnTime >= 0f) { DoSpawn = true; _SpawnTimer.Reset(); _SpawnTimer.Start(); } while (_Stars.Count < _MaxNumber && DoSpawn) { float size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; float lifetime = 0f; float vx = 0f; float vy = 0f; float vr = 0f; float vsize = 0f; _NextSpawnTime = 0f; switch (_Type) { case EParticeType.Twinkle: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(500) / 1000f + 0.5f; vx = -CGame.Rand.Next(10000) / 50f + 100f; vy = -CGame.Rand.Next(10000) / 50f + 100f; vr = -CGame.Rand.Next(500) / 100f + 2.5f; vsize = lifetime * 2f; break; case EParticeType.Star: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(1000) / 500f + 0.2f; vx = -CGame.Rand.Next(1000) / 50f + 10f; vy = -CGame.Rand.Next(1000) / 50f + 10f; vr = -CGame.Rand.Next(500) / 100f + 2.5f; vsize = lifetime * 2f; break; case EParticeType.Snow: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(5000) / 50f + 10f; vx = -CGame.Rand.Next(1000) / 50f + 10f; vy = CGame.Rand.Next(1000) / 50f + Math.Abs(vx) + 10f; vr = -CGame.Rand.Next(200) / 50f + 2f; vsize = lifetime * 2f; _NextSpawnTime = lifetime / _MaxNumber; DoSpawn = false; break; case EParticeType.Flare: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(500) / 1000f + 0.1f; vx = -CGame.Rand.Next(2000) / 50f; vy = -CGame.Rand.Next(2000) / 50f + 20f; vr = -CGame.Rand.Next(2000) / 50f + 20f; vsize = lifetime * 2f; break; case EParticeType.PerfNoteStar: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(1000) / 500f + 1.2f; vx = 0f; vy = 0f; vr = CGame.Rand.Next(500) / 50f + 10f; vsize = lifetime * 2f; break; default: break; } int w = (int)(_Area.W - size / 4f); int h = (int)(_Area.H - size / 4f); if (w < 0) { w = 0; } if (h < 0) { h = 0; } CParticle star; if (_TextureName != String.Empty) { star = new CParticle(_TextureName, _Color, CGame.Rand.Next(w) + _Area.X - size / 4f, CGame.Rand.Next(h) + _Area.Y - size / 4f, size, lifetime, _Area.Z, vx, vy, vr, vsize, _Type); } else { star = new CParticle(_Texture, _Color, CGame.Rand.Next(w) + _Area.X - size / 4f, CGame.Rand.Next(h) + _Area.Y - size / 4f, size, lifetime, _Area.Z, vx, vy, vr, vsize, _Type); } _Stars.Add(star); } if (_Type == EParticeType.Flare || _Type == EParticeType.PerfNoteStar || _Type == EParticeType.Twinkle) { _NextSpawnTime = -1f; } int i = 0; while (i < _Stars.Count) { _Stars[i].Update(); if (!_Stars[i].IsAlive) { _Stars.RemoveAt(i); } else { i++; } } }
public void Update() { bool DoSpawn = false; if (!_SpawnTimer.IsRunning) { _SpawnTimer.Start(); _NextSpawnTime = 0f; DoSpawn = true; } if (_SpawnTimer.ElapsedMilliseconds / 1000f > _NextSpawnTime && _NextSpawnTime >= 0f) { DoSpawn = true; _SpawnTimer.Reset(); _SpawnTimer.Start(); } while (_Stars.Count < _MaxNumber && DoSpawn) { float size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; float lifetime = 0f; float vx = 0f; float vy = 0f; float vr = 0f; float vsize = 0f; _NextSpawnTime = 0f; switch (_Type) { case EParticeType.Twinkle: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(500) / 1000f + 0.5f; vx = -CGame.Rand.Next(10000) / 50f + 100f; vy = -CGame.Rand.Next(10000) / 50f + 100f; vr = -CGame.Rand.Next(500) / 100f + 2.5f; vsize = lifetime * 2f; break; case EParticeType.Star: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(1000) / 500f + 0.2f; vx = -CGame.Rand.Next(1000) / 50f + 10f; vy = -CGame.Rand.Next(1000) / 50f + 10f; vr = -CGame.Rand.Next(500) / 100f + 2.5f; vsize = lifetime * 2f; break; case EParticeType.Snow: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(5000) / 50f + 10f; vx = -CGame.Rand.Next(1000) / 50f + 10f; vy = CGame.Rand.Next(1000) / 50f + Math.Abs(vx) + 10f; vr = -CGame.Rand.Next(200) / 50f + 2f; vsize = lifetime * 2f; _NextSpawnTime = lifetime / _MaxNumber; DoSpawn = false; break; case EParticeType.Flare: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(500) / 1000f + 0.1f; vx = -CGame.Rand.Next(2000) / 50f; vy = -CGame.Rand.Next(2000) / 50f + 20f; vr = -CGame.Rand.Next(2000) / 50f + 20f; vsize = lifetime * 2f; break; case EParticeType.PerfNoteStar: size = CGame.Rand.Next((int)_Size / 2) + _Size / 2; lifetime = CGame.Rand.Next(1000) / 500f + 1.2f; vx = 0f; vy = 0f; vr = CGame.Rand.Next(500) / 50f + 10f; vsize = lifetime * 2f; break; default: break; } int w = (int)(_Area.W - size / 4f); int h = (int)(_Area.H - size / 4f); if (w < 0) w = 0; if (h < 0) h = 0; CParticle star; if (_TextureName != String.Empty) { star = new CParticle(_TextureName, _Color, CGame.Rand.Next(w) + _Area.X - size / 4f, CGame.Rand.Next(h) + _Area.Y - size / 4f, size, lifetime, _Area.Z, vx, vy, vr, vsize, _Type); } else { star = new CParticle(_Texture, _Color, CGame.Rand.Next(w) + _Area.X - size / 4f, CGame.Rand.Next(h) + _Area.Y - size / 4f, size, lifetime, _Area.Z, vx, vy, vr, vsize, _Type); } _Stars.Add(star); } if (_Type == EParticeType.Flare || _Type == EParticeType.PerfNoteStar || _Type == EParticeType.Twinkle) _NextSpawnTime = -1f; int i = 0; while (i < _Stars.Count) { _Stars[i].Update(); if (!_Stars[i].IsAlive) { _Stars.RemoveAt(i); } else i++; } }