使用结构

时间:2015-10-04 23:04:32

标签: c# xna

我在创建像tilemap这样的2D网格时尝试最小化tile对象的大小。我创建一个short [,]数组,每个[y,x]位置对应一个tile的id。为此,我创建了一个名为TileType的类,并使用struct 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只是一个简短的。

1 个答案:

答案 0 :(得分: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. 纹理只是你应该画的图片。