source: 2011/23/sijoseha/AdventureGame/AdventureGame/AdventureGame.cs @ 1822

Revision 1822, 13.1 KB checked in by tekrjant, 8 years ago (diff)

Generates random map on startup.
Saving works and loading added
Minor "optimization" done

Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.IO;
5using System.Text;
6using System.Xml;
7using Microsoft.Xna.Framework;
8using Microsoft.Xna.Framework.Audio;
9using Microsoft.Xna.Framework.Content;
10using Microsoft.Xna.Framework.GamerServices;
11using Microsoft.Xna.Framework.Graphics;
12using Microsoft.Xna.Framework.Input;
13using Microsoft.Xna.Framework.Media;
14
15namespace AdventureGame
16{
17    /// <summary>
18    /// This is the main type for your game
19    /// </summary>
20    public class AdventureGame : Microsoft.Xna.Framework.Game
21    {
22        #region PublicStuff
23
24        GraphicsDeviceManager graphics;
25       
26        SpriteBatch spriteBatch;
27
28        static public int TILE_SIZE = 32;
29        static public Texture2D selectionBox;
30        static public SpriteFont basicFont;
31        Texture2D tileImage;
32        Texture2D miniMapBorders;
33        MouseState mouseState, previousMouseState;
34        KeyboardState keyState, previousKeyState;
35
36        Map gameMap;
37        Camera gameCamera;
38        HUD gameHUD;
39
40        Viewport mapView, hudView, miniMapView;
41
42        #endregion
43
44        public AdventureGame()
45        {
46            graphics = new GraphicsDeviceManager(this);
47            Content.RootDirectory = "Content";
48        }
49
50        /// <summary>
51        /// Allows the game to perform any initialization it needs to before starting to run.
52        /// This is where it can query for any required services and load any non-graphic
53        /// related content.  Calling base.Initialize will enumerate through any components
54        /// and initialize them as well.
55        /// </summary>
56        protected override void Initialize()
57        {
58            IsMouseVisible = true;
59            base.Initialize();
60        }
61
62        /// <summary>
63        /// LoadContent will be called once per game and is the place to load
64        /// all of your content.
65        /// </summary>
66        protected override void LoadContent()
67        {
68            // Create a new SpriteBatch, which can be used to draw textures.
69            spriteBatch = new SpriteBatch(GraphicsDevice);
70
71            LoadTextures();
72            basicFont = Content.Load<SpriteFont>("Basicfont");
73
74            CreateViews();
75            gameMap = new Map(this, tileImage, TILE_SIZE, 5000, 5000);
76            CreateHUD();
77
78            gameCamera = new Camera(mapView);
79        }
80
81        /// <summary>
82        /// UnloadContent will be called once per game and is the place to unload
83        /// all content.
84        /// </summary>
85        protected override void UnloadContent()
86        {
87            // TODO: Unload any non ContentManager content here
88        }
89
90        #region Updating
91
92        /// <summary>
93        /// Allows the game to run logic such as updating the world,
94        /// checking for collisions, gathering input, and playing audio.
95        /// </summary>
96        /// <param name="gameTime">Provides a snapshot of timing values.</param>
97        protected override void Update(GameTime gameTime)
98        {
99            // Allows the game to exit
100            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
101                this.Exit();
102
103            UpdateMouse();
104            UpdateKeyboard();
105           
106            base.Update(gameTime);
107        }
108
109        private void UpdateMouse()
110        {
111            mouseState = Mouse.GetState();
112
113            if (previousMouseState.LeftButton == ButtonState.Released && mouseState.LeftButton == ButtonState.Pressed)
114            {
115                if (mouseState.X < gameHUD.ViewPort.X)
116                {
117                    Vector2 mouseWorldPos = gameCamera.getMouseWorldPos(new Vector2(mouseState.X, mouseState.Y), mapView);
118                    Rectangle mousePos = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
119                    foreach (Tile tile in gameMap.Tiles)
120                    {
121                        if (mousePos.Intersects(tile.Boundaries))
122                        {
123                            gameMap.UnSelectAll();
124                            gameMap.SelectTile(tile);
125                        }
126                    }
127                }
128                else
129                {
130                    Vector2 mouseWorldPos = gameCamera.getMouseWorldPos(new Vector2(mouseState.X - gameHUD.ViewPort.X, mouseState.Y), gameHUD.ViewPort);
131                    Rectangle mousePos = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
132                    foreach (Button button in gameHUD.Buttons)
133                    {
134                        if (mousePos.Intersects(button.Boundaries))
135                            if (button.Selectable)
136                                gameHUD.Select(button);
137                            else
138                                button.Pressed();
139                    }
140                }
141            }
142
143            if (previousMouseState.RightButton == ButtonState.Released && mouseState.RightButton == ButtonState.Pressed)
144            {
145                if (mouseState.X < gameHUD.ViewPort.X)
146                {
147                    Vector2 mouseWorldPos = gameCamera.getMouseWorldPos(new Vector2(mouseState.X, mouseState.Y), mapView);
148                    Rectangle mousePos = new Rectangle((int)mouseWorldPos.X, (int)mouseWorldPos.Y, 1, 1);
149                    foreach (Tile tile in gameMap.Tiles)
150                    {
151                        if (mousePos.Intersects(tile.Boundaries))
152                        {
153                            gameMap.ChangeTileTo(tile, gameHUD.SelectedButton.RelatedTileType);
154                        }
155                    }
156                }
157            }
158
159            previousMouseState = mouseState;
160        }
161
162        private void UpdateKeyboard()
163        {
164            keyState = Keyboard.GetState();
165            if (keyState.IsKeyDown(Keys.D1) && previousKeyState.IsKeyUp(Keys.D1))
166                gameMap.ChangeTileTo(TileType.Grass);
167            if (keyState.IsKeyDown(Keys.D2) && previousKeyState.IsKeyUp(Keys.D2))
168                gameMap.ChangeTileTo(TileType.DarkGrass);
169            if (keyState.IsKeyDown(Keys.D3) && previousKeyState.IsKeyUp(Keys.D3))
170                gameMap.ChangeTileTo(TileType.Sand);
171            if (keyState.IsKeyDown(Keys.D4) && previousKeyState.IsKeyUp(Keys.D4))
172                gameMap.ChangeTileTo(TileType.Water);
173
174            if (keyState.IsKeyDown(Keys.Left))
175                gameCamera.Move(new Vector2(-5, 0));
176            if (keyState.IsKeyDown(Keys.Right))
177                gameCamera.Move(new Vector2(5, 0));
178            if (keyState.IsKeyDown(Keys.Up))
179                gameCamera.Move(new Vector2(0, -5));
180            if (keyState.IsKeyDown(Keys.Down))
181                gameCamera.Move(new Vector2(0, 5));
182
183            previousKeyState = keyState;
184        }
185
186        private void LoadTextures()
187        {
188            selectionBox = Content.Load<Texture2D>("selectionbox");
189            tileImage = Content.Load<Texture2D>("tilet");
190            miniMapBorders = Content.Load<Texture2D>("miniMapBorders");
191        }
192        #endregion
193
194        #region Drawing
195
196        /// <summary>
197        /// This is called when the game should draw itself.
198        /// </summary>
199        /// <param name="gameTime">Provides a snapshot of timing values.</param>
200        protected override void Draw(GameTime gameTime)
201        {
202            GraphicsDevice.Clear(Color.CornflowerBlue);
203            DrawMap();
204            DrawHUD();
205            //DrawMiniMap();
206            base.Draw(gameTime);
207        }
208
209        private void DrawMiniMap()
210        {
211            GraphicsDevice.Viewport = miniMapView;
212            spriteBatch.Begin(SpriteSortMode.Deferred,
213                BlendState.AlphaBlend,
214                null, null, null, null, gameCamera.getTransformation(miniMapView, true, gameMap.Size));
215            gameHUD.DrawMinimap(spriteBatch);
216            spriteBatch.End();
217            spriteBatch.Begin();
218            spriteBatch.Draw(gameHUD.MiniMap.Borders, new Rectangle(0, 0, 200, 200), Color.White);
219            spriteBatch.End();
220        }
221
222        private void DrawHUD()
223        {
224            GraphicsDevice.Viewport = gameHUD.ViewPort;
225            spriteBatch.Begin();
226            gameHUD.Draw(spriteBatch);
227            spriteBatch.End();
228        }
229
230        private void DrawMap()
231        {
232            GraphicsDevice.Viewport = mapView;
233            spriteBatch.Begin(SpriteSortMode.Deferred,
234                BlendState.AlphaBlend,
235                null, null, null, null, gameCamera.getTransformation(mapView));
236            gameMap.Draw(spriteBatch, gameCamera);
237            spriteBatch.End();
238        }
239
240        #endregion
241
242        private void CreateViews()
243        {
244            mapView = new Viewport(0, 0,
245                graphics.PreferredBackBufferWidth - 200,
246                graphics.PreferredBackBufferHeight);
247            hudView = new Viewport(graphics.PreferredBackBufferWidth - 200,
248                0, 200, graphics.PreferredBackBufferHeight);
249            miniMapView = new Viewport(graphics.PreferredBackBufferWidth - 200,
250                graphics.PreferredBackBufferHeight - 200, 200, 200);
251        }
252
253        private void CreateHUD()
254        {
255            gameHUD = new HUD();
256            gameHUD.ViewPort = hudView;
257            Button LoadButton = new Button
258                (new Rectangle(10, 150, 150, 40),
259                "Load", Color.YellowGreen, Color.Red, GraphicsDevice);
260            LoadButton.Clicked += LoadMap;
261            gameHUD.AddButton(LoadButton);
262
263            Button SaveButton = new Button
264                (new Rectangle(10, 10, 150, 40),
265                "Save", Color.YellowGreen, Color.Red, GraphicsDevice);
266
267            SaveButton.Clicked += SaveMap;
268            gameHUD.AddButton(SaveButton);
269
270            Button grassButton = new Button(
271                new Rectangle(10, 60, 32, 32), gameMap.textureType[TileType.Grass],
272                Color.Red, true, GraphicsDevice);
273            grassButton.RelatedTileType = TileType.Grass;
274
275            Button sandButton = new Button(
276                new Rectangle(10, 100, 32, 32), gameMap.textureType[TileType.Sand],
277                Color.Red, true, GraphicsDevice);
278            sandButton.RelatedTileType = TileType.Sand;
279
280            gameHUD.AddButton(grassButton);
281            gameHUD.AddButton(sandButton);
282            gameHUD.AddMiniMap(new MiniMap(gameMap, miniMapView, miniMapBorders));
283
284        }
285
286        private bool SelectHudTile()
287        {
288            return false;
289        }
290
291        private void LoadMap(object sender, EventArgs e)
292        {
293            using (FileStream mapLoad = new FileStream("savedMap", FileMode.Open, FileAccess.Read))
294            {
295                using (BinaryReader r = new BinaryReader(mapLoad))
296                {
297                    int amount = r.ReadInt32();
298                    for (int i = 0; i < amount; i++)
299                    {
300                        int tile = r.ReadInt32();
301                        int x = r.ReadInt32();
302                        int y = r.ReadInt32();
303                        bool passable = r.ReadBoolean();
304                        Tile newTile = new Tile((TileType)tile,
305                            new Rectangle(x,y,TILE_SIZE,TILE_SIZE));
306                        newTile.Passable = passable;
307                        gameMap.Tiles.Add(newTile);
308                    }
309                }
310            }
311        }
312
313        private void SaveMap(object sender, EventArgs e)
314        {
315            //FileStream mapFile = File.Create("savedMap,xml");
316            using (FileStream mapSave = new FileStream("savedMap", FileMode.Create, FileAccess.Write))
317            {
318                using (BinaryWriter w = new BinaryWriter(mapSave))
319                {
320                    w.Write(gameMap.Tiles.Count);
321                    foreach (Tile tile in gameMap.Tiles)
322                    {
323                        w.Write((int)tile.TileType);
324                        w.Write((int)tile.Position.X);
325                        w.Write((int)tile.Position.Y);
326                        w.Write(tile.Passable);
327                    }
328                }
329            }
330
331            using (FileStream mapLoad = new FileStream("savedMap", FileMode.Open, FileAccess.Read))
332            {
333                using (BinaryReader r = new BinaryReader(mapLoad))
334                {
335                    using (StreamWriter random = new StreamWriter("clear.txt"))
336                    {
337                        int amount = r.ReadInt32();
338                        for (int i = 0; i < amount; i++)
339                        {
340                            int tile = r.ReadInt32();
341                            int x = r.ReadInt32();
342                            int y = r.ReadInt32();
343                            bool passable = r.ReadBoolean();
344                            random.WriteLine(tile.ToString() + ' ' + x.ToString() + ' ' + y.ToString() + ' ' + passable.ToString());
345                        }
346                    }
347                }
348            }           
349        }
350    }
351}
Note: See TracBrowser for help on using the repository browser.