Jump to content
Sign in to follow this  
V3ct0r

Инструмент для обрезания и склеивания карт

Recommended Posts

Инструмент для обрезания и склеивания карт

 

logo.png

 

 

Данный инструмент позволяет вырезать квадратные фрагменты из файлов карт клиента .map и .obj, а так же добавлять фрагменты уже к существующим картам, таким образом, объединять несколько карт в одну.
С её помощью, например, можно вырезать отдельный остров или создать объединенную карту мира.


В .map файлах содержится вся основная информация о картах игрового мира:
1) Области суши и воды;
2) ID текстур поверхности суши;
3) ID регионов из areaset.bin;
4) Рельеф местности, высоты;
5) Проходимые и непроходимые участки;
6) Боевые и безопасные зоны.


В .obj файлах находится список всех неживых объектов, которые присутствуют на карте (здания,  постройки, деревья, растения, камни и тому подобное).


Сам по себе инструмент не является законченной программой – пользователь должен самостоятельно написать программу, которая создаст требуемую карту. В качестве языка программирования используется C++, а средой программирования выступает Visual Studio 2019 Community. Таким образом, для использования данного инструмента потребуются базовые знания языка C++.

 


API


Инструментарий представлен двумя классами, которые находятся в файле Map.h:
1) pkodev::MapFile – класс для работы с картами в формате .map;
2) pkodev::ObjFile – класс для работы с картами в формате .obj.
Данные классы обладают одинаковым интерфейсом.


Кроме того, в файле Map.h определена структура pkodev::point, которая описывает точку с координатами (x, y).


Поскольку, в основном, требуется одновременное редактирование .map и .obj файлов, был определен класс pkodev::MapWrapper, который инкапсулирует внутри себя объекты pkodev::MapFile и pkodev::ObjFile, и обеспечивает их одновременное изменение. Обладает таким же интерфейсом, как и указанные классы.


В процессе работы могут возникнуть ошибки. Для их обработки определены классы исключений pkodev::map_file_exception и pkodev::obj_file_exception, которые являются наследниками класса std::runtime_error.

 

MapFile::MapFile(), ObjFile::ObjFile()
Создать пустую карту с нулевым размером.

 

MapFile(unsigned int width, unsigned int height), ObjFile:: ObjFile(unsigned int width, unsigned int height)

Создать пустую карту с размерами width x height.

 

void MapFile::load(const std::string& path), void ObjFile::load(const std::string& path)
Загрузить карту из файла. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно.

 

void MapFile::save(const std::string& path), void ObjFile:: save (const std::string& path)
Сохранить карту в файл. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно.

 

MapFile MapFile::cut(const point& start, const point& end), ObjFile ObjFile::cut(const point& start, const point& end)
Вырезать квадратный фрагмент карты. start – начальные координаты (x0, y0), end – конечные (x1, y1). Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно.

 

void MapFile::glue(const point& pos, MapFile& map), void ObjFile::glue(const point& pos, ObjFile& map)
Добавить на карту квадратный фрагмент. pos – координаты, по которым разместить фрагмент, map – добавляемый фрагмент карты. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно.

 

void MapFile::del(const point& start, const point& end), void ObjFile::del(const point& start, const point& end)
Удалить с карты квадратный фрагмент. start – начальные координаты (x0, y0), end – конечные (x1, y1). Фрагмент заменяется морем. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно.


void MapFile::clear(), void ObjFile::clear()
Удалить карту и освободить память.

 

Класс pkodev::MapWrapper обладает аналогичным интерфейсом, но есть разница в методах load() и save(): путь до файла указывается без расширения.

 

 

Примеры использования

 

Вырезание фрагмента


Напишем программу, которая вырежет "остров Удачи" из локации "Великий Синий океан". Соответственно, нам необходимо работать с файлами darkblue.map и darkblue.obj. Открываем Visual Studio 2019 Community, создаем консольное приложение C++ и подключаем файлы Map.h и Map.cpp, либо загружаем уже готовый проект из архива во вложении.


Алгоритм программы будет следующий:
1) Открыть файлы darkblue.map и darkblue.obj;
2) Вырезать из них фрагмент с координатами x0 = 1430, y0 = 1675, x1 = 1780, y1 = 2025;
3) Сохранить фрагмент в файлы fortune.map и fortune.obj.


Пишем код:

#include <iostream>
#include "Map.h"

// Точка входа
int main(int argc, char* argv[])
{
    try
    {
        // Создаем объект для одновременной работы с .map и .obj файлами
        pkodev::MapWrapper darkblue;

        // Загружаем карту из файла darkblue
        darkblue.load("C:\\pkodev\\Client\\map\\darkblue");

        // Вырезаем остров удачи
        pkodev::MapWrapper fortune = darkblue.cut({ 1430, 1675 }, { 1780, 2025 });

        // Сохраняем остров удачи
        fortune.save("C:\\pkodev\\Client\\map\\fortune");
    }
    catch (const pkodev::map_file_exception& e)
    {
        std::cout << ".map file error: " << e.what() << std::endl;
        return 1;
    }
    catch (const pkodev::obj_file_exception& e)
    {
        std::cout << ".obj file error: " << e.what() << std::endl;
        return 2;
    }
    catch (...)
    {
        std::cout << "Unknown error!" << std::endl;
        return 3;
    }

    return 0
}

 

В результате получим карту (скриншот из YAMMI):
example_1.png

 

 

Склеивание карт


Теперь попробуем склеить несколько карт в одну. Для примера создадим массив "островов Удачи", из острова, который мы получили в прошлом примере.


Алгоритм программы будет следующий:
1) Создать пустую карту размером 1024 x 1024;
2) Загрузить "остров Удачи" из файлов fortune.map и fortune.obj;
3) Поместить "остров Удачи" по координатам (128, 32) на карту;
4) Поместить "остров Удачи" по координатам (512, 320) на карту;
5) Поместить "остров Удачи" по координатам (128, 576) на карту;
6) Сохранить карту в файл array.map и array.obj.


Пишем код:

#include <iostream>
#include "Map.h"

// Точка входа
int main(int argc, char* argv[])
{
    try
    {
        // Создаем пустую карту 1024 x 1024
        pkodev::MapWrapper map(1024, 1024);

        // Остров Удачи
        pkodev::MapWrapper fortune;

        // Загружаем остров Удачи из файла
        fortune.load("C:\\pkodev\\Client\\map\\fortune");

        // Добавляем несколько островов Удачи на пустую карту
        map.glue({ 128, 32  }, fortune);
        map.glue({ 512, 320 }, fortune);
        map.glue({ 128, 576 }, fortune);

        // Сохраняем карту
        map.save("C:\\pkodev\\Client\\map\\array");
    }
    catch (const pkodev::map_file_exception& e)
    {
        std::cout << ".map file error: " << e.what() << std::endl;
        return 1;
    }
    catch (const pkodev::obj_file_exception& e)
    {
        std::cout << ".obj file error: " << e.what() << std::endl;
        return 2;
    }
    catch (...)
    {
        std::cout << "Unknown error!" << std::endl;
        return 3;
    }

    return 0;
}

 

В результате получим карту (скриншот из YAMMI):
example_2.png

 


Скачать инструмент (9 Кб)

  • Like 4
  • Thanks 2

Share this post


Link to post
Share on other sites

lucky -> fortune

lucky.load("C:\\pkodev\\Client\\map\\fortune");

 

  • Thanks 1

Работаем над портированием пиратии под все платформы (win, linux, android, macos, ios)

We are developing the tales of pirates to all platform (win, linux, android, macos, ios)

 

telegram: https://t.me/magicsea_online

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...