弹丸滞后,未被完全删除

时间:2014-04-23 13:51:15

标签: c# list object xna projectile

对我来说,这个错误是游戏破坏,我使用四个不同的列表控制从许多发射器射击的火箭。发射器也列在一个清单中:

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

如果您只想查看项目的全部内容 Here 。 (请理解这是一个完整的混乱,我试图让它工作,如果我有更多的时间,然后3至4周完成这个我会尝试使其更清理)

问题

火箭队将会射门,但是正确的火箭队会随机停下来,上下左右都很好,怎么样?

如果我让游戏玩了一会儿,它会在一段时间后开始变慢,我原以为我在射击游戏时不得不使用许多火箭,但他们正在射击并被摧毁所以不应该让游戏工作正常火箭队的生产速度和产生的速度一样快?

结束问题

注意:(我有多个级别,当我跳到下一个级别时,滞后消失,因为我在方法中有一个明确的全部):

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

这些发射器将做的是在一条海峡线上每隔一定时间发射一枚射弹,直到它们与一个街区或玩家接触为止。

我有一个foreach循环遍历每个发射器位置并根据发射器面向的方向产生火箭,1 =向上,2 =向下,3 =向右,4 =向左:

        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));

            }
        }

然后为每个火箭列表调用for循环并定义它们的大小,因为纹理的大小不正确:

        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);
        }

然后用Draw方法绘制火箭:

        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);
        }

最后火箭队在另一个名为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);
                }
            }
        }

1 个答案:

答案 0 :(得分:4)

检查这段代码:

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);
    }

你已经使用了RocketLeft.Count,你应该使用RocketRight。

编辑:此外,尝试使用Rectangle.Dispose()处理“已销毁”的火箭。它可能有助于释放一些资源。