Как определить структуру плитки для 2D-игры на основе плитки? - PullRequest
0 голосов
/ 15 июля 2011

Я делаю 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)
};

так что если у меня 2d массив 1024x1024 тайлов, то в памяти его только около 3мб, а когда я сохраняю / загружаю с 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 байт, даже если очень небольшая часть плиток является анимированной.

Я думал о том, чтобы сохранить двумерный массив указателей, а затем каждый из них указывает либо на обычный фрагмент, либо на анимированный, но это означало бы, что каждый указатель составляет 4 байта и указывает по крайней мере на 4-10 байтов.

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Если вы хотите сэкономить память, не храните данные анимации в самих плитках.Вместо этого вы можете определить отдельную структуру в вашей игровой программе, например:

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

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

Еще одна вещь, которую вы можете рассмотреть, чтобы сэкономить больше памяти, это не сохранение значений координат X / Y в данных мозаики.Я предполагаю, что ваши байты X / Y представляют позицию, на которой плитка нарисована на экране, или что-то подобное.Вы можете попытаться прикрепить значения координат к окну просмотра игры в их собственном массиве, а не к самим плиткам, так что у вас будет только одно окно просмотра стоимостью плиток, которое будет служить списком поиска, когда вы их рисуете.на экран, а не ценность всей карты.

0 голосов
/ 15 июля 2011

Не могли бы вы сделать структуру объединением?Например (и прошу прощения за любые синтаксические ошибки, я не помню точный синтаксис):

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 служебных байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...