netlib.narod.ru< Назад | Оглавление | Далее >

Сохранение и загрузка карты

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


Рис. 10.10. Окно программы D3D_MapEditorPlus

Рис. 10.10. Окно программы D3D_MapEditorPlus


На рис 10.10 видно, что я добавил на панель инструментов кнопки Load и Save. Их функции должны быть ясны, поскольку кнопка Load загружает данные карты из указанного файла, а кнопка Save сохраняет данные карты в указанном файле.

Функция SaveMap()

Чтобы сохранить карту вам необходимо сохранить все содержимое массива блоков 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 и предоставляет все необходимое для создания диалогового окна сохранения файла.

СОВЕТ
Предоставляемое Microsoft диалоговое окно делает получение имени файла очень простой задачей. Я рекомендую вам применять его в своих программах.

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

Поднимающийся вверх должен будет спуститься вниз и точно так же открытое должно быть закрыто. В согласии с этой политикой я вызываю функцию fclose() чтобы закрыть открытый файл с данными карты. Вы можете спросить, зачем выполнив все действия я выполняю воспроизведение звука. Это поможет пользователю понять, что сохранение карты успешно завершено. Данное действие не является необходимым, но это признак хорошего стиля.

ПРИМЕЧАНИЕ
Если вы введете имя файла в поле Save As и не выберете расширение, файл будет сохранен без расширения. Убедитесь, что вы сохраняете карты в файлы с расширением .dat, если не хотите столкнуться с проблемами во время их загрузки.

Загрузите редактор карт и поиграйте с ним, редактируя и сохраняя карты. Это предоставит вам материал для экспериментов с загрузкой карт.

Функция LoadMap()

Функция загрузки карты работает во многом так же, как и функция сохранения карты. Тем не менее, в ней есть ряд ключевых отличий. Во-первых, функция GetSaveFileName() заменена на функцию GetOpenFileName(). Я не знаю, почему есть две различных функции, выполняющих одинаковые действия, но кто я такой, чтобы подвергать сомнению установленный порядок вещей? Так или иначе, но функция получает имя открываемого файла и заносит его в указанную строку. Убедившись, что указанный файл существует, код открывает его, и загружает содержимое в глобальный массив карты. После завершения работы воспроизводится звуковой сигнал, оповещающий об успешной загрузке файла.

Если вы этого еще не сделали, запустите программу D3D_MapEditorPlus и щелкните по кнопке Load. Загрузите файл с именем TileMap.dat и вы увидите рисунок, выполненный моей рукой из песка.

Это все основные сведения о загрузке и сохранении блочных карт. С демонстрацией!


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz