Tilemap索引超出边界冲突

时间:2016-05-13 14:20:32

标签: c# xna collision scaling bounds

我创建了我的瓷砖地图和我的播放器。

我现在正试图创造碰撞,我觉得我正走在正确的轨道上。

以下是我创建地图的方式。

    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);
            }
        }
    }

我正在检查具有这种情况的2d阵列坐标,并检查是否有特定的瓷砖,然后我可以设置我之前的位置,如果它是真的。

我目前正在测试1个瓷砖atm。

 public void Update(GameTime gameTime)
    {
        prevPosition = position;
        input(gameTime);

       if(tiles.Map[(int)playerPosition.X/60,(int)playerPosition.Y/60] == 1)
        {
            position = prevPosition;
        }
    }

然而,我的玩家位置不断超出2D阵列的索引边界,我相信我需要将其缩小以便停止此操作,我已经尝试将游戏坐标划分为平铺的宽度但是那还没有奏效。

如果有人能帮助我正确缩放,我将非常感激。

1 个答案:

答案 0 :(得分:1)

如果您的玩家的位置类似于-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或者其他东西,那个&#39;完全取决于你)如果它是0,它是空的空间(或者可能是-1)。请注意&#34; -1&#34;部分完全取决于你。只需写下你将拥有的id列表以及它们出现的项目。

其他建议
试试if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)