2015-10-04 89 views
0

我想在创建像tilemap一样的二维网格时最小化图块对象的大小。我创建了一个short [,]数组,每个[y,x]位置对应一个tile的id。为此,我创建一个名为TileType的类并使用Tile Tile根据其id来访问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]; 
    } 

}

我通过阅读有关如何有效地存储数据的地图喜欢这个职位发现这一点。我没有写这个,只是一个例子。但我的问题是如何使用这种方法在屏幕上绘制一个图块?我会设置一种方式,使纹理对应一个tile地图集中的源矩形(TextureSource)。但我不明白我会如何画这个。 IE绘制(Tile.Type.Id)?但是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); 

之后,您可以使用获取标识符方法。

我会解释绘制所有砖在屏幕的主要想法(这不是一个工作代码,但它显示了你应该做的其简单的:)):

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. 纹理只是一张你应该画的图片。