source: 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Game.cs @ 4743

Revision 4743, 8.4 KB checked in by dezhidki, 6 years ago (diff)

Talletus.

Line 
1using CastleMaster.Graphics;
2using CastleMaster.Input;
3using CastleMaster.World;
4using Microsoft.Xna.Framework;
5using Microsoft.Xna.Framework.Graphics;
6using SharpNeatLib.Maths;
7using System;
8using System.Text;
9using System.Windows.Forms;
10using Keys = System.Windows.Forms.Keys;
11using Viewport = CastleMaster.Graphics.Viewport;
12using CastleMaster.Players;
13using CastleMaster.Guis;
14
15// NOTES:
16// If VSYNC problems/Lag problems go to line 73 to enable/disable VSYNC
17namespace CastleMaster
18{
19    public class Game : Microsoft.Xna.Framework.Game
20    {
21        public const int WIDTH = 800;
22        public const int HEIGHT = 600;
23        public const string TITLE = "Castle Master";
24        public const string VERSION = "Alpha";
25
26        private GraphicsDeviceManager graphics;
27        private SpriteBatch spriteBatch;
28        private InputHandler input;
29        private RenderHelper renderer;
30        private Camera camera;
31        private LevelForest level;
32        private Player[] players;
33        private static GuiManager guiManager;
34        private GuiDebug debugScreen;
35        private GuiPlayer ingame;
36        private GuiMainScreen mainScreen;
37        private bool isGameRunning = false;
38        private static Game instance;
39
40        #region Counter
41        private readonly TimeSpan ONE_SECOND = TimeSpan.FromSeconds(1.0);
42        private TimeSpan currentTime = TimeSpan.Zero;
43        private int frames = 0, updates = 0, fps = 0, ups = 0;
44        #endregion
45
46        public static FastRandom Random { get; private set; }
47
48        public static readonly Team TEAM1 = new Team("Team1", 0);
49        public static readonly Team TEAM2 = new Team("Team2", 1);
50
51        public Game()
52        {
53            graphics = new GraphicsDeviceManager(this);
54            Content.RootDirectory = "Content";
55            input = new InputHandler(Window);
56            Random = new FastRandom();
57            players = new Player[2];
58            guiManager = new GuiManager();
59            IsGamePaused = true;
60            instance = this;
61        }
62
63        public static GuiManager GuiManager { get { return guiManager; } }
64
65        public int FPS { get { return fps; } }
66
67        public int UPS { get { return ups; } }
68
69        public bool IsGameRunning { get { return isGameRunning; } }
70
71        public bool IsGamePaused { get; set; }
72
73        public static Game Instance { get { return instance; } }
74
75        protected override void Initialize()
76        {
77            graphics.PreferredBackBufferWidth = WIDTH;
78            graphics.PreferredBackBufferHeight = HEIGHT;
79            // NOTE: If enabled on some computers, the FPS will drop too much to play
80            graphics.SynchronizeWithVerticalRetrace = false;
81            graphics.ApplyChanges();
82            Window.Title = TITLE;
83
84            InitializeInput();
85
86            base.Initialize();
87        }
88
89        private void InitializeInput()
90        {
91            input.RegisterKeyboardKey(Keys.Escape);
92            input.RegisterKeyboardKey(Keys.W);
93            input.RegisterKeyboardKey(Keys.A);
94            input.RegisterKeyboardKey(Keys.S);
95            input.RegisterKeyboardKey(Keys.D);
96            input.RegisterKeyboardKey(Keys.F4);
97            input.RegisterKeyboardKey(Keys.F1);
98            input.RegisterKeyboardKey(Keys.F2);
99            input.RegisterKeyboardKey(Keys.ShiftKey);
100            input.RegisterKeyboardKey(Keys.ControlKey);
101            input.RegisterKeyboardKey(Keys.Up);
102            input.RegisterKeyboardKey(Keys.Down);
103            input.RegisterKeyboardKey(Keys.Left);
104            input.RegisterKeyboardKey(Keys.Right);
105            input.RegisterKeyboardKey(Keys.Enter);
106            input.RegisterKeyboardKey(Keys.X);
107
108            input.RegisterMouseKey(MouseButtons.Middle);
109            input.RegisterMouseKey(MouseButtons.Right);
110            input.RegisterMouseKey(MouseButtons.Left);
111        }
112
113        public void OpenMainMenu()
114        {
115            ResetGame();
116            guiManager.AddGui(mainScreen, true, true);
117        }
118
119        public void ResetGame()
120        {
121            IsGamePaused = true;
122            isGameRunning = false;
123            level = null;
124            camera = null;
125            players = new Player[2];
126            if (ingame != null)
127                ingame.Remove();
128            GC.Collect();
129        }
130
131        public void StartGame()
132        {
133            if (isGameRunning)
134                ResetGame();
135
136            IsGamePaused = false;
137            isGameRunning = true;
138
139            mainScreen.Remove();
140
141            level = new LevelForest(Content.Load<Texture2D>("levels/levelForest"));
142            camera = new Camera(level);
143            AddPlayer(new PlayerReal(TEAM1, level, camera));
144            AddPlayer(new PlayerAI(TEAM2, level, camera, PlayerAI.DIFFICULTY_EASY, players[0]));
145            level.InitLevel();
146            foreach (Player p in players)
147                if (p != null) p.OnLevelLoaded();
148            camera.CenterOn(100 * Viewport.TILESIZE, 15 * Viewport.TILESIZE);
149
150            ingame = new GuiPlayer(guiManager, players[0]);
151            guiManager.AddGui(ingame, true);
152        }
153
154        private void AddPlayer(Player p)
155        {
156            players[p.Team.ID] = p;
157            level.SetPlayer(p, p.Team.ID);
158        }
159
160        public static Team GetEnemyTeam(Team team)
161        {
162            return team == TEAM1 ? TEAM2 : TEAM1;
163        }
164
165        protected override void LoadContent()
166        {
167            spriteBatch = new SpriteBatch(GraphicsDevice);
168            renderer = new RenderHelper(spriteBatch);
169
170            Resources.LoadResources(Content, renderer);
171        }
172
173        protected override void UnloadContent()
174        {
175            RenderHelper.EmptyTexture.Dispose();
176        }
177
178        protected override void BeginRun()
179        {
180            base.BeginRun();
181
182            debugScreen = new GuiDebug(guiManager, this);
183            guiManager.AddGui(debugScreen, false);
184
185            mainScreen = new GuiMainScreen(guiManager, this);
186            OpenMainMenu();
187        }
188
189        protected override void Update(GameTime gameTime)
190        {
191            input.Update();
192
193            if (InputHandler.HasKeyBeenPressed(Keys.F1))
194            {
195                debugScreen.IsActive = !debugScreen.IsActive;
196            }
197            if (InputHandler.HasKeyBeenPressed(Keys.F4))
198                IsFixedTimeStep = !IsFixedTimeStep;
199            if (InputHandler.HasKeyBeenPressed(Keys.Escape) && (guiManager.ImportantGui == null || !(guiManager.ImportantGui is GuiWinLooseMessage)))
200            {
201                if (isGameRunning)
202                {
203                    if (!mainScreen.IsActive)
204                        guiManager.AddGui(mainScreen, true, true);
205                    else
206                        mainScreen.Remove();
207
208                    IsGamePaused = mainScreen.IsActive;
209                }
210                else Exit();
211            }
212
213            if (isGameRunning && !IsGamePaused)
214            {
215                if (InputHandler.MouseScrollDelta > 1)
216                    camera.Zoom(Viewport.ZOOM_STEP);
217                else if (InputHandler.MouseScrollDelta < 0)
218                    camera.Zoom(-Viewport.ZOOM_STEP);
219
220                foreach (Player p in players)
221                    if (p != null)
222                        p.Update();
223
224                camera.Update();
225
226                level.Update();
227            }
228
229            guiManager.Update();
230
231            updates++;
232            currentTime += gameTime.ElapsedGameTime;
233            if (currentTime >= ONE_SECOND)
234            {
235                currentTime = TimeSpan.Zero;
236                fps = frames;
237                ups = updates;
238                frames = updates = 0;
239            }
240
241            base.Update(gameTime);
242        }
243
244        protected override void Draw(GameTime gameTime)
245        {
246            GraphicsDevice.Clear(Color.Black);
247
248            renderer.BeginRender();
249
250            if (isGameRunning)
251            {
252                level.RenderBackground(camera, renderer);
253                camera.RenderSelelctor(renderer);
254                level.RenderEntities(camera, renderer);
255            }
256
257            guiManager.Render(renderer);
258            if (isGameRunning)
259                camera.RenderCursor(renderer);
260            renderer.EndRender();
261
262            frames++;
263            base.Draw(gameTime);
264        }
265    }
266}
Note: See TracBrowser for help on using the repository browser.