GameRoot.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //---------------------------------------------------------------------------------
  2. // Written by Michael Hoffman
  3. // Find the full tutorial at: http://gamedev.tutsplus.com/series/vector-shooter-xna/
  4. //----------------------------------------------------------------------------------
  5. using System;
  6. using AtomicEngine;
  7. using AtomicPlayer;
  8. namespace AtomicBlaster
  9. {
  10. class GameRoot : NETScriptObject
  11. {
  12. public static Scene Scene { get; private set; }
  13. public static float ElapsedTime { get; private set; }
  14. public static Vector2 ScreenSize { get; private set; }
  15. public static IntRect ScreenBounds { get; private set; }
  16. public static Grid Grid { get; private set; }
  17. public static ParticleManager<ParticleState> ParticleManager { get; private set; }
  18. bool paused = false;
  19. public GameRoot()
  20. {
  21. Art.Load();
  22. var graphics = AtomicNET.GetSubsystem<Graphics>();
  23. float width = graphics.Width;
  24. float height = graphics.Height;
  25. ScreenSize = new Vector2(width, height);
  26. ScreenBounds = new IntRect(0, 0, (int)ScreenSize.X, (int)ScreenSize.Y);
  27. ParticleManager = new ParticleManager<ParticleState>(1024 * 20, ParticleState.UpdateParticle);
  28. const int maxGridPoints = 1600;
  29. float amt = (float)Math.Sqrt(ScreenBounds.Width * ScreenBounds.Height / maxGridPoints);
  30. Vector2 gridSpacing = new Vector2(amt, amt);
  31. Grid = new Grid(ScreenBounds, gridSpacing);
  32. EntityManager.Add(PlayerShip.Instance);
  33. var renderer = AtomicNET.GetSubsystem<Renderer>();
  34. var viewport = renderer.GetViewport(0);
  35. renderer.HDRRendering = true;
  36. var renderpath = viewport.GetRenderPath().Clone();
  37. renderpath.Append(AtomicNET.Cache.GetResource<XMLFile>("RenderPath/BloomHDR.xml"));
  38. renderpath.Append(AtomicNET.Cache.GetResource<XMLFile>("RenderPath/Blur.xml"));
  39. viewport.SetRenderPath(renderpath);
  40. Scene = new Scene();
  41. Scene.CreateComponent<Octree>();
  42. var camera = Scene.CreateChild("Camera").CreateComponent<Camera>();
  43. camera.Node.Position = new Vector3(width / 2.0f, height / 2.0f, 0.0f);
  44. camera.Orthographic = true;
  45. camera.OrthoSize = height;
  46. viewport.Scene = Scene;
  47. viewport.Camera = camera;
  48. CustomRenderer.Initialize();
  49. SubscribeToEvent("Update", HandleUpdate);
  50. SubscribeToEvent("RenderPathEvent", HandleRenderPathEvent);
  51. }
  52. void HandleRenderPathEvent(uint eventType, ScriptVariantMap eventData)
  53. {
  54. if (eventData.GetString("name") != "customrender")
  55. return;
  56. CustomRenderer.Begin();
  57. Draw();
  58. CustomRenderer.End();
  59. }
  60. float deltaTime = 0.0f;
  61. void HandleUpdate(uint eventType, ScriptVariantMap eventData)
  62. {
  63. float time = eventData.GetFloat("timestep");
  64. deltaTime += time;
  65. ElapsedTime += time;// / 2.0f;
  66. if (deltaTime < 1.0f / 60.0f)
  67. return;
  68. deltaTime = 0.0f;
  69. ShipInput.Update();
  70. if (!paused)
  71. {
  72. PlayerStatus.Update();
  73. EntityManager.Update();
  74. EnemySpawner.Update();
  75. ParticleManager.Update();
  76. Grid.Update();
  77. }
  78. }
  79. void Draw()
  80. {
  81. EntityManager.Draw();
  82. Grid.Draw();
  83. ParticleManager.Draw();
  84. }
  85. }
  86. }