GameScreen.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //-----------------------------------------------------------------------------
  2. // GameScreen.cs
  3. //
  4. // Microsoft XNA Community Game Platform
  5. // Copyright (C) Microsoft Corporation. All rights reserved.
  6. //-----------------------------------------------------------------------------
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Text;
  10. using RacingGame.GameLogic;
  11. using RacingGame.Graphics;
  12. using RacingGame.Helpers;
  13. using RacingGame.Properties;
  14. using RacingGame.Landscapes;
  15. using Microsoft.Xna.Framework;
  16. using RacingGame.Shaders;
  17. using RacingGame.Sounds;
  18. namespace RacingGame.GameScreens
  19. {
  20. /// <summary>
  21. /// GameScreen, just manages the on screen display for the game.
  22. /// </summary>
  23. class GameScreen : IGameScreen
  24. {
  25. /// <summary>
  26. /// Create game screen
  27. /// </summary>
  28. public GameScreen()
  29. {
  30. // Load level
  31. RacingGameManager.LoadLevel(TrackSelection.SelectedTrack);
  32. // Reset player variables (start new game, reset time and position)
  33. RacingGameManager.Player.Reset();
  34. // Fix light direction (was changed by CarSelection screen!)
  35. // LightDirection will normalize
  36. BaseGame.LightDirection = LensFlare.DefaultLightPos;
  37. // Start gear sound
  38. Sound.StartGearSound();
  39. // Play game music
  40. Sound.Play(Sound.Sounds.GameMusic);
  41. }
  42. /// <summary>
  43. /// Unimplemented
  44. /// </summary>
  45. /// <param name="gameTime"></param>
  46. public void Update(GameTime gameTime)
  47. {
  48. }
  49. /// <summary>
  50. /// Render game screen. Called each frame.
  51. /// </summary>
  52. public bool Render()
  53. {
  54. ShadowMapShader.PrepareGameShadows();
  55. // This starts both menu and in game post screen shader!
  56. if( BaseGame.UsePostScreenShaders)
  57. BaseGame.UI.PostScreenGlowShader.Start();
  58. // Render background sky and lensflare.
  59. BaseGame.UI.RenderGameBackground();
  60. // Render landscape with track and all objects
  61. RacingGameManager.Landscape.Render();
  62. // Render car with matrix we got from CarPhysics
  63. RacingGameManager.CarModel.RenderCar(
  64. RacingGameManager.currentCarNumber,
  65. RacingGameManager.CarColor,
  66. false,
  67. RacingGameManager.Player.CarRenderMatrix);
  68. // And flush all models to be rendered
  69. BaseGame.MeshRenderManager.Render();
  70. // Use data from best replay for the shadow car
  71. Matrix bestReplayCarMatrix =
  72. RacingGameManager.Landscape.BestReplay.GetCarMatrixAtTime(
  73. RacingGameManager.Player.GameTimeMilliseconds / 1000.0f);
  74. // For rendering rotate car to stay correctly on the road
  75. bestReplayCarMatrix =
  76. Matrix.CreateRotationX(MathHelper.Pi / 2.0f) *
  77. Matrix.CreateRotationZ(MathHelper.Pi) *
  78. bestReplayCarMatrix;
  79. // Also render the shadow car (if the game has started)!
  80. if (RacingGameManager.Player.GameTimeMilliseconds > 0)
  81. RacingGameManager.CarModel.RenderCar(
  82. 0, RacingGameManager.CarColor,
  83. true, bestReplayCarMatrix);
  84. // Show shadows we calculated above
  85. if (BaseGame.AllowShadowMapping)
  86. ShaderEffect.shadowMapping.ShowShadows();
  87. // Apply post screen shader here before doing the UI
  88. if (BaseGame.UsePostScreenShaders)
  89. BaseGame.UI.PostScreenGlowShader.Show();
  90. // Play motor sound
  91. Sound.UpdateGearSound(RacingGameManager.Player.Speed,
  92. RacingGameManager.Player.Acceleration);
  93. // Show on screen UI for the game.
  94. // Note: Could be improved by using the latest checkpoints and
  95. // check times this way!
  96. BaseGame.UI.RenderGameUI(
  97. (int)RacingGameManager.Player.GameTimeMilliseconds,
  98. // Best time and current lap
  99. (int)RacingGameManager.Player.BestTimeMilliseconds,
  100. RacingGameManager.Player.CurrentLap + 1,
  101. RacingGameManager.Player.Speed * CarPhysics.MeterPerSecToMph,
  102. // Gear logic with sound (could be improved ^^)
  103. 1 + (int)(5 * RacingGameManager.Player.Speed /
  104. CarPhysics.MaxPossibleSpeed),
  105. // Motormeter
  106. 0.5f * RacingGameManager.Player.Speed /
  107. CarPhysics.MaxPossibleSpeed +
  108. // This could be improved
  109. 0.5f * RacingGameManager.Player.Acceleration,
  110. RacingGameManager.Landscape.CurrentTrackName,
  111. Highscores.GetTop5LapTimes(TrackSelection.SelectedTrackNumber));
  112. if (Input.KeyboardEscapeJustPressed ||
  113. Input.GamePadBackJustPressed ||
  114. (RacingGameManager.Player.GameOver &&
  115. (Input.KeyboardSpaceJustPressed ||
  116. Input.GamePadAJustPressed ||
  117. Input.GamePadBJustPressed ||
  118. Input.GamePadXJustPressed ||
  119. Input.GamePadXJustPressed ||
  120. Input.MouseLeftButtonJustPressed)))
  121. {
  122. // Stop motor sound
  123. Sound.StopGearSound();
  124. // Play menu music again
  125. Sound.Play(Sound.Sounds.MenuMusic);
  126. // Return to menu
  127. return true;
  128. }
  129. return false;
  130. }
  131. }
  132. }