gpt4 book ai didi

c++ - 如何为基于 2D tile 的游戏定义 tile 结构?

转载 作者:行者123 更新时间:2023-11-28 03:48:13 32 4
gpt4 key购买 nike

我正在制作一个基于 2d tile 的游戏,我试图通过对 tile 结构中的值使用位字段和字节来保持我的 tile 结构小:

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 block 的二维数组,那么它在内存中只有大约 3mb,当我从高清保存/加载时。

但现在我需要动画图 block ,所以我需要额外的数据,例如,

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;
};

在每个图 block 上,由于二维数组定义如下:

瓷砖瓷砖[x][y];

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

我想存储一个二维指针数组,然后每个指针指向一个普通图 block 或一个动画图 block ,但这意味着每个指针都是 4 个字节,并且指向至少 4-10 个字节。

最佳答案

如果您想节省内存,请不要将动画数据存储在图 block 本身中。相反,您可以在游戏程序中定义一个单独的结构,例如:

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

然后您可以定义一个包含其中几个的数组,它们代表每种类型的动画图 block 及其动画方式。然后,在您的动画计时器中,循环遍历此数组,对照屏幕上的图 block 检查它,并根据需要重新绘制它们。

为了节省更多内存,您可能要考虑的另一件事是在图 block 数据中存储 X/Y 坐标值。我假设您的 X/Y 字节表示图 block 在屏幕上绘制的位置,或类似的东西。您可以尝试将坐标值附加到游戏的 View 窗口中它们自己的数组中,而不是附加到图 block 本身,这样当您绘制它们时,您将只有一个 View 窗口值的图 block 作为查找列表显示在屏幕上,而不是整个 map 的值(value)。

关于c++ - 如何为基于 2D tile 的游戏定义 tile 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6700037/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com