如何为基于2D图块的游戏定义图块结构?

时间:2011-07-14 21:17:42

标签: c++ tiles

我正在制作一个基于2d平铺的游戏,并且我试图通过使用位结构字段和字节来保持我的平铺结构较小:

struct Tile
{
    // 3 bytes (24 bits)
BYTE i : 8; // Texture index (0-255)
BYTE p : 1; // Passable (0-1)
BYTE x : 7; // Texture x (0-127)
BYTE y : 7; // Texture y (0-127)
BYTE v : 1; // Visible (0-1)
};

所以如果我有一个1024x1024磁贴的2d数组,那么它在内存中只有3mb左右,当我从hd保存/加载时。

但现在我需要动画磁贴,所以我需要额外的数据,如

struct Tile
{
#define TILE_NORMAL     0
#define TILE_ANIMATED   1
    BYTE tile_type;

    // 3 bytes (24 bits)
    BYTE i : 8; // Texture index (0-255)
BYTE p : 1; // Passable (0-1)
BYTE x : 7; // Texture x (0-127)
BYTE y : 7; // Texture y (0-127)
BYTE v : 1; // Visible (0-1)

    // For animated tiles
    BYTE frame;
    BYTE maxFrame;
    float frameTime;
};

在每个图块上,因为2D数组定义如下:

瓷砖[x] [y];

每个图块大约为10个字节,即使很小一部分图块是动画的。

我正在考虑存储一个2D指针数组,然后每个指向一个普通的tile或一个动画的,但这意味着每个指针都是4个字节,并指向至少4-10个字节。

2 个答案:

答案 0 :(得分:3)

如果要保存内存,请不要将动画数据存储在切片中。相反,您可以在游戏程序中定义一个单独的结构,例如:

struct AnimationSequence
{
    BYTE first;
    BYTE current;
    BYTE frames[];
    float frametime;
}

然后你可以定义一些数组,这些数组代表动画的每种类型的平铺,以及它的动画效果。然后,在动画计时器中,循环显示此数组,根据屏幕上的图块进行检查,并根据需要重新绘制它们。

为了节省更多内存,您可能需要考虑的另一件事是在切片数据中存储X / Y坐标值。我假设您的X / Y字节表示在屏幕上绘制图块的位置,或类似的东西。你可以尝试将坐标值附加到他们自己的数组中的游戏视图窗口,而不是贴在瓷砖本身上,这样你只需要有一个视图窗口,可以作为一个查找列表,用于绘制它们时的查找列表到了屏幕,而不是整个地图的价值。

答案 1 :(得分:-1)

你能把这个结构化成一个联盟吗?例如(请原谅任何语法错误,我不记得确切的语法):

struct Tile
{
#define TILE_NORMAL     0
#define TILE_ANIMATED   1
    BYTE tile_type;

    // 3 bytes (24 bits)
    BYTE i : 8; // Texture index (0-255)
    BYTE p : 1; // Passable (0-1)
    BYTE v : 1; // Visible (0-1)
    BYTE x : 7; // Texture x (0-127)
    BYTE y : 7; // Texture y (0-127)

    union
    {
        struct AnimatedTileData
        {
            // For animated tiles
            BYTE frame;
            BYTE maxFrame;
            float frameTime;
        };

        struct NoData
        {
        };
    };
};

所以,通过这种方式,你有一个额外的字节来说明它是否是动画的。如果它没有动画,那么将使用'NoData',不增加任何开销。如果图块是动画的,则为动画相关数据添加6个开销字节。