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)