这是代码, 我注意到Getlength方法返回0,但我认为正常,因为for循环不会超过0 .. 我写过
int yy = tile.GetLength(1);
并抛出与以下代码相同的异常:
TileData[][] tile = GameMain.Level.getCollisionTiles();
Rectangle tileRectangle;
for(int x = 0; x <= tile.GetLength(0); x++)
{
for (int y = 0; y <= tile.GetLength(1); y++) //EXCEPTION THROWN HERE AT GETLENGTH !!!!
{
tileRectangle = tile[x][y].Target;
if (tileRectangle.Contains(m_hitbox)) //Si il y a collision
{
if ((m_hitbox.X + m_hitbox.Width) > tileRectangle.X) //si le joueur percute par la gauche
{
m_hitbox.X--;
}
else if (m_hitbox.X < (tileRectangle.X + tileRectangle.Width)) //Droite
{
m_hitbox.X++;
}
if ((m_hitbox.Y + m_hitbox.Height) > tileRectangle.Y) //si le joueur percute par le haut
{
m_hitbox.Y--;
}
else if (m_hitbox.Y < (tileRectangle.Y + tileRectangle.Height)) //Bas
{
m_hitbox.Y++;
}
}
}
}
编辑:我通过从地图对象获取tile信息来实现它,但现在它抛出了NullReferenceException
TileData[][] tile = GameMain.Level.getCollisionTiles();
int xMax = GameMain.Level.getMapHeight();
int yMax = GameMain.Level.getMapWidth();
for (int x = 0; x <= xMax; x++)
{
for (int y = 0; y <= yMax; y++)
{
Rectangle tileRectangle = tile[x][y].Target; //THIS LINE FAILS !!!!
if (tileRectangle.Contains(m_hitbox)) //Si il y a collision
{
if ((m_hitbox.X + m_hitbox.Width) > tileRectangle.X) //si le joueur percute par la gauche
{
m_hitbox.X--;
}
else if (m_hitbox.X < (tileRectangle.X + tileRectangle.Width)) //Droite
{
m_hitbox.X++;
}
if ((m_hitbox.Y + m_hitbox.Height) > tileRectangle.Y) //si le joueur percute par le haut
{
m_hitbox.Y--;
}
else if (m_hitbox.Y < (tileRectangle.Y + tileRectangle.Height)) //Bas
{
m_hitbox.Y++;
}
}
}
}
很抱歉在同一主题中问你这个问题,但我认为你可以帮助我快速解决它。
答案 0 :(得分:5)
这不是2D阵列。 TileData[][]
是一个锯齿状数组,TileData[,]
是一个2D数组,在您的情况下,GetLength(1)
将始终失败,因为tile只有一个维度。
修改强>
该怎么做才能解决这个问题?您可以将[] []更改为[,](例如)并保持其他所有内容(getCollisionTiles()
如何工作?)或者您可以更新代码以从锯齿状数组中获得正确的大小,如下所示:
for (int y = 0; y < tile[x].GetLength(0); y++)
顺便说一下,你甚至可以用简单的GetLength(0)
替换Length
:
for(int x = 0; x < tile.Length; x++)
{
for (int y = 0; y < tile[x].Length; y++)
最后注意事项:对于基于0的数组,索引的长度不包括在内,因此x <= tile.Length
必须替换为x < tile.Length
。