Tilemap 索引越界冲突
Tilemap Index out of bounds collision
我用移动创建了我的瓷砖地图和我的播放器。
我现在正在尝试创建碰撞,我觉得我在正确的轨道上。
这是我创建地图的方式。
List<Texture2D> tileTextures = new List<Texture2D>();
int tileWidth = 60;
int tileHeight = 60;
public int[,] Map = new int[,]
{
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,1,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
};
public void Draw(SpriteBatch spriteBatch)
{
int tileMapWidth = Map.GetLength(1);
int tileMapHeight = Map.GetLength(0);
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int textureIndex = Map[y, x];
Texture2D texture = tileTextures[textureIndex];
spriteBatch.Draw(
texture,
source = new Rectangle(x *myTile.Width,
y * myTile.Height,
tileWidth,
tileHeight),
Color.White);
}
}
}
我正在检查具有这种情况的二维数组坐标,并检查是否存在特定的图块,如果是,我可以在其中设置我之前的位置。
我目前正在 1 个 tile atm 上进行测试。
public void Update(GameTime gameTime)
{
prevPosition = position;
input(gameTime);
if(tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60] == 1)
{
position = prevPosition;
}
}
但是我的玩家位置一直超出二维数组的索引范围,我认为我需要缩小它以阻止这种情况,我尝试将游戏坐标除以图块的宽度但是那没有用。
如果有人能帮助我正确缩放,我将不胜感激。
如果您的玩家的位置是 -x,y 或 x,-y 或者可能是 -x,-y,就会发生这种情况。如果你能像这样做一个函数,你的方法可能会更好
public bool CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return false;
if(y < 0 || y > *matrix height* -1) return false;
if (Map[x,y] == 1) return true;
return false;
}
并在 tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60]
行中使用它
或者,如果您需要返回的图块类型
public int CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return -1;
if(y < 0 || y > *matrix height* -1) return -1;
return Map[x,y];
}
通过这种方式,您将知道您是否偶然发现了健康药水(只需将其 ID 设置为 3)或一堵墙(ID 为 1 或其他,这完全取决于您)以及是否它是 0,它是空的 space(或者可能是 -1)。请注意,“-1”部分完全取决于您。只需写下您将拥有的 ID 列表以及它们显示的项目。
其他建议
尝试 if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)
我用移动创建了我的瓷砖地图和我的播放器。
我现在正在尝试创建碰撞,我觉得我在正确的轨道上。
这是我创建地图的方式。
List<Texture2D> tileTextures = new List<Texture2D>();
int tileWidth = 60;
int tileHeight = 60;
public int[,] Map = new int[,]
{
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,1,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
{2,2,2,2,2,2,2,2,2,2},
};
public void Draw(SpriteBatch spriteBatch)
{
int tileMapWidth = Map.GetLength(1);
int tileMapHeight = Map.GetLength(0);
for (int x = 0; x < tileMapWidth; x++)
{
for (int y = 0; y < tileMapHeight; y++)
{
int textureIndex = Map[y, x];
Texture2D texture = tileTextures[textureIndex];
spriteBatch.Draw(
texture,
source = new Rectangle(x *myTile.Width,
y * myTile.Height,
tileWidth,
tileHeight),
Color.White);
}
}
}
我正在检查具有这种情况的二维数组坐标,并检查是否存在特定的图块,如果是,我可以在其中设置我之前的位置。
我目前正在 1 个 tile atm 上进行测试。
public void Update(GameTime gameTime)
{
prevPosition = position;
input(gameTime);
if(tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60] == 1)
{
position = prevPosition;
}
}
但是我的玩家位置一直超出二维数组的索引范围,我认为我需要缩小它以阻止这种情况,我尝试将游戏坐标除以图块的宽度但是那没有用。
如果有人能帮助我正确缩放,我将不胜感激。
如果您的玩家的位置是 -x,y 或 x,-y 或者可能是 -x,-y,就会发生这种情况。如果你能像这样做一个函数,你的方法可能会更好
public bool CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return false;
if(y < 0 || y > *matrix height* -1) return false;
if (Map[x,y] == 1) return true;
return false;
}
并在 tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60]
或者,如果您需要返回的图块类型
public int CollidesWithWall(int x, int y)
{
if(x < 0 || x > *matrix width* - 1) return -1;
if(y < 0 || y > *matrix height* -1) return -1;
return Map[x,y];
}
通过这种方式,您将知道您是否偶然发现了健康药水(只需将其 ID 设置为 3)或一堵墙(ID 为 1 或其他,这完全取决于您)以及是否它是 0,它是空的 space(或者可能是 -1)。请注意,“-1”部分完全取决于您。只需写下您将拥有的 ID 列表以及它们显示的项目。
其他建议
尝试 if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)