2015-10-04 3 views
0

Я пытаюсь свести к минимуму размер объекта плитки при создании 2d-сетки, такой как tilemap. Я создаю массив коротких [,], и каждый [y, x] местоположение соответствует id для плитки. Для этого я создаю класс под названием TileType и имеет структуру Tile для доступа к информации из TileType о себе на основе ее идентификатора. Как это:Получение информации из класса с использованием структуры

struct Tile 
{ 
    short typeId; 
    public TileType Type 
    { 
      get 
      { 
        return TileType.Get(typeId); 
      } 
      set 
      { 
        typeId = value.Id; 
      } 
    } 

}

class TileType 
{  

    public short Id; 
    public string Name; 
    public Texture2D Texture; 
    public Rectangle TextureSource; 
    public bool IsObstacle; 


    static List<TileType> types; 
    static TileType() 
    { 
      types = new List<TileType>(); 
      var type = new TileType(); 
      type.Name = "Dirt"; 
      //initialize here 

      types.Add(type); 
    } 

    public static TileType Get(short id) 
    { 
      return types[id]; 
    } 

}

Я нашел это, прочитав сообщение о том, как эффективно хранить данные карты, как это. Я не писал это и его пример. Но мой вопрос заключается в том, как бы я нарисовал плитку на экране с помощью этого метода? Я бы установил способ, которым Texture будет соответствовать исходному прямоугольнику (TextureSource) в атласе плитки. Но я не понимаю, как бы я это сделал. IE draw (Tile.Type.Id)? Но Ид просто короткий.

ответ

0

Прежде всего, вы должны исправить ошибку при инициализации - когда вы создаете тип, вы должны установить в нем идентификатор. Пример:

var type = new TileType(); 
type.Id = 0; // This is unique identifier that we are using in Get method.  
type.Name = "Dirt"; 
type.Texture = new Texture2D(...); //Here you assign your texture for Dirt tile 
//Initialize position and size for your texture. 
type.TextureSource = new Rectangle(dirtStartX, dirtStartY, dirtWidth, dirtHeight); 
types.Add(type); 

type = new TileType(); 
type.Id = 0; // This is unique identifier that we are using in Get method.  
type.Name = "Water"; 
type.Texture = new Texture2D(...); //Here you assign your texture for Dirt tile 
//Initialize position and size for your texture. 
type.TextureSource = new Rectangle(waterStartX, waterStartY, waterWidth, waterHeight); 
types.Add(type); 

После этого вы можете использовать метод Get by identifier.

Я объясню основную идею рисования все плитки на экране (это не рабочий код, но это показывает, что вы должны сделать Его просто :).):

for (int id=0; id<TileTypeCount; id++) 
{ 
    TileType tileType = TileType.Get(id); //Get tile by its identifier. 
    //Now we have current texture and rectangle (position). Draw it 
    DrawRectangleWithTexture(tileType.Rectangle, tileType.Texture); 
} 

Реализация DrawRectangleWithTexture зависит от того, какую среду разработки вы используете. Во всяком случае, в этой функции у вас есть вся информация, чтобы нарисовать изображение:

  1. Прямоугольник используется для хранения информации о положении и размере изображения.

  2. Текстура - это всего лишь картина, которую вы должны нарисовать.

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