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

Revision 4756, 8.9 KB checked in by dezhidki, 8 years ago (diff)
  • Nimi muutettu (Sound2D -> Audio)
  • Lisätty perusäänet
  • Muokattu Ctrl + RMouse kombinaatiota
    • Nyt voi myös klikata sen sijaan että valitsee laatikolla
Line 
1using CastleMaster.Graphics;
2using CastleMaster.Guis;
3using CastleMaster.Input;
4using CastleMaster.Players;
5using CastleMaster.Sound;
6using CastleMaster.World;
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Graphics;
9using SharpNeatLib.Maths;
10using System;
11using System.Windows.Forms;
12using Keys = System.Windows.Forms.Keys;
13using Viewport = CastleMaster.Graphics.Viewport;
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 = "Beta 1.0";
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        private Audio sound;
38
39        #region Counter
40        private readonly TimeSpan ONE_SECOND = TimeSpan.FromSeconds(1.0);
41        private TimeSpan currentTime = TimeSpan.Zero;
42        private int frames = 0, updates = 0, fps = 0, ups = 0;
43        #endregion
44
45        public static FastRandom Random { get; private set; }
46
47        public static Team TEAM1 { get; private set; }
48        public static Team TEAM2 { get; private set; }
49
50        public Game()
51        {
52            graphics = new GraphicsDeviceManager(this);
53            Content.RootDirectory = "Content";
54            input = new InputHandler(Window);
55            Random = new FastRandom();
56            players = new Player[2];
57            guiManager = new GuiManager();
58            IsGamePaused = true;
59            instance = this;
60        }
61
62        public static GuiManager GuiManager { get { return guiManager; } }
63
64        public int FPS { get { return fps; } }
65
66        public int UPS { get { return ups; } }
67
68        public bool IsGameRunning { get { return isGameRunning; } }
69
70        public bool IsGamePaused { get; set; }
71
72        public static Game Instance { get { return instance; } }
73
74        protected override void Initialize()
75        {
76            graphics.PreferredBackBufferWidth = WIDTH;
77            graphics.PreferredBackBufferHeight = HEIGHT;
78            // NOTE: If enabled on some computers, the FPS will drop too much to play
79            graphics.SynchronizeWithVerticalRetrace = false;
80            graphics.ApplyChanges();
81            Window.Title = TITLE;
82
83            InitializeInput();
84
85            base.Initialize();
86        }
87
88        private void InitializeInput()
89        {
90            input.RegisterKeyboardKey(Keys.Escape);
91            input.RegisterKeyboardKey(Keys.W);
92            input.RegisterKeyboardKey(Keys.A);
93            input.RegisterKeyboardKey(Keys.S);
94            input.RegisterKeyboardKey(Keys.D);
95            input.RegisterKeyboardKey(Keys.F4);
96            input.RegisterKeyboardKey(Keys.F1);
97            input.RegisterKeyboardKey(Keys.F2);
98            input.RegisterKeyboardKey(Keys.ShiftKey);
99            input.RegisterKeyboardKey(Keys.ControlKey);
100            input.RegisterKeyboardKey(Keys.Up);
101            input.RegisterKeyboardKey(Keys.Down);
102            input.RegisterKeyboardKey(Keys.Left);
103            input.RegisterKeyboardKey(Keys.Right);
104            input.RegisterKeyboardKey(Keys.Enter);
105            input.RegisterKeyboardKey(Keys.X);
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            sound.Camera = camera;
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        public static Player GetEnemyPlayer(Player player)
166        {
167            return player.Team == TEAM1 ? players[1] : players[0];
168        }
169
170        protected override void LoadContent()
171        {
172            spriteBatch = new SpriteBatch(GraphicsDevice);
173            renderer = new RenderHelper(spriteBatch);
174
175            Resources.LoadResources(Content, renderer);
176            TEAM1 = new Team("BLUE", 0, Resources.SPRITESHEET_WOODCUTTER_BLU, Resources.SPRITESHEET_WARRIOR_BLU, Resources.SPRITESHEET_RANGER_BLU);
177            TEAM2 = new Team("RED", 1, Resources.SPRITESHEET_WOODCUTTER_RED, Resources.SPRITESHEET_WARRIOR_RED, Resources.SPRITESHEET_RANGER_RED);
178            sound = new Audio("Content\\sound\\castlemaster.xgs", "Content\\sound\\waves.xwb", "Content\\sound\\sounds.xsb");
179        }
180
181        protected override void UnloadContent()
182        {
183            RenderHelper.EmptyTexture.Dispose();
184            sound.Dispose();
185        }
186
187        protected override void BeginRun()
188        {
189            base.BeginRun();
190
191            debugScreen = new GuiDebug(guiManager, this);
192            guiManager.AddGui(debugScreen, false);
193
194            mainScreen = new GuiMainScreen(guiManager, this);
195            OpenMainMenu();
196        }
197
198        protected override void Update(GameTime gameTime)
199        {
200            input.Update();
201
202            if (InputHandler.HasKeyBeenPressed(Keys.F1))
203            {
204                debugScreen.IsActive = !debugScreen.IsActive;
205            }
206            if (InputHandler.HasKeyBeenPressed(Keys.F4))
207                IsFixedTimeStep = !IsFixedTimeStep;
208            if (InputHandler.HasKeyBeenPressed(Keys.Escape) && (guiManager.ImportantGui == null || !(guiManager.ImportantGui is GuiWinLooseMessage)))
209            {
210                if (isGameRunning)
211                {
212                    if (!mainScreen.IsActive)
213                        guiManager.AddGui(mainScreen, true, true);
214                    else
215                        mainScreen.Remove();
216
217                    IsGamePaused = mainScreen.IsActive;
218                }
219                else Exit();
220            }
221
222            if (isGameRunning && !IsGamePaused)
223            {
224                foreach (Player p in players)
225                    if (p != null)
226                        p.Update();
227                //players[0].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.