| netlib.narod.ru | < Назад | Оглавление | Далее > |
Вау! Мы уже узнали как редактировать карту, так что не осталось никаких препятствий на пути к вершинам картографии. Редактирование карт — великолепная возможность, но она бессмысленна, если вы не можете сохранить результаты своей работы. Здесь на сцену выходит функция сохранения карты. В этом разделе я покажу вам как добавить к программе D3D_MapEditorLite полнофункциональные кнопки сохранения и загрузки. Загрузите новый улучшенный проект D3D_MapEditorPlus и пойдемте дальше. Сперва взгляните на рис. 10.10, где изображено окно этой программы.

Рис. 10.10. Окно программы D3D_MapEditorPlus
На рис 10.10 видно, что я добавил на панель инструментов кнопки Load и Save. Их функции должны быть ясны, поскольку кнопка Load загружает данные карты из указанного файла, а кнопка Save сохраняет данные карты в указанном файле.
Чтобы сохранить карту вам необходимо сохранить все содержимое массива блоков g_iTileMap. Поскольку массив представляет собой одну непрерывную область памяти, операция достаточно проста. Фактически, вы должны создать файл для сохранения данных, записать в этот файл содержимое массива блочной карты, после чего закрыть файл. Для большего удобства я добавил функциональность, предоставляющую пользователю диалоговое окно выбора файла. Оно позволяет выбрать имя файла данных с помощью простого и интуитивно понятного интерфейса. Вот как выглядит код, который я использую для сохранения карты:
void vSaveMap(void)
{
FILE *fp;
int iRet;
OPENFILENAME fileStruct;
char szFileName[512];
char szFilter[32];
char szExtension[32];
// Очищаем буфер для получения имени файла
memset(szFileName, 0x00, 512);
// Создаем фильтр имен файлов
memset(szFilter, 0x00, 32);
strcpy(szFilter, "*.dat");
// Указываем расширение имени файла
memset(szExtension, 0x00, 32);
strcpy(szExtension, "dat");
// Создаем структуру диалога выбора файла
memset(&fileStruct, 0x00, sizeof(OPENFILENAME));
// Инициализируем структуру
fileStruct.hInstance = g_hInstance;
fileStruct.hwndOwner = g_hWnd;
fileStruct.lpstrDefExt = szExtension;
fileStruct.lpstrFileTitle = szFileName;
fileStruct.lpstrFilter = szFilter;
fileStruct.nMaxFileTitle = 512;
fileStruct.lStructSize = sizeof(OPENFILENAME);
// Получаем имя файла
iRet = GetSaveFileName(&fileStruct);
// Выходим в случае ошибки
if(!iRet) {
return;
}
// Открываем файл
fp = fopen(szFileName, "wb");
// Возвращаемся, если не можем открыть файл
if(fp == NULL) {
return;
}
// Сохраняем буфер блочной карты
fwrite(g_iTileMap, 10000, sizeof(int), fp);
// Закрываем файл
fclose(fp);
// Воспроизводим звук, сообщающий о завершении действия
PlaySound("bleep.wav",NULL,SND_FILENAME|SND_ASYNC);
}
В первой части кода выполняется инициализация структуры данных OPENFILENAME, необходимой для функции GetSaveFileName(). Функция GetSaveFileName() является частью Microsoft Visual C++ SDK и предоставляет все необходимое для создания диалогового окна сохранения файла.
После того, как вызванная функция возвратила имя файла, откройте файл и сохраните в нем содержимое массива карты. Здесь можно воспользоваться функцией fwrite(), которая замечательно справится с этой работой.
Поднимающийся вверх должен будет спуститься вниз и точно так же открытое должно быть закрыто. В согласии с этой политикой я вызываю функцию fclose() чтобы закрыть открытый файл с данными карты. Вы можете спросить, зачем выполнив все действия я выполняю воспроизведение звука. Это поможет пользователю понять, что сохранение карты успешно завершено. Данное действие не является необходимым, но это признак хорошего стиля.
Загрузите редактор карт и поиграйте с ним, редактируя и сохраняя карты. Это предоставит вам материал для экспериментов с загрузкой карт.
Функция загрузки карты работает во многом так же, как и функция сохранения карты. Тем не менее, в ней есть ряд ключевых отличий. Во-первых, функция GetSaveFileName() заменена на функцию GetOpenFileName(). Я не знаю, почему есть две различных функции, выполняющих одинаковые действия, но кто я такой, чтобы подвергать сомнению установленный порядок вещей? Так или иначе, но функция получает имя открываемого файла и заносит его в указанную строку. Убедившись, что указанный файл существует, код открывает его, и загружает содержимое в глобальный массив карты. После завершения работы воспроизводится звуковой сигнал, оповещающий об успешной загрузке файла.
Если вы этого еще не сделали, запустите программу D3D_MapEditorPlus и щелкните по кнопке Load. Загрузите файл с именем TileMap.dat и вы увидите рисунок, выполненный моей рукой из песка.
Это все основные сведения о загрузке и сохранении блочных карт. С демонстрацией!
| netlib.narod.ru | < Назад | Оглавление | Далее > |