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

Revision 4713, 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 1.5";
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
107            input.RegisterMouseKey(MouseButtons.Middle);
108            input.RegisterMouseKey(MouseButtons.Right);
109            input.RegisterMouseKey(MouseButtons.Left);
110        }
111
112        public void OpenMainMenu()
113        {
114            ResetGame();
115            guiManager.AddGui(mainScreen, true, true);
116        }
117
118        public void ResetGame()
119        {
120            IsGamePaused = true;
121            isGameRunning = false;
122            level = null;
123            camera = null;
124            players = new Player[2];
125            if (ingame != null)
126                ingame.Remove();
127            GC.Collect();
128        }
129
130        public void StartGame()
131        {
132            if (isGameRunning)
133                ResetGame();
134
135            IsGamePaused = false;
136            isGameRunning = true;
137
138            mainScreen.Remove();
139
140            level = new LevelForest(Content.Load<Texture2D>("levels/levelForest"));
141            camera = new Camera(level);
142            AddPlayer(new PlayerReal(TEAM1, level, camera));
143            AddPlayer(new PlayerAI(TEAM2, level, camera, PlayerAI.DIFFICULTY_NORMAL, players[0]));
144            level.InitLevel();
145            foreach (Player p in players)
146                if (p != null) p.OnLevelLoaded();
147            camera.CenterOn(100 * Viewport.TILESIZE, 15 * Viewport.TILESIZE);
148
149            ingame = new GuiPlayer(guiManager, players[0]);
150            guiManager.AddGui(ingame, true);
151        }
152
153        private void AddPlayer(Player p)
154        {
155            players[p.Team.ID] = p;
156            level.SetPlayer(p, p.Team.ID);
157        }
158
159        public static Team GetEnemyTeam(Team team)
160        {
161            return team == TEAM1 ? TEAM2 : TEAM1;
162        }
163
164        protected override void LoadContent()
165        {
166            spriteBatch = new SpriteBatch(GraphicsDevice);
167            renderer = new RenderHelper(spriteBatch);
168
169            Resources.LoadResources(Content, renderer);
170        }
171
172        protected override void UnloadContent()
173        {
174            RenderHelper.EmptyTexture.Dispose();
175        }
176
177        protected override void BeginRun()
178        {
179            base.BeginRun();
180
181            debugScreen = new GuiDebug(guiManager, this);
182            guiManager.AddGui(debugScreen, false);
183
184            mainScreen = new GuiMainScreen(guiManager, this);
185            OpenMainMenu();
186        }
187
188        protected override void Update(GameTime gameTime)
189        {
190            input.Update();
191
192            if (InputHandler.HasKeyBeenPressed(Keys.F1))
193            {
194                debugScreen.IsActive = !debugScreen.IsActive;
195            }
196            if (InputHandler.HasKeyBeenPressed(Keys.F4))
197                IsFixedTimeStep = !IsFixedTimeStep;
198            if (InputHandler.HasKeyBeenPressed(Keys.Escape) && (guiManager.ImportantGui == null || !(guiManager.ImportantGui is GuiWinLooseMessage)))
199            {
200                if (isGameRunning)
201                {
202                    if (!mainScreen.IsActive)
203                        guiManager.AddGui(mainScreen, true, true);
204                    else
205                        mainScreen.Remove();
206
207                    IsGamePaused = mainScreen.IsActive;
208                }
209                else Exit();
210            }
211
212            if (isGameRunning && !IsGamePaused)
213            {
214                if (InputHandler.MouseScrollDelta > 1)
215                    camera.Zoom(Viewport.ZOOM_STEP);
216                else if (InputHandler.MouseScrollDelta < 0)
217                    camera.Zoom(-Viewport.ZOOM_STEP);
218
219                foreach (Player p in players)
220                    if (p != null)
221                        p.Update();
222
223                camera.Update();
224
225                level.Update();
226            }
227
228            guiManager.Update();
229
230            updates++;
231            currentTime += gameTime.ElapsedGameTime;
232            if (currentTime >= ONE_SECOND)
233            {
234                currentTime = TimeSpan.Zero;
235                fps = frames;
236                ups = updates;
237                frames = updates = 0;
238            }
239
240            base.Update(gameTime);
241        }
242
243        protected override void Draw(GameTime gameTime)
244        {
245            GraphicsDevice.Clear(Color.Black);
246
247            renderer.BeginRender();
248
249            if (isGameRunning)
250            {
251                level.RenderBackground(camera, renderer);
252                camera.RenderSelelctor(renderer);
253                level.RenderEntities(camera, renderer);
254            }
255
256            guiManager.Render(renderer);
257            if (isGameRunning)
258                camera.RenderCursor(renderer);
259            renderer.EndRender();
260
261            frames++;
262            base.Draw(gameTime);
263        }
264    }
265}
Note: See TracBrowser for help on using the repository browser.