2016-05-13 5 views
0

Я заберусь прямо в него. Я создал карту, используя список текстур и 2D-массив, я нарисовал игрока и движение, и теперь я пытаюсь используйте мои консоли игроков, чтобы получить доступ к местоположению в массиве, чтобы проверить, имеет ли он конкретную плитку, и если это произойдет, чтобы заставить моего игрока вернуться к своему ранее местоположению, давая своего рода столкновение.Уменьшение размеров игровых консолей, чтобы они вписывались в массив 2d для столкновения

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

Вот как я нарисовал мои плитки

int tileWidth = 60; 
    int tileHeight = 60; 

    List<Texture2D> tileTextures = new List<Texture2D>(); 

    public int[,] Map = new int[,] 
     { 
      {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,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,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}, 
      {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,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); 
      } 
     } 
    } 

Вот мой игрок движение

public void input(GameTime gameTime) 
    { 
     KeyboardState ks = Keyboard.GetState(); 
     Vector2 motion = Vector2.Zero; 

     if (ks.IsKeyDown(Keys.W)) 
      motion.Y--; 
     if (ks.IsKeyDown(Keys.S)) 
      motion.Y++; 
     if (ks.IsKeyDown(Keys.D)) 
     { 
      currentAnim = rightWalk; 
      Animate(gameTime); 
      motion.X++; 
     } 
     if (ks.IsKeyDown(Keys.A)) 
     { 
      currentAnim = leftWalk; 
      Animate(gameTime); 
      motion.X--; 
     }    

     if (motion != Vector2.Zero) 
      motion.Normalize(); 

     position += motion * speed; 
    } 

И, наконец, мой игрок Update

public void Update(GameTime gameTime) 
    { 
     prevPosition = position; 
     input(gameTime); 
     if(CollidesWithWall((int)position.X, (int)position.Y)) 
     { 
      position = prevPosition; 
     } 
    } 

и моя CollidingWithWall функция

public bool CollidesWithWall(int x, int y) 
    { 
     if (x < 0 || x > (15) -1) return true; 
     if (y < 0 || y > (7) -1) return true; 
     if (tiles.Map[x, y] == 1) return true; 
     else return false; 
    } 

ответ

1

Кажется, вы пытаетесь получить доступ к вашему 2D-массиву по позиции игрока. Ваши плитки 60x60px, поэтому, если ваш игрок находится на координате: x = 30; у = 40 например, она должна быть в первой плитки [0,0], так как они оба < 60.

Здесь вы пытаетесь задать свой массив индексов [30,40], что из связанного, но правильный номер плитки - ваш position/tileSize.

Так,

public bool CollidesWithWall(int x, int y) 
{ 
    if (x < 0 || x > (15) -1) return true; 
    if (y < 0 || y > (7) -1) return true; 
    if (tiles.Map[x, y] == 1) return true; 
    else return false; 
} 

становится:

public bool CollidesWithWall(int x, int y) 
{ 
    if (x < 0 || x > (15) -1) return true; 
    if (y < 0 || y > (7) -1) return true; 
    if (tiles.Map[x/tiles.tileWidth, y/tiles.tileHeight] == 1) return true; 
    else return false; 
} 
+0

Я дал ему эту функцию в своем последнем вопросе, и я не видел эту ошибку. +1 для просмотра этого @Vernier – Monset

+0

Я также хотел бы напомнить @Spoingen, чтобы одобрить ваш ответ в этом вопросе, и мой в его последнем вопросе – Monset

+0

Спасибо, хороший сэр, и мне просто жаль, что было поздно, до сих пор. – Spoingen