using System; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using SerializedData; namespace BouncyCatIsBouncy { class Level { public delegate void LevelHandler(); public event LevelHandler OnWin; public event LevelHandler OnLose; public Texture2D Background { get; private set; } Cat m_cat; AudioBank m_music; public Level(string level, SpriteBatch batch, ContentManager content, Physics physics, Input input, ObjectManager manager, AudioBank music) { m_music = music; m_music.PlayCue("prelaunch"); m_cat = new Cat(batch, physics); manager.AddDynamicObject(m_cat); m_cat.OnLaunch += OnLaunch; m_cat.OnDeath += Lose; var controller = new CatController(input, m_cat, new Track()); manager.AddObject(controller); #if !EDITOR var levelData = content.Load(level + "-data"); var rand = new Random(); foreach (var obb in levelData.OBBs) { PhysicsBody body = SolidArea.Create(physics, new OBB(obb.Width, obb.Height, obb.Rotation, obb.Center)); if (obb.Sound.Length > 0) { var sound = content.Load(obb.Sound); body.OnCollision += (unused) => sound.Play(0.25f, (float)(rand.NextDouble() / 2.0), 0.0f); } body.CollisionResponseEnable = obb.Solid; HandleSpecialCases(body, manager, batch, obb.Special); } foreach (var rbb in levelData.RBBs) { PhysicsBody body = SolidArea.Create(physics, new RadialBB(rbb.Radius, rbb.Center)); if (rbb.Sound.Length > 0) { var sound = content.Load(rbb.Sound); body.OnCollision += (unused) => sound.Play(0.25f, (float)(rand.NextDouble() / 2.0), 0.0f); } body.CollisionResponseEnable = rbb.Solid; HandleSpecialCases(body, manager, batch, rbb.Special); } Background = content.Load(level + "-bg"); #endif manager.AddDynamicObject(new Cannon(batch, m_cat, input)); } Random rand = new Random(); private void HandleSpecialCases(PhysicsBody body, ObjectManager manager, SpriteBatch batch, string type) { switch (type) { case "Yarn": body.OnCollision += (unused) => Win(); manager.AddDynamicObject(new Yarn(batch, body.Position)); break; case "Heater": body.OnCollision += (unused) => Lose(); manager.AddDynamicObject(new Heater(batch, body)); break; case "Pigeon": manager.AddDynamicObject(new Pigeon(batch, body, (float)rand.NextDouble() * 570.0f)); break; case "Chandelier": manager.AddDynamicObject(new Chandelier(batch, body)); break; default: break; } } private void Win() { if (OnWin != null) { OnWin(); } } private void Lose() { if (OnLose != null) { OnLose(); } } private void OnLaunch() { m_music.PlayCue("launch"); } } }