for-in-loop / Condition Используется только для первого элемента списка a - PullRequest
0 голосов
/ 04 августа 2011

Я искал три дня и не нашел решения. Вот код:

if (keyboardState.IsKeyDown(Keys.Right))
        {
            for (int i = GlobalClass.BlocksPositions.Count - 1; i > 0; i--)
            {
                if (new Rectangle((int)GlobalClass.BlocksPositions[i].X, (int)GlobalClass.BlocksPositions[i].Y, bT.Width, bT.Height).Intersects(new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height)))
                {

                    c = 0;
                }
                else
                {
                    c = 1;
                }
            }

            if (c == 1)
            {
                Position.X += Speed;
            }

        }

Каждая позиция блока равна блоку, который я могу создать, нажимая на экран, после чего новая позиция блока заносится в список. В основном у меня есть список координат блоков в моем списке блоков. Затем я передаю условие для каждой позиции блока, условие Создать прямоугольник для каждой позиции блока и один для игрока ... если есть столкновение, игрок не будет двигаться в этом направлении. Когда я пробую код, Мой персонаж будет сталкиваться только с первым элементом списка, а не с другими, если я удаляю первый элемент, он сталкивается со следующим, но не с другими. Все переменные ТОЧНЫЕ, я знаю это, потому что я пытался заменить этот код примерно так:

if (keyboardState.IsKeyDown(Keys.Right))
        {
            for (int i = GlobalClass.BlocksPositions.Count - 1; i > 0; i--)
            {
                if (new Rectangle((int)GlobalClass.BlocksPositions[i].X, (int)GlobalClass.BlocksPositions[i].Y, bT.Width, bT.Height).Intersects(new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height)))
                {
                    GlobalClass.BlocksPositions.RemoveAt[i];

                }
            }
        }

То же самое, но здесь, если он сталкивается, я удаляю элемент списка, это то же самое условие, но когда я пытаюсь это сделать, он обнаруживает все элементы и удаляет те, к которым я прикасаюсь. Я попробовал функцию foreach, и я получил те же результаты. В чем дело? Я уже многое делаю с переменными типа «делаю», поэтому я уверен, что проблема не в их значениях, а в том, что я с ними делаю. Помогите, пожалуйста! (

1 Ответ

1 голос
/ 07 августа 2011

Обнаружил, что я должен разорвать петлю так:

if (keyboardState.IsKeyDown(Keys.Right))
    {
        for (int i = GlobalClass.BlocksPositions.Count - 1; i > 0; i--)
        {
            if (new Rectangle((int)GlobalClass.BlocksPositions[i].X, (int)GlobalClass.BlocksPositions[i].Y, bT.Width, bT.Height).Intersects(new Rectangle((int)Position.X, (int)Position.Y, Texture.Width, Texture.Height)))
            {

                c = 0;
                break;
            }
            else
            {
                c = 1;
            }
        }

        if (c == 1)
        {
            Position.X += Speed;
        }

    }
...