Changes between Version 5 and Version 6 of WorkingWithTilesets_v1


Ignore:
Timestamp:
Oct 22, 2008 3:27:43 AM (16 years ago)
Author:
sagrer
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • WorkingWithTilesets_v1

    v5 v6  
    2626 == Принцип реализации ==
    2727
    28 Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является TTileSet, который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - TTileSetsCollection - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. TTileSetsCollection содержит:
     28Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является '''TTileSet''', который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - '''TTileSetsCollection''' - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. '''TTileSetsCollection содержит''':
     29 * Строка - имя набора тайлсетов (возм. по имени каталога - это чисто для юзверя).
    2930 * Массив ссылок на все объекты тайлсетов.
    3031 * Путь по которому располагаются тайлсеты.
    3132 * Путь к временному каталогу для временных файлов при работе с тайлсетами.
    3233 * Ссылка на !CallBack-метод, для синхронизации при многопоточной работе, с учетом того что !CallBack будет иметь доступ к инфе объекта и всей вложенной инфе.
     34 * Булево значение - если true то !CallBack используется.
    3335Также содержит методы:
    3436 * Удалений, добавлений тайлсетов.
    35  * Методы, осуществляющие собственно чтение тайлсетов. Предусмотреть основной метод, выполняющий всю работу и своевременные вызовы !CallBack, а также открытые методы-обертки для вызова с и без использования !CallBack, при этом основной метод можно спрятать от простых смертных и оставить доступными только обертки.
     37 * Метод, осуществляющие собственно чтение набора тайлсетов.
    3638 * Метод, возвращающий true если в каком-либо из тайлсетов есть "неправильные" (с нестандартной структурой) тайлы и false если таких нет.
    3739
    38 TTileSet содержит:
     40'''TTileSet содержит''':
    3941 * Обратную ссылку на объект TTileSetsCollection.
    40  * Ссылку на объект, реализующий работу с файлом !TileSet.ini для этого тайлсета (TTileSetIni).
     42 * Ссылку на объект, реализующий работу с файлом !TileSet.ini для этого тайлсета (TTileSetIni) - описание формата смотри [wiki:TileSetIniFormat_v1 тут].
     43 * Строка - имя тайлсета.
     44 * Строка - полный путь к тайлсету.
     45 * Строка - полный путь к временной директории тайлсета (используется если он сжатый).
     46 * Булево значение - используется ли svn.
     47 * Число - номер ревизии в случае если используется svn.
    4148 * Массив ссылок на все тайлы, принадлежащие тайлсету - точнее на объекты класса TTile, реализующего работу с тайлом.
    4249 * Массив ссылок на все тайлы, файлы которых реально существуют.
     
    4451 * Массив ссылок на все террейны, принадлежащие тайлсету - т.е. на объекты класса TTerrain, реализующего работу с террейном.
    4552 * Массив ссылок на объекты класса TLayer, который по-сути является контейнером ссылок на объекты TTerrain и содержит ссылки на все террейны своего слоя.
     53 * Ссылка на объект класса TMasksSet - описание класса смотри на [wiki:WorkingWithMasks странице] с описанием работы масок.
    4654 * Список строк Allow и Deny для информации из имен файлов разрешений-запретов переходов.
    4755 * Дополнительная информация о тайлсете, например номер ревизии в случае если используется svn.
    4856 * Объект класса TFlistFormat для списка тайлов в сжатом тайлсете.
    4957 * Объект класса TFlistFormat для списка тайлов в временном каталоге с тайлами тайлсета. Последние 2 элемента - используются только если работаем со сжатым тайлсетом.
    50  * Список строк - имена всех террейнов тайлсета, мне выполнения методов должен быть в алфавитном порядке и соответствовать приоритету террейнов.
     58 * Список строк - имена всех террейнов тайлсета, вне выполнения методов должен быть в алфавитном порядке и соответствовать приоритету террейнов.
    5159 * Булево значение - true если есть "неправильные" тайлы и false если таковых нет.
    5260 * Булево значение - true если есть тайлы без реального файла с картинкой и false если таковых нет.
    53  * Ссылка на объект класса TMasksSet - описание класса смотри на [wiki:WorkingWithMasks странице] с описанием работы масок.
    5461Также тут есть методы для:
    5562 * Удалений, добавлений тайлов (по имени, влияющая на все три массива ссылок на тайлы).
     
    6976Кроме этого - следует организовать выделение и освобождение памяти так, чтобы памятью всех слоев, террейнов и тайлов заведовал именно класс TTileSet. Другие классы также могут иметь подобные ссылки, и даже выделять память под новые объекты - но в любом случае такой объект должен попасть в массив объекта TTileSet и в дальнейшем уничтожаться должен под управлением именно TTileSet, если же вложенные в него объекты сами новых объектов не создают, то использоваться может только копирование ссылки на уже созданный объект. Таким образом, в других классах может использоваться new, но delete всегда выполняется только классом TTileSet, причем гарантированно для всего, что могло быть создано по любому такому new.
    7077
    71 Класс TLayer весьма прост и содержит только номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой.
     78'''Класс TLayer''' весьма прост и '''содержит''' только номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой.
    7279
    73 Класс TTileSetIni по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, содержит в себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать.
     80'''Класс TTileSetIni''' по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, '''содержит''' в себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать.
    7481
    75 На уровне террейна работа обеспечивается объектами класса TTerrain, который содержит:
     82На уровне террейна работа обеспечивается объектами класса '''TTerrain, который содержит''':
    7683 * Имя террейна.
    7784 * Число - приоритет террейна. Если приоритет неизвестен то значение = 0.
    7885 * Ссылку на объект класса TLayer, которому принадлежит террейн. Если имеются проблемы с идентификацией единственного номера слоя - присваивается ссылка на слой с индексом 00 (ноль).
    79  * Численное значение слоя террейна. Если это 00 значит имеются проблемы с идентификацией номера слоя (например есть тайлы для одного террейна и разных слоев).
    80  * Массив чисел со всеми найденными для этого террейна значениями слоя.
    81  * Списки Allow и Deny содержащие имена террейнов, на которые, соответственно, разрешен или запрещен переход.
     86 * Массив линков со всеми найденными для этого террейна значениями слоя.
     87 * Массивы ссылок Allow и Deny на объекты террейнов, на которые, соответственно, разрешен или запрещен переход.
    8288 * Массив ссылок на все тайлы террейна.
    8389 * Обратная ссылка на тайлсет, которому принадлежит террейн.
     
    8591 * Удаления\добавления тайлов. Работают по имени или индексу. Убеждаются что такой тайл имеется в террейне, затем удаляется на уровне тайлсета.
    8692 * Удаления\добавления элементов Allow и Deny - с синхронизацией с вовлеченными террейнами и списками реальных имен файлов в объекте тайлсета.
    87  * Смена слоя. Работает независимо от того, есть ли проблемы со слоями, меняет слой, переименовывает файлы тех тайлов, от которых есть какой-то смысл, остальные тайлы (т.е. те переходы, которые больше не нужны) либо удаляются, либо переименовываются как будто бы в них был смысл (в зависимости от аргументов метода) - второй вариант может использоваться при смене слоя сразу для нескольких террейнов без потери перехода между ними. При наличии проблемы со слоями, даже если работает с удалением
     93 * Смена слоя. Работает независимо от того, есть ли проблемы со слоями, меняет слой, переименовывает файлы тех тайлов, от которых есть какой-то смысл, остальные тайлы (т.е. те переходы, которые больше не нужны) либо удаляются, либо переименовываются как будто бы в них был смысл (в зависимости от аргументов метода) - второй вариант может использоваться при смене слоя сразу для нескольких террейнов без потери перехода между ними.
    8894
    89 На уровне тайла вся работа обеспечивается классом TTile, который содержит:
     95На уровне тайла вся работа обеспечивается классом '''TTile, который содержит''':
    9096 * Ссылку на свой тайлсет.
    9197 * Ссылку на свой слой.
     
    102108 * Метод, возвращающий bmp-ху тайла без поворотов (вызывает предыдущий метод с нулевым поворотом).
    103109
    104 Класс TTileTerrs был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. Собержит:
    105  * Строки A,B,C,D с именами террейнов в соотв. углах (справа налево, по строкам сверху вниз, A соответствует {Terr1} а D соответствует {Terr4} в имени тайла). Вот табличка расположения углов:
     110'''Класс TTileTerrs''' был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. '''TTileTerrs Содержит''':
     111 * Аналогично ссылки на террейны (вместо имен) в соотв. углах (справа налево, по строкам сверху вниз, A соответствует {Terr1} а D соответствует {Terr4} в имени тайла). Вот табличка расположения углов:
    106112||A||B||
    107113||C||D||
     
    172178 == Как это все по идее должно работать ==
    173179
    174 В начале программа создает верхний уровень - объект класса TTileSetsCollection. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта TTileSetsCollection когда он станет не нужен.
     180В начале программа создает верхний уровень - объект класса '''TTileSetsCollection'''. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта '''TTileSetsCollection''' когда он станет не нужен.
    175181
    176 После создания объекта класса TTileSetsCollection - программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов.
     182После создания объекта класса '''TTileSetsCollection''' - программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов.
    177183
    178 Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса TTileSet. Обращаю внимание, что все вложенные в TTileSetsCollection объекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов.
     184Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса '''TTileSet'''. Обращаю внимание, что все вложенные в '''TTileSetsCollection''' объекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов.
    179185
    180 Для каждого объекта TTileSet вызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром.
     186Для каждого объекта '''TTileSet''' вызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром.
    181187
    182188Метод чтения информации тайлсетов - для начала читает свой конфиг, если используется svn - читает информацию о ревизии. Если тайлсет сжат - первым делом выполняет синхронизацию с временной, несжатой версией тайлсета. Затем - производит поиск всех файлов с тайлами, подсчитывает их количество, после чего (либо одновременно - смотря как будет реализовано и как оптимальнее работает) выделяет нужное количество объектов в массив с тайлами и загружает в эти объекты информацию по всем найденным тайлам. Обновременно со вбивкой информации в основной массив - создаются объекты террейнов, слоев, в них вбивается соответствующая информация, в т.ч. присваиваются ссылки на объекты тайлов. По завершению всего этого процесса - все объекты террейнов и слоев уже созданы, в них есть массивы со ссылками на тайлы. После этого становится возможным составление списка террейнов по алфавиту и установка приоритета для них.
     
    186192Затем осуществляется генерация всех возможных тайлов-переходов - если такой переходный тайл уже наличествует, хотя-бы в количестве 1 (адЫн) штука - ничего не происходит, если же ни одного такого тайла найдено не было - создается объект тайла, с пометкой что файла картинки у него нет, ссылка на него добавляется во все соответствующие массивы соответствующих объектов.
    187193
    188 Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса TTileSetsCollection содержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов.
     194Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса '''TTileSetsCollection''' содержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов.
    189195
    190196Кроме этого у всех объектов системы имеются дополнительные методы, которые не вызываются при чтении тайлсетов, и предназначены для непосредственного их вызова программой - например методы удаления\добавления тайлов, генерации переходных тайлов, исправления "неправильных" тайлов и т.д. Подробно расписывать эти методы смысла нет, ибо механизм их действия понятен из простого их описания, а описания же для них наличествуют выше в данном тексте, в списках методов классов.