2014-01-25 2 views
0

Я студент C#/XNA, и я недавно работал над изометрическим движком плитки, и пока он работает достаточно хорошо. Но им с проблемой, пытаясь выяснить, как это сделать столкновение, это то, что моя плитка двигатель делает в данный момент:Столкновение изометрических элементов XNA

  • Чертей мира от изображения и поместить плитку в зависимости от того, какого цвета на моем изображении , Например, красный цвет рисовал бы травяную плитку. (Плитки 64x32)

  • Камера, следующая за игроком, и мой цикл ничей только рисует то, что видит камера.

Это как моя игра выглядит, если это будет какой-либо помощи: enter image description here

Я не знаю, какого рода столкновения будет работать лучше. Должен ли я делать точки столкновения или пересекаться или любое другое столкновение. Я где-то читал, что вы можете сделать Worldtoscreen/Screentoworld, но я очень неопытен и не знаю, как это работает, и как будет выглядеть код.

Вот рисунок мой код плитки и т.д.:

class MapRow 
    { 
     public List<MapCell> Columns = new List<MapCell>(); 
    } 



    class TileMap 
    { 
     public List<MapRow> Rows = new List<MapRow>(); 

     public static Texture2D image; 
     Texture2D tileset; 


     TileInfo[,] tileMap; 


     Color[] pixelColor; 


     public TileMap(string TextureImage, string Tileset) 
     { 
      tileset = Game1.Instance.Content.Load<Texture2D>(Tileset); 

      image = Game1.Instance.Content.Load<Texture2D>(TextureImage); 
      pixelColor = new Color[image.Width * image.Height]; // pixelColor array that is holding all pixel in the image 
      image.GetData<Color>(pixelColor); // Save all the pixels in image to the array pixelColor 

      tileMap = new TileInfo[image.Height, image.Width]; 

      int counter = 0; 
      for (int y = 0; y < image.Height; y++) 
      { 
       MapRow thisRow = new MapRow(); 
       for (int x = 0; x < image.Width; x++) 
       { 
        tileMap[y, x] = new TileInfo(); 


        if (pixelColor[counter] == new Color(0, 166, 81)) 
        { 
         tileMap[y, x].cellValue = 1;//grass 

        } 
        if (pixelColor[counter] == new Color(0, 74, 128)) 
        { 

         tileMap[y, x].cellValue = 2;//water 
        } 

        if (pixelColor[counter] == new Color(255, 255, 0)) 
        { 
         tileMap[y, x].cellValue = 3;//Sand 
        } 


        tileMap[y, x].LoadInfoFromCellValue();//determine what tile it should draw depending on cellvalue 
        thisRow.Columns.Add(new MapCell(tileMap[y, x])); 


        counter++; 
       } 
       Rows.Add(thisRow); 
      } 
     } 


     public static int printx; 
     public static int printy; 

     public static int squaresAcross = Settings.screen.X/Tile.TileWidth; 
     public static int squaresDown = Settings.screen.Y/Tile.TileHeight; 

     int baseOffsetX = -32; 
     int baseOffsetY = -64; 

      public void draw(SpriteBatch spriteBatch) 
     { 
      printx = (int)Camera.Location.X/Tile.TileWidth; 
      printy = (int)Camera.Location.Y/Tile.TileHeight; 

      squaresAcross = (int)Camera.Location.X/Tile.TileWidth + Settings.screen.X/Tile.TileWidth; 
      squaresDown = 2*(int)Camera.Location.Y/Tile.TileHeight + Settings.screen.Y/Tile.TileHeight + 7; 


      for (printy = (int)Camera.Location.Y/Tile.TileHeight; printy < squaresDown; printy++) 
      { 
       int rowOffset = 0; 
       if ((printy) % 2 == 1) 
        rowOffset = Tile.OddRowXOffset; 

       for (printx = (int)Camera.Location.X/Tile.TileWidth; printx < squaresAcross; printx++) 
       { 
        if (tileMap[printy, printx].Collides(MouseCursor.mousePosition)) 
         Console.WriteLine(tileMap[printy, printx].tileRect); 

        foreach (TileInfo tileID in Rows[printy].Columns[printx].BaseTiles) 
        { 

         spriteBatch.Draw(

          tileset, 
          tileMap[printy, printx].tileRect = new Rectangle(
           (printx * Tile.TileStepX) + rowOffset + baseOffsetX, 
           (printy * Tile.TileStepY) + baseOffsetY, 
           Tile.TileWidth, Tile.TileHeight), 
          Tile.GetSourceRectangle(tileID.cellValue), 
          Color.White, 
          0.0f, 
          Vector2.Zero, 
          SpriteEffects.None, 
          tileID.drawDepth); 





        } 



       } 

      } 

      } 

     } 

ответ

0

Почему вы не просто рисовать вещи так же, как в обычных плитки на основе игры, а затем вращают камеру с 45degree? Конечно, вам нужно будет сделать вашу графику немного странной, но будет легче обрабатывать плитки.

Но если вы предпочитаете свой путь, то я бы предложил использовать простую математику для вычисления «плитки вправо», «плитки влево», «черепицы вверх» и «черепицы вниз», вы знаете, плитки вокруг игрока (или другой плитки). Вы можете просто работать с вашими списками, и с помощью математики, базовой математики, как получение следующей плитки, довольно просто.

Edit:
Вы можете получить значение плитки следующей позиции игрока с кодовым что-то вроде этого:

tileMap[Math.Floor((player.y+playerVelociy.Y)/tileHeight)] 
     [Math.Floor((player.x+playerVelocity.X)/tileWidth)] 

В этом коде, я предполагаю, что первая плитка на 0,0 и вы» re рисунок вправо и вниз. (Если нет, то просто измените Math.Floor на Math.Ceil).
THIS Ссылка может помочь вам получить представление, однако это в AS3.0, только синтаксис отличается.

+0

Да, я думаю, я мог бы это сделать (alt nr.2). Но это будет использовать обычное прямоугольное столкновение? А так как мои плитки изометричны, это означает, что углы прозрачны, если бы программа также считала, что углы также являются частью столкновения? – Iskalder

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