Changes between Version 5 and Version 6 of WorkingWithTilesets_v1
- Timestamp:
- Oct 22, 2008 3:27:43 AM (16 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
WorkingWithTilesets_v1
v5 v6 26 26 == Принцип реализации == 27 27 28 Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является TTileSet, который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - TTileSetsCollection - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. TTileSetsCollection содержит: 28 Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является '''TTileSet''', который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - '''TTileSetsCollection''' - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. '''TTileSetsCollection содержит''': 29 * Строка - имя набора тайлсетов (возм. по имени каталога - это чисто для юзверя). 29 30 * Массив ссылок на все объекты тайлсетов. 30 31 * Путь по которому располагаются тайлсеты. 31 32 * Путь к временному каталогу для временных файлов при работе с тайлсетами. 32 33 * Ссылка на !CallBack-метод, для синхронизации при многопоточной работе, с учетом того что !CallBack будет иметь доступ к инфе объекта и всей вложенной инфе. 34 * Булево значение - если true то !CallBack используется. 33 35 Также содержит методы: 34 36 * Удалений, добавлений тайлсетов. 35 * Метод ы, осуществляющие собственно чтение тайлсетов. Предусмотреть основной метод, выполняющий всю работу и своевременные вызовы !CallBack, а также открытые методы-обертки для вызова с и без использования !CallBack, при этом основной метод можно спрятать от простых смертных и оставить доступными только обертки.37 * Метод, осуществляющие собственно чтение набора тайлсетов. 36 38 * Метод, возвращающий true если в каком-либо из тайлсетов есть "неправильные" (с нестандартной структурой) тайлы и false если таких нет. 37 39 38 TTileSet содержит:40 '''TTileSet содержит''': 39 41 * Обратную ссылку на объект TTileSetsCollection. 40 * Ссылку на объект, реализующий работу с файлом !TileSet.ini для этого тайлсета (TTileSetIni). 42 * Ссылку на объект, реализующий работу с файлом !TileSet.ini для этого тайлсета (TTileSetIni) - описание формата смотри [wiki:TileSetIniFormat_v1 тут]. 43 * Строка - имя тайлсета. 44 * Строка - полный путь к тайлсету. 45 * Строка - полный путь к временной директории тайлсета (используется если он сжатый). 46 * Булево значение - используется ли svn. 47 * Число - номер ревизии в случае если используется svn. 41 48 * Массив ссылок на все тайлы, принадлежащие тайлсету - точнее на объекты класса TTile, реализующего работу с тайлом. 42 49 * Массив ссылок на все тайлы, файлы которых реально существуют. … … 44 51 * Массив ссылок на все террейны, принадлежащие тайлсету - т.е. на объекты класса TTerrain, реализующего работу с террейном. 45 52 * Массив ссылок на объекты класса TLayer, который по-сути является контейнером ссылок на объекты TTerrain и содержит ссылки на все террейны своего слоя. 53 * Ссылка на объект класса TMasksSet - описание класса смотри на [wiki:WorkingWithMasks странице] с описанием работы масок. 46 54 * Список строк Allow и Deny для информации из имен файлов разрешений-запретов переходов. 47 55 * Дополнительная информация о тайлсете, например номер ревизии в случае если используется svn. 48 56 * Объект класса TFlistFormat для списка тайлов в сжатом тайлсете. 49 57 * Объект класса TFlistFormat для списка тайлов в временном каталоге с тайлами тайлсета. Последние 2 элемента - используются только если работаем со сжатым тайлсетом. 50 * Список строк - имена всех террейнов тайлсета, мне выполнения методов должен быть в алфавитном порядке и соответствовать приоритету террейнов.58 * Список строк - имена всех террейнов тайлсета, вне выполнения методов должен быть в алфавитном порядке и соответствовать приоритету террейнов. 51 59 * Булево значение - true если есть "неправильные" тайлы и false если таковых нет. 52 60 * Булево значение - true если есть тайлы без реального файла с картинкой и false если таковых нет. 53 * Ссылка на объект класса TMasksSet - описание класса смотри на [wiki:WorkingWithMasks странице] с описанием работы масок.54 61 Также тут есть методы для: 55 62 * Удалений, добавлений тайлов (по имени, влияющая на все три массива ссылок на тайлы). … … 69 76 Кроме этого - следует организовать выделение и освобождение памяти так, чтобы памятью всех слоев, террейнов и тайлов заведовал именно класс TTileSet. Другие классы также могут иметь подобные ссылки, и даже выделять память под новые объекты - но в любом случае такой объект должен попасть в массив объекта TTileSet и в дальнейшем уничтожаться должен под управлением именно TTileSet, если же вложенные в него объекты сами новых объектов не создают, то использоваться может только копирование ссылки на уже созданный объект. Таким образом, в других классах может использоваться new, но delete всегда выполняется только классом TTileSet, причем гарантированно для всего, что могло быть создано по любому такому new. 70 77 71 Класс TLayer весьма прост и содержиттолько номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой.78 '''Класс TLayer''' весьма прост и '''содержит''' только номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой. 72 79 73 Класс TTileSetIni по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, содержитв себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать.80 '''Класс TTileSetIni''' по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, '''содержит''' в себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать. 74 81 75 На уровне террейна работа обеспечивается объектами класса TTerrain, который содержит:82 На уровне террейна работа обеспечивается объектами класса '''TTerrain, который содержит''': 76 83 * Имя террейна. 77 84 * Число - приоритет террейна. Если приоритет неизвестен то значение = 0. 78 85 * Ссылку на объект класса TLayer, которому принадлежит террейн. Если имеются проблемы с идентификацией единственного номера слоя - присваивается ссылка на слой с индексом 00 (ноль). 79 * Численное значение слоя террейна. Если это 00 значит имеются проблемы с идентификацией номера слоя (например есть тайлы для одного террейна и разных слоев). 80 * Массив чисел со всеми найденными для этого террейна значениями слоя. 81 * Списки Allow и Deny содержащие имена террейнов, на которые, соответственно, разрешен или запрещен переход. 86 * Массив линков со всеми найденными для этого террейна значениями слоя. 87 * Массивы ссылок Allow и Deny на объекты террейнов, на которые, соответственно, разрешен или запрещен переход. 82 88 * Массив ссылок на все тайлы террейна. 83 89 * Обратная ссылка на тайлсет, которому принадлежит террейн. … … 85 91 * Удаления\добавления тайлов. Работают по имени или индексу. Убеждаются что такой тайл имеется в террейне, затем удаляется на уровне тайлсета. 86 92 * Удаления\добавления элементов Allow и Deny - с синхронизацией с вовлеченными террейнами и списками реальных имен файлов в объекте тайлсета. 87 * Смена слоя. Работает независимо от того, есть ли проблемы со слоями, меняет слой, переименовывает файлы тех тайлов, от которых есть какой-то смысл, остальные тайлы (т.е. те переходы, которые больше не нужны) либо удаляются, либо переименовываются как будто бы в них был смысл (в зависимости от аргументов метода) - второй вариант может использоваться при смене слоя сразу для нескольких террейнов без потери перехода между ними. При наличии проблемы со слоями, даже если работает с удалением93 * Смена слоя. Работает независимо от того, есть ли проблемы со слоями, меняет слой, переименовывает файлы тех тайлов, от которых есть какой-то смысл, остальные тайлы (т.е. те переходы, которые больше не нужны) либо удаляются, либо переименовываются как будто бы в них был смысл (в зависимости от аргументов метода) - второй вариант может использоваться при смене слоя сразу для нескольких террейнов без потери перехода между ними. 88 94 89 На уровне тайла вся работа обеспечивается классом TTile, который содержит:95 На уровне тайла вся работа обеспечивается классом '''TTile, который содержит''': 90 96 * Ссылку на свой тайлсет. 91 97 * Ссылку на свой слой. … … 102 108 * Метод, возвращающий bmp-ху тайла без поворотов (вызывает предыдущий метод с нулевым поворотом). 103 109 104 Класс TTileTerrs был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. Собержит:105 * Строки A,B,C,D с именами террейновв соотв. углах (справа налево, по строкам сверху вниз, A соответствует {Terr1} а D соответствует {Terr4} в имени тайла). Вот табличка расположения углов:110 '''Класс TTileTerrs''' был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. '''TTileTerrs Содержит''': 111 * Аналогично ссылки на террейны (вместо имен) в соотв. углах (справа налево, по строкам сверху вниз, A соответствует {Terr1} а D соответствует {Terr4} в имени тайла). Вот табличка расположения углов: 106 112 ||A||B|| 107 113 ||C||D|| … … 172 178 == Как это все по идее должно работать == 173 179 174 В начале программа создает верхний уровень - объект класса TTileSetsCollection. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта TTileSetsCollectionкогда он станет не нужен.180 В начале программа создает верхний уровень - объект класса '''TTileSetsCollection'''. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта '''TTileSetsCollection''' когда он станет не нужен. 175 181 176 После создания объекта класса TTileSetsCollection- программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов.182 После создания объекта класса '''TTileSetsCollection''' - программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов. 177 183 178 Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса TTileSet. Обращаю внимание, что все вложенные в TTileSetsCollectionобъекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов.184 Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса '''TTileSet'''. Обращаю внимание, что все вложенные в '''TTileSetsCollection''' объекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов. 179 185 180 Для каждого объекта TTileSetвызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром.186 Для каждого объекта '''TTileSet''' вызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром. 181 187 182 188 Метод чтения информации тайлсетов - для начала читает свой конфиг, если используется svn - читает информацию о ревизии. Если тайлсет сжат - первым делом выполняет синхронизацию с временной, несжатой версией тайлсета. Затем - производит поиск всех файлов с тайлами, подсчитывает их количество, после чего (либо одновременно - смотря как будет реализовано и как оптимальнее работает) выделяет нужное количество объектов в массив с тайлами и загружает в эти объекты информацию по всем найденным тайлам. Обновременно со вбивкой информации в основной массив - создаются объекты террейнов, слоев, в них вбивается соответствующая информация, в т.ч. присваиваются ссылки на объекты тайлов. По завершению всего этого процесса - все объекты террейнов и слоев уже созданы, в них есть массивы со ссылками на тайлы. После этого становится возможным составление списка террейнов по алфавиту и установка приоритета для них. … … 186 192 Затем осуществляется генерация всех возможных тайлов-переходов - если такой переходный тайл уже наличествует, хотя-бы в количестве 1 (адЫн) штука - ничего не происходит, если же ни одного такого тайла найдено не было - создается объект тайла, с пометкой что файла картинки у него нет, ссылка на него добавляется во все соответствующие массивы соответствующих объектов. 187 193 188 Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса TTileSetsCollectionсодержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов.194 Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса '''TTileSetsCollection''' содержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов. 189 195 190 196 Кроме этого у всех объектов системы имеются дополнительные методы, которые не вызываются при чтении тайлсетов, и предназначены для непосредственного их вызова программой - например методы удаления\добавления тайлов, генерации переходных тайлов, исправления "неправильных" тайлов и т.д. Подробно расписывать эти методы смысла нет, ибо механизм их действия понятен из простого их описания, а описания же для них наличествуют выше в данном тексте, в списках методов классов.