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

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