【问题标题】:Tilemap Index out of bounds collisionTilemap Index 越界碰撞
【发布时间】:2016-05-13 14:20:31
【问题描述】:

我创建了我的瓦片地图和我的移动玩家。

我现在正在尝试创建碰撞,我觉得我在正确的轨道上。

这是我创建地图的方式。

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

但是,我的玩家位置一直超出 2D 数组的索引范围,我认为我需要将其缩小以阻止这种情况,我尝试将播放坐标除以图块的宽度,但这并没有没用。

如果有人可以帮助我进行正确的缩放,我将不胜感激。

【问题讨论】:

  • 您是否检查过尝试此操作时获得的值?此外,您的地图不是 60x60,而是 4x10,当您尝试将播放器放置在该位置时,这可能会导致问题。
  • 不,我还没有检查过我对这一切都很陌生,不确定如何检查。我也尝试过除以 10 和 4,我也遇到了同样的问题。有什么想法吗?
  • 做一些谷歌搜索并学习如何使用调试器用于 Visual Studio 和即时窗口。许多正在开发的软件都在试图弄清楚为什么某些事情会发生意想不到的事情

标签: c# xna collision scaling bounds


【解决方案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 或其他什么,这完全取决于您),以及是否是0,它是空白空间(或者可能是-1)。请注意,“-1”部分完全取决于您。只需写下您将拥有的 id 列表以及它们提供的项目。

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

【讨论】:

  • 感谢回复,矩阵的宽高是什么意思?那是指地图的宽度和高度吗?抱歉,我是新手。
  • 这是你的'public int[,] Map'的尺寸,在你的情况下:10x4。当您创建“int [,]”时,您创建了一个整数或整数矩阵。像这样的 'strig [,]' 是一个字符串矩阵。
  • 即使这个功能很好,很干净,可以防止碰撞,我真的很喜欢它。我仍然存在超出数组范围的问题。我需要以某种方式缩小玩家坐标的位置,以使它们保持在数组范围内。即使我有一个 50,50 的数组,我也会在几个动作内完成。
  • 我看不到你想要达到的目标。首先,这个错误是什么时候出现的?问题是在您开始游戏时出现还是在您的球员出界时出现?我也不知道你是否按照我想要的方式实现了它。请提供更多信息,以便我为您提供帮助。 编辑您将玩家位置转换为整数矩阵的计算工作正常,除非玩家不在地图中
  • 我希望在某种意义上实现碰撞,即当播放位置碰到包含数组中某个图块的某个位置时,它将让玩家回到他以前的位置。当玩家位置变得大于数组本身时,就会发生错误。这是我实施它的方式。公共无效更新(游戏时间游戏时间){ prevPosition = 位置;输入(游戏时间); if(CollidesWithWall((int)position.X, (int)position.Y)) { position = prevPosition; } }
猜你喜欢
  • 2014-02-28
  • 2018-09-18
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多