Gå till innehållet

Hela programmet - Träffa Ormen

GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;

MouseState mus = Mouse.GetState();
MouseState gammalMus = Mouse.GetState();
SpriteFont arial;

Random slump = new Random();

// 0 för meny, 1 för spel
int scen = 0;

// Menyvariabler
Texture2D knappBild;
Rectangle knappRect;
string välkomstText = "Träffa ormen!";
Vector2 välkomstPosition;

// Spelvariabler
List<Rectangle> ormar = new List<Rectangle>();
Texture2D ormBild;
int startAntalOrmar = 5;
int updatesMellanNyaOrmar = 90;
int updatesTillNästaOrm = 90;

public Game1()
{
    graphics = new GraphicsDeviceManager(this);
    Content.RootDirectory = "Content";
}

/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content.  Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
    IsMouseVisible = true;

    base.Initialize();
}

/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
    // Create a new SpriteBatch, which can be used to draw textures.
    spriteBatch = new SpriteBatch(GraphicsDevice);

    arial = Content.Load<SpriteFont>("arial");
    ormBild = Content.Load<Texture2D>("snake");
    knappBild = Content.Load<Texture2D>("button");
    knappRect = new Rectangle(400 - knappBild.Width / 2, 360, knappBild.Width, knappBild.Height);
    välkomstPosition = new Vector2(400 - arial.MeasureString(välkomstText).X / 2, 100);
}

/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// game-specific content.
/// </summary>
protected override void UnloadContent()
{
    // TODO: Unload any non ContentManager content here
}

/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
    gammalMus = mus;
    mus = Mouse.GetState();

    switch (scen)
    {
        case 0:
            UppdateraMeny();
            break;
        case 1:
            UppdateraSpel();
            break;
    }

    base.Update(gameTime);
}

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{

    switch (scen)
    {
        case 0:
            RitaMeny();
            break;
        case 1:
            RitaSpel();
            break;
    }

    base.Draw(gameTime);
}

/// <summary>
/// Undersöker om den vänstra musknappen precis blev nedtryckt
/// </summary>
/// <returns></returns>
bool VänsterMusTryckt()
{
    if (mus.LeftButton == ButtonState.Pressed && gammalMus.LeftButton == ButtonState.Released)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/// <summary>
/// Byter scen till det scen-ID som anges
/// </summary>
/// <param name="nyscen"></param>
void BytScen(int nyscen)
{
    scen = nyscen;

    if (nyscen == 1)
    {
        ormar.Clear();
        for (int i = 0; i < startAntalOrmar; i++)
        {
            LäggTillOrm();
        }
    }
    updatesTillNästaOrm = updatesMellanNyaOrmar;
}

/// <summary>
/// Lägger till en ny orm på en slumpad position
/// </summary>
void LäggTillOrm()
{
    int nyOrmX = slump.Next(0, 800 - ormBild.Width);
    int nyOrmY = slump.Next(0, 480 - ormBild.Height);
    Rectangle nyOrmRect = new Rectangle(nyOrmX, nyOrmY, ormBild.Width, ormBild.Height);
    ormar.Add(nyOrmRect);
}

/// <summary>
/// Update-kod för scenen Meny
/// </summary>
void UppdateraMeny()
{
    if (VänsterMusTryckt() && knappRect.Contains(mus.Position))
    {
        BytScen(1);
    }
}

/// <summary>
/// Update-kod för scenen spel
/// </summary>
void UppdateraSpel()
{
    updatesTillNästaOrm--;
    if (updatesTillNästaOrm <= 0)
    {
        LäggTillOrm();
        updatesTillNästaOrm = updatesMellanNyaOrmar;
    }

    if (VänsterMusTryckt())
    {
        for (int i = ormar.Count - 1; i >= 0; i--)
        {
            if (ormar[i].Contains(mus.Position))
            {
                ormar.RemoveAt(i);
                break;
            }
        }
    }

    if (ormar.Count == 0)
    {
        BytScen(0);
    }
}

/// <summary>
/// Kod för att rita scenen Meny
/// </summary>
void RitaMeny()
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    spriteBatch.Begin();
    spriteBatch.DrawString(arial, välkomstText, välkomstPosition, Color.White);
    spriteBatch.Draw(knappBild, knappRect, Color.White);
    spriteBatch.End();
}

/// <summary>
/// Kod för att rita scenen Spel
/// </summary>
void RitaSpel()
{
    GraphicsDevice.Clear(Color.Tomato);

    spriteBatch.Begin();
    foreach (Rectangle ormRect in ormar)
    {
        spriteBatch.Draw(ormBild, ormRect, Color.White);
    }
    spriteBatch.End();
}