我正在关注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
就增加了并且比List本身更高。
编辑:这是单击屏幕(并将项目添加到列表中)时调用的方法:
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);
}
}
}
答案 0 :(得分:1)
您遍历PhotonXPOS.Count
,但是有时您使用PhotonXPOS.RemoveAt(i);
进行删除,这就是i
遍历数组数量的原因。
一种解决方案是倒退for (int i = PhotonXPOS.Count; i > 0; i--)
答案 1 :(得分:0)
简单错字 如评论中所述:
更改此
//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,则在循环末尾将i增大到3,它指向元素5
之后列出
1 2 4 5
i = 3
在这种情况下,永远不会使用索引为2的元素4。
建议的更改:
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)
}