Question

For me this bug is game breaking, I am using four different Lists that control rockets that shoot out of many launchers. The launchers are also held in a list:

        Launchers = new List<Launcher>();
        RocketsUp = new List<Rectangle>();
        RocketsDown = new List<Rectangle>();
        RocketsLeft = new List<Rectangle>();
        RocketsRight = new List<Rectangle>();

If you just want to see the full thing Here is the project. (Please Understand that it's a compleat mess, I am trying to make it work, if I had more time then 3 to 4 weeks to finish this I would try and make it more cleaned up)

Questions

The Rockets will shoot out but the right rockets are stopping at random intervals, up, down, and left are work fine, how?

If I let the game play a little it starts to slow down after a while, I had thought that I had to many rockets in game firing but they're firing and being destroyed so shouldn't the game work fine since the rockets are being cleared as fast as there being spawned?

End Questions

Note: (I have multiple levels and when I jump to the next the lag goes away since I have a clear all in a method):

        Launchers.Clear();
        RocketsUp.Clear();
        RocketsDown.Clear();
        RocketsRight.Clear();
        RocketsLeft.Clear();

What these launchers will do is fire a projectile every set amount of seconds in a strait line until they make contact with a block or player.

I have a foreach loop go through each launcher position and spawn a rocket based on what direction the launcher is facing, 1 = Up, 2 = Down, 3 = Right, 4 = Left:

        foreach (Launcher l in Launchers)
        {
            l.Updata(gameTime);

            if (rocketTime > rocketMax)
            {
                if (l.Direction == 1)
                    RocketsUp.Add(new Rectangle((int)l.Position.X + 11, (int)l.Position.Y, 9, 18));

                if (l.Direction == 2)
                    RocketsDown.Add(new Rectangle((int)l.Position.X + 11, (int)l.Position.Y, 9, 18));

                if (l.Direction == 3)
                    RocketsRight.Add(new Rectangle((int)l.Position.X, (int)l.Position.Y + 11, 18, 9));

                if (l.Direction == 4)
                    RocketsLeft.Add(new Rectangle((int)l.Position.X, (int)l.Position.Y + 11, 18, 9));

            }
        }

Then a for loop is called for each rocket list and define their size since the texture is not the correct size:

        if (rocketTime > rocketMax)
            rocketTime = 0;

        for (int i = 0; i < RocketsUp.Count; i++)
        {
            RocketsUp[i] = new Rectangle(RocketsUp[i].X, RocketsUp[i].Y - 3, RocketsUp[i].Width, RocketsUp[i].Height);
        }

        for (int i = 0; i < RocketsDown.Count; i++)
        {
            RocketsDown[i] = new Rectangle(RocketsDown[i].X, RocketsDown[i].Y + 3, RocketsDown[i].Width, RocketsDown[i].Height);
        }

        for (int i = 0; i < RocketsLeft.Count; i++)
        {
            RocketsRight[i] = new Rectangle(RocketsRight[i].X + 3, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height);
        }

        for (int i = 0; i < RocketsLeft.Count; i++)
        {
            RocketsLeft[i] = new Rectangle(RocketsLeft[i].X - 3, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height);
        }

Then the rockets are drawn in the Draw method:

        for (int i = 0; i < RocketsUp.Count; i++)
        {
            spriteBatch.Draw(rocketUp, new Rectangle(RocketsUp[i].X,
                RocketsUp[i].Y,
                RocketsUp[i].Width,
                RocketsUp[i].Height),
                Color.White);
        }

        for (int i = 0; i < RocketsDown.Count; i++)
        {
            spriteBatch.Draw(rocketDown, new Rectangle(RocketsDown[i].X,
                RocketsDown[i].Y, 
                RocketsDown[i].Width, 
                RocketsDown[i].Height), 
                Color.White);
        }

        for (int i = 0; i < RocketsRight.Count; i++)
        {
            spriteBatch.Draw(rocketRight, new Rectangle(RocketsRight[i].X, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height), Color.White);
        }

        for (int i = 0; i < RocketsLeft.Count; i++)
        {
            spriteBatch.Draw(rocketLeft, new Rectangle(RocketsLeft[i].X, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height), Color.White);
        }

Finally the Rockets are called in another class called Block:

    public Player BlockCollision(Player player, GameTime gameTime, Game1 game1)
    {
        this.game1 = game1;
        kbState = Keyboard.GetState();

        Rectangle BlockRectangle = new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height);

        Rectangle top = new Rectangle((int)Position.X + 5, (int)Position.Y - 10, Texture.Width - 10, 10);
        Rectangle bottom = new Rectangle((int)Position.X + 5, (int)Position.Y + Texture.Height, Texture.Width - 10, 10);
        Rectangle left = new Rectangle((int)Position.X - 10, (int)Position.Y + 5, 10, Texture.Height - 10);
        Rectangle right = new Rectangle((int)Position.X + Texture.Width, (int)Position.Y + 5, 10, Texture.Height - 10);

        Rectangle personRectangle = new Rectangle((int)player.Position.X, (int)player.Position.Y, player.Texture.Width, player.Texture.Height);

        for (int i = 0; i < game1.RocketsDown.Count; i++)
        {
            Vector2 Rocket = new Vector2(game1.RocketsDown[i].X, game1.RocketsDown[i].Y);

            if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketDown.Width, game1.rocketDown.Height)))
            {
                player.Dead = true;
            }
        }

        for (int i = 0; i < game1.RocketsUp.Count; i++)
        {
            Vector2 Rocket = new Vector2(game1.RocketsUp[i].X, game1.RocketsUp[i].Y);

            if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketUp.Width, game1.rocketUp.Height)))
            {
                player.Dead = true;
            }
        }

        for (int i = 0; i < game1.RocketsLeft.Count; i++)
        {
            Vector2 Rocket = new Vector2(game1.RocketsLeft[i].X, game1.RocketsLeft[i].Y);

            if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketLeft.Width, game1.rocketLeft.Height)))
            {
                player.Dead = true;
            }
        }

        for (int i = 0; i < game1.RocketsRight.Count; i++)
        {
            Vector2 Rocket = new Vector2(game1.RocketsRight[i].X, game1.RocketsRight[i].Y);

            if (personRectangle.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketRight.Width, game1.rocketRight.Height)))
            {
                player.Dead = true;
            }
        }

        if (BlockState > 0)
        {
            for (int i = 0; i < game1.RocketsDown.Count; i++)
            {
                Vector2 Rocket = new Vector2(game1.RocketsDown[i].X, game1.RocketsDown[i].Y);

                if (top.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketDown.Width, game1.rocketDown.Height)))
                {
                    game1.RocketsDown.RemoveAt(i);
                }
            }

            for (int i = 0; i < game1.RocketsUp.Count; i++)
            {
                Vector2 Rocket = new Vector2(game1.RocketsUp[i].X, game1.RocketsUp[i].Y);

                if (bottom.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketUp.Width, game1.rocketUp.Height)))
                {
                    game1.RocketsUp.RemoveAt(i);
                }
            }

            for (int i = 0; i < game1.RocketsLeft.Count; i++)
            {
                Vector2 Rocket = new Vector2(game1.RocketsLeft[i].X, game1.RocketsLeft[i].Y);

                if (right.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketLeft.Width, game1.rocketLeft.Height)))
                {
                    game1.RocketsLeft.RemoveAt(i);
                }
            }

            for (int i = 0; i < game1.RocketsRight.Count; i++)
            {
                Vector2 Rocket = new Vector2(game1.RocketsRight[i].X, game1.RocketsRight[i].Y);

                if (left.Intersects(new Rectangle((int)Rocket.X, (int)Rocket.Y, game1.rocketRight.Width, game1.rocketRight.Height)))
                {
                    game1.RocketsRight.RemoveAt(i);
                }
            }
        }
Was it helpful?

Solution

Check this piece of code:

for (int i = 0; i < RocketsLeft.Count; i++)
    {
        RocketsRight[i] = new Rectangle(RocketsRight[i].X + 3, RocketsRight[i].Y, RocketsRight[i].Width, RocketsRight[i].Height);
    }

    for (int i = 0; i < RocketsLeft.Count; i++)
    {
        RocketsLeft[i] = new Rectangle(RocketsLeft[i].X - 3, RocketsLeft[i].Y, RocketsLeft[i].Width, RocketsLeft[i].Height);
    }

You have used RocketLeft.Count where you should have used RocketRight.

Edit: Also, try disposing your 'destroyed' rockets using Rectangle.Dispose(). It may help to free up some resources.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top