C # UWP Индекс вне диапазона для цикла - PullRequest
0 голосов
/ 28 июня 2018

Я следую учебному пособию по YouTube, и по какой-то причине, даже имея точно такой же код, я получаю исключение:

"Index was out of range. Must be non-negative and less than the size of the collection."

Что я пытаюсь сделать, так это то, что каждый раз, когда я нажимаю на экран, значение i должно увеличиваться, но это не так.

Код:

Переменные:

public static float PointX, PointY, PhotonX, PhotonY;

public static List<float> PhotonXPOS = new List<float>();
public static List<float> PhotonYPOS = new List<float>();
public static List<float> Percent = new List<float>();

В конструкторе:

Rect Bounds = ApplicationView.GetForCurrentView().VisibleBounds;

 //Photon location.
 PhotonX = (float)Bounds.Width / 2; //Always at middle.
 PhotonY = (float)Bounds.Height; //Always at bottom.

В другом методе:

private void GameCanvas_Draw(Microsoft.Graphics.Canvas.UI.Xaml.CanvasControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasDrawEventArgs args)
    {
        ///Display Projectiles.
        for (int i = 0; i < PhotonXPOS.Count; i++)
        {
            //Start and end point of a projectile.
            PointX = (PhotonX + (PhotonXPOS[i] - PhotonX) * Percent[i]);
            PointY = (PhotonY + (PhotonYPOS[i] - PhotonY) * Percent[i]);

            //Drawing of the Photons.
            args.DrawingSession.DrawImage(Scaling.Image(Photon), PointX - (25 * ScaleWidth), PointY - (25 * ScaleHeight));

            //Speed.
            Percent[i] += (0.050f * ScaleHeight);

            //If Photon goes out of screen at the top.
            if (PointY < 0f)
            {
                PhotonXPOS.RemoveAt(i);
                PhotonYPOS.RemoveAt(i);
                Percent.RemoveAt(i);
            }
        }           
    }

В строке дано исключение

PointY = (PhotonY + (PhotonYPOS[i] - PhotonY) * Percent[i]);

Как будто PhotonYPOS[i] не увеличивается, но остается со начальным значением 0, тогда i увеличивается и становится выше, чем сам список.

EDIT: этот метод вызывается при нажатии на экран (и элементы добавляются в списки):

    public void GameCanvas_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
    {
        if(RoundEnded == true)
        {
            GameState = 0;
            Countdown = 6;
            RoundEnded = false;
        }
        else
        {
            //Goes to next level.
            if (GameState == 0)
            {
                //Go to next level.
                GameState += 1;
                //Start round timer.
                RoundTimer.Start();                  
            }
            else if(GameState > 0)
            {
                //Add Photons.
                PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X);
                PhotonXPOS.Add((float)e.GetPosition(GameCanvas).Y);
                Percent.Add(0f);
            }
        }
    }

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Простая опечатка Как указано в комментариях:

изменить это //Add Photons. PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X); PhotonXPOS.Add((float)e.GetPosition(GameCanvas).Y); Percent.Add(0f);

к этому //Add Photons. PhotonXPOS.Add((float)e.GetPosition(GameCanvas).X); PhotonYPOS.Add((float)e.GetPosition(GameCanvas).Y); Percent.Add(0f);

Для второй проблемы: пропуская элементы, вы должны уменьшить i после удаления последнего элемента.

Пример Список до 1 2 3 4 5 в этом случае я равен 2, указывая на элемент 3, теперь вы удаляете элемент 2, в конце цикла я увеличивается до 3, что указывает на элемент 5

Список после 1 2 4 5 я = 3

В этом случае Элемент 4 с индексом 2 никогда не используется.

Предлагаемые изменения:

if (PointY < 0f)
{
    PhotonXPOS.RemoveAt(i);
    PhotonYPOS.RemoveAt(i);
    Percent.RemoveAt(i);
    i--;// in the next loop handle index i again (i-1+1=i)
}
0 голосов
/ 28 июня 2018

Вы перебираете PhotonXPOS.Count, но иногда вы удаляете, используя PhotonXPOS.RemoveAt(i);, поэтому i перебирает количество массивов.

Одно из решений - вернуться назад for (int i = PhotonXPOS.Count; i > 0; i--)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...