Простейший способ отображения блоков — использование метода двухмерной сетки. В этом методе вы отображаете на экране горизонтальные и вертикальные столбцы из блоков.
Вы уже видели это раньше, поскольку я пользуюсь этим методом во многих примерах. Первый блок карты располагается в верхнем левом углу сетки. Последний блок карты находится в нижнем правом углу. Отображение карты из блоков так же просто, как обход карты слева направо и сверху вниз. Взгляните на следующий фрагмент кода:
int x,y;
// отображение сверху вниз
for(y = 0; y < 10; y++) {
// Отображение слева направо
for(x = 0; x < 10; x++) {
// Ваша функция для отображения блока
vDisplayTile(x, y);
}
}
В коде есть два цикла. Первый цикл увеличивает позицию блока по вертикали. Второй цикл увеличивает позицию блока по горизонтали. Поместив цикл перебора позиций по горизонтали внутрь цикла перебора позиций по вертикали, вы получаете рисунок всей сетки.
Обратите внимание, что нумерация блоков начинается с 0 в верхнем левом углу и заканчивается 99 в нижнем правом углу. Разве это не просто?
Возможно, вы задаетесь вопросом, как выглядит функция vDisplayTile(). Перед тем, как написать функцию отображения блока, вы должны сперва подумать о том, как будет храниться карта блоков. Общепринятый метод хранения карты блоков — представление карты в виде одного большого массива. Взгляните на следующий пример кода, чтобы увидеть использование этого метода:
// Глобальный массив для карты блоков
int g_iTileMap[100]; // 10*10 = 100 ячеек необходимо
// Прототип функции отображения блока
void vDisplayTile(int x, int y);
void main()
{
int x, y;
// Сверху вниз
for(y = 0; y < 10; y++) {
// Слева направо
for (x = 0; x < 10; x++) {
// Отображение блока
vDisplayTile(x, y);
}
}
}
void vDisplayTile(int x, int y)
{
int iTile;
int tileWidth = 64;
int tileHeight = 64;
int mapWidth = 10;
//
// Вычисляем номер блока, расположенного
// по полученным координатам x и y.
//
iTile = g_iTileMap[(x + (y * mapWidth))];
// Отображение на экране растрового изображения
// Следующая функция является фиктивной
// и представляет лишь псевдокод. Чтобы код
// работал вам необходимо заменить ее на
// настоящую функцию рисования блока.
//
DrawBitmap(iTile, (x * tileWidth), (y * tileHeight));
}
В приведенной выше функции main() программа в цикле последовательно перебирает блоки и вызывает функцию vDisplayTile(). Код функции отображения блока начинается с вычисления, где в массиве блоков расположено значение, относящееся к данному блоку, и извлечения этого значения. При вычислении берется координата X и к ней прибавляется координата Y умноженная на ширину карты.
Как вычислить местоположение в массиве
Получение местоположение блока в массиве начинается с координаты X. От блока в верхнем левом углу мы перемещаемся на пять блоков вправо. В результате мы окажемся в позиции, отмеченной на рисунке буквой A.
Теперь к текущей позиции вы должны прибавить координату Y блока, умноженную на ширину карты. Ширина карты равна десяти блокам, поэтому мы прибавляем 10 * 5 (координата Y) к текущей позиции. Следуйте по стрелке, размещенной справа от позиции, помеченной буквой A, и вы увидите, что она заканчивается в искомой позиции массива, отмеченной буквой B.
Мы получаем следующую формулу:
X (A) + (Y * Ширина карты) = Позиция в массиве (B)
Его просто легче представить себе, если изобразить в виде сетки. Преимущество использования массива состоит в том, что он непосредственно соответствует тому, что видит пользователь. Нет никаких сложных связанных списков, которые следует обходить, только один простой массив.
Как вычислить видимую позицию
Следующая функция в программе, DrawBitmap(), является искусственной функцией, которая напоминает обычную графическую функцию, используемую для отображения двухмерного растрового изображения. В вызове этой воображаемой функции присутствуют три параметра: графический блок, экранная координата X и экранная координата Y.
Первый параметр, графический блок, используется чтобы указать, какое растровое изображение должно быть отображено на экране. Это достаточно просто, и в вашей настоящей реализации вы можете либо непосредственно ссылаться на растровое изображение, либо указывать номер растрового изображения в списке.
Второй параметр, координата X, задает экранную координату X в которой будет отображен блок. Чтобы получить эту позицию вы умножаете ширину блока на его координату X в карте блоков. Это дает вам координату X блока в пикселях.
Третий параметр, координата Y, действует аналогично второму параметру, за исключением того, что задает позицию выводимого изображения по вертикали.
Координаты X и Y в пикселах для блока с координатами на карте 5, 5 будут равны (5 * 64), (5 * 64), или 320, 320. Большинство графических функций позволяют указать координаты X и Y растрового изображения, так что пример не должен вызывать никаких затруднений.
Вот как вычисляются координаты X и Y для блока в пикселях:
Координата X в пикселях = Координата X блока на карте * Ширина блока
Координата Y в пикселях = Координата Y блока на карте * Высота блока