2016-05-13 6 views
0

Я создал свою карту плитки и свой плеер с движением.Tilemap Index за пределами столкновений

Я сейчас пытаюсь создать столкновение, и я чувствую, что нахожусь на правильном пути.

Вот как я создал карту.

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 COORDS массива с этим условием и проверять, если конкретная плитка там, где я могу затем установить мое предыдущее место, если это правда.

В настоящее время я тестирую на 1 плиточном атме.

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

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

Однако моя позиция игрока продолжает выходить из индекса пределы 2D массива и я полагаю, что нужно масштабировать его вниз так, что он останавливает это, я попытался разделив играть COORDS по ширине но это не сработало.

Если кто-то может помочь мне с правильным масштабированием, я был бы очень благодарен.

+0

Вы проверили, какие ценности вы получаете, когда вы попытаетесь это сделать? Кроме того, ваша карта не 60x60, это 4x10, что может вызвать проблемы, когда вы пытаетесь разместить там своего игрока. –

+0

Нет, я не проверял. Я совершенно новичок в этом и не знаю, как проверить. Я также попытался делить на 10 и 4, и я получаю ту же проблему. Есть идеи? – Spoingen

+0

выполните некоторые поисковые запросы и узнайте, как использовать отладчик для визуальной студии и непосредственного окна. Многие разработчики программного обеспечения пытаются понять, почему что-то неожиданное –

ответ

1

Это произойдет, если позиция вашего игрока равна -x, y или x, -y или, может быть, -x, -y. YOR подход может быть лучше, если бы вы сделать фикцию как этого

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

и использовать его в INSEAD линии 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) или стену (с идентификатором 1 или что-то, это тоталью до вас), и если это 0, это пустое пространство (или, может быть, -1). Обратите внимание, что часть «-1» полностью зависит от вас. Просто запишите список идентификаторов, которые у вас есть, и какие элементы они представляют.

Другие предложения
Try if(tiles.Map[(int)(playerPosition.X/60f),(int)(playerPosition.Y/60f)] == 1)

+0

Спасибо за ответ, что вы подразумеваете под шириной и высотой матрицы? Это касается ширины и высоты карты? Извините, я новичок в этом. – Spoingen

+0

, которые являются размерами yout 'public int [,] Map', в вашем случае: 10x4. когда вы создаете 'int [,]', вы создали матрицу целых чисел или целых чисел. И что-то вроде этого 'strig [,]' является матрицей строк. – Monset

+0

Даже с этой функцией, которая хороша и чиста для столкновения, и мне это очень нравится. Мне все еще остается проблема выхода из границ массива. Мне нужно как-то уменьшить положение игровых коордов, чтобы они оставались в пределах массива. даже если бы у меня был массив 50,50, я бы вышел из него в течение нескольких движений. – Spoingen

Смежные вопросы