pacman/Pacman/Game1.cs

266 lines
7.9 KiB
C#

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System.Collections.Generic;
using Pacman.Classes;
using Pacman.Classes.UI;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Audio;
using System.Threading;
using System.IO;
namespace Pacman
{
public enum GameState
{
Game, Menu, GameOver, NextLevel, HowToPlay
}
public class Game1 : Game
{
public static GameState gameState = GameState.Menu;
public static Vector2 screenSize = new Vector2(672, 850);
public static Texture2D spriteSheet;
// Default fields
private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch;
public int Level = 0;
public static Pacman pacman = new Pacman();
public static List<Food> Foods = new List<Food>();
public static List<Ghost> Ghosts = new List<Ghost>();
// UI fields
private Menu menu;
private HUD hud;
private GameOver gameOver;
private HowToPlay howToPlay;
// Music fields
public static SoundEffect deathSong;
public static SoundEffect chompSound;
public static SoundEffect ghostDiedSound;
public static SoundEffect fruitEatenSound;
public static Song mainSong;
public static Song intermissionSong;
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
}
protected override void Initialize()
{
// Set window size
_graphics.PreferredBackBufferWidth = (int)screenSize.X;
_graphics.PreferredBackBufferHeight = (int)screenSize.Y;
_graphics.ApplyChanges();
// Initialize map and convert map for pathfinder
Map.LoadMap();
PathFinder.ConvertMap(Map.map);
// Add ghosts
Ghosts.Add(new Ghost("Blinky"));
Ghosts.Add(new Ghost("Pinky"));
Ghosts.Add(new Ghost("Inky"));
Ghosts.Add(new Ghost("Clyde"));
pacman.highScore = LoadHighScore();
// Initialize menu and HUD
menu = new Menu();
hud = new HUD(new Vector2(0, 740));
gameOver = new GameOver();
howToPlay = new HowToPlay();
base.Initialize();
}
protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
// Load sprites
spriteSheet = Content.Load<Texture2D>("sprites");
menu.LoadContent(Content, "gameFont");
hud.LoadContent(Content, "gameFont");
howToPlay.LoadContent(Content, "rulesFont");
gameOver.LoadContent(Content, "gameOverFont");
for (int i = 0; i < Foods.Count; i++)
{
Foods[i].LoadContent();
}
// Load music
mainSong = Content.Load<Song>("mainSong");
deathSong = Content.Load<SoundEffect>("deathSound");
chompSound = Content.Load<SoundEffect>("chompSound");
intermissionSong = Content.Load<Song>("intermissionSound");
ghostDiedSound = Content.Load<SoundEffect>("ghostDeathSound");
fruitEatenSound = Content.Load<SoundEffect>("fruitEaten");
MediaPlayer.IsRepeating = true;
MediaPlayer.MediaStateChanged += MediaPlayer_MediaStateChanged;
MediaPlayer.Play(mainSong);
}
private void MediaPlayer_MediaStateChanged(object sender, System.EventArgs e)
{
MediaPlayer.Volume = 40;
}
protected override void Update(GameTime gameTime)
{
GamePadState gamePadState = GamePad.GetState(0);
KeyboardState keyboardState = Keyboard.GetState();
if ((gamePadState.Buttons.Start == ButtonState.Pressed) ||
keyboardState.IsKeyDown(Keys.Escape))
{
gameState = GameState.Menu;
RestartGame(true);
pacman.Score = 0;
pacman.ExtraLives = 4;
}
switch (gameState)
{
case GameState.Menu:
menu.Update();
break;
case GameState.Game:
UpdateGame();
break;
case GameState.GameOver:
gameOver.Update();
break;
case GameState.HowToPlay:
howToPlay.Update();
break;
}
base.Update(gameTime);
}
private void UpdateGame()
{
for (int i = 0; i < Foods.Count; i++)
{
Foods[i].Update();
}
for (int i = 0; i < Ghosts.Count; i++)
{
Ghosts[i].Update();
}
pacman.Update();
KeyboardState state = Keyboard.GetState();
if (state.IsKeyDown(Keys.Space))
{
int a = 0;
}
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
_spriteBatch.Begin();
switch (gameState)
{
case GameState.Menu:
menu.Draw(_spriteBatch);
break;
case GameState.Game:
DrawGame();
break;
case GameState.GameOver:
gameOver.Draw(_spriteBatch);
break;
case GameState.HowToPlay:
howToPlay.Draw(_spriteBatch);
break;
}
_spriteBatch.End();
base.Draw(gameTime);
}
private void DrawGame()
{
// Draw map and HUD
Map.Draw(_spriteBatch);
hud.Draw(_spriteBatch, pacman.Score, pacman.ExtraLives);
for (int i = 0; i < Foods.Count; i++)
{
Foods[i].Draw(_spriteBatch);
}
for (int i = 0; i < Ghosts.Count; i++)
{
Ghosts[i].Draw(_spriteBatch);
}
pacman.Draw(_spriteBatch);
}
public static void RestartGame(bool IsLevelComplete)
{
if (IsLevelComplete)
{
for (int i = 0; i < Foods.Count; i++)
{
if (Foods[i].FoodType != "Fruit")
{
Foods[i].isAlive = true;
}
else
{
Foods[i].Prize += 200;
}
}
pacman.PointsEaten = 0;
}
else
{
pacman.ExtraLives -= 1;
}
pacman.Position = new Vector2(324, 564);
for (int i = 0; i < Ghosts.Count; i++)
{
Ghosts[i].Position = Ghosts[i].StartPosition;
Ghosts[i].AfraidTime = 0;
Ghosts[i].IsAfraidEffectOn = false;
Ghosts[i].IsAlive = true;
Ghosts[i].Directions.Clear();
Ghosts[i].CurrentDirection = DirectionsEnum.Stop;
Ghosts[i].Speed = 1.5f;
}
}
public static void UpdateHighScore(int highScore)
{
File.WriteAllText("highScore.txt", highScore.ToString());
}
public static int LoadHighScore()
{
if (!File.Exists("highScore.txt"))
File.Create("highscore.txt").Dispose();
string data = File.ReadAllText("highScore.txt");
if (string.IsNullOrEmpty(data)) return 0;
return int.Parse(data);
}
}
}