Changes between Version 1 and Version 2 of WorkingWithTilesets_v1
- Timestamp:
- Oct 6, 2008 1:41:08 AM (16 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
WorkingWithTilesets_v1
v1 v2 26 26 == Принцип реализации == 27 27 28 Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является TTileSet, который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - TTileSetsCollection - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. '''TTileSetsCollection содержит''':28 Работа с тайлами реализуется несколькими взаимозависимыми классами, связанными через их элементы-ссылки. Основным классом, связывающим все остальные является TTileSet, который реализует работу с содержимым одного набора тайлов. Есть более высокий уровень - TTileSetsCollection - фактически контейнер, содержащий ссылки на объекты типа TTileSet для всех доступных программе тайлсетов. TTileSetsCollection содержит: 29 29 * Массив ссылок на все объекты тайлсетов. 30 30 * Путь по которому располагаются тайлсеты. … … 36 36 * Метод, возвращающий true если в каком-либо из тайлсетов есть "неправильные" (с нестандартной структурой) тайлы и false если таких нет. 37 37 38 '''TTileSet содержит''':38 TTileSet содержит: 39 39 * Обратную ссылку на объект TTileSetsCollection. 40 40 * Ссылку на объект, реализующий работу с файлом !TileSet.ini для этого тайлсета (TTileSetIni). … … 69 69 Кроме этого - следует организовать выделение и освобождение памяти так, чтобы памятью всех слоев, террейнов и тайлов заведовал именно класс TTileSet. Другие классы также могут иметь подобные ссылки, и даже выделять память под новые объекты - но в любом случае такой объект должен попасть в массив объекта TTileSet и в дальнейшем уничтожаться должен под управлением именно TTileSet, если же вложенные в него объекты сами новых объектов не создают, то использоваться может только копирование ссылки на уже созданный объект. Таким образом, в других классах может использоваться new, но delete всегда выполняется только классом TTileSet, причем гарантированно для всего, что могло быть создано по любому такому new. 70 70 71 '''Класс TLayer'''весьма прост и содержит только номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой.71 Класс TLayer весьма прост и содержит только номер слоя (в виде числового значения), массив ссылок на террейны и обратную ссылку на тайлсет, которому принадлежит слой. 72 72 73 '''Класс TTileSetIni'''по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, содержит в себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать.73 Класс TTileSetIni по сути также более чем прост, типичен для любого класса, работающего с конфигами в ini, содержит в себе структуры и переменные с данными секций !TileSet.ini, а также методы Load, Save, Clean для загрузки, чтения информации в\из файла и очистки (простановке значений по умолчанию) соответственно. Метод Load должен проверять соответствие номера версии формата в файле текущей реализации - если в файле версия новее - давать ошибку, если старее - конвертировать файл в новую версию (без записи на диск), если тот же - просто читать. 74 74 75 На уровне террейна работа обеспечивается объектами '''класса TTerrain, который содержит''':75 На уровне террейна работа обеспечивается объектами класса TTerrain, который содержит: 76 76 * Имя террейна. 77 77 * Число - приоритет террейна. Если приоритет неизвестен то значение = 0. … … 87 87 * Смена слоя. Работает независимо от того, есть ли проблемы со слоями, меняет слой, переименовывает файлы тех тайлов, от которых есть какой-то смысл, остальные тайлы (т.е. те переходы, которые больше не нужны) либо удаляются, либо переименовываются как будто бы в них был смысл (в зависимости от аргументов метода) - второй вариант может использоваться при смене слоя сразу для нескольких террейнов без потери перехода между ними. При наличии проблемы со слоями, даже если работает с удалением 88 88 89 На уровне тайла вся работа обеспечивается классом '''TTile, который содержит''':89 На уровне тайла вся работа обеспечивается классом TTile, который содержит: 90 90 * Ссылку на свой тайлсет. 91 91 * Ссылку на свой слой. … … 102 102 * Метод, возвращающий bmp-ху тайла без поворотов (вызывает предыдущий метод с нулевым поворотом). 103 103 104 '''Класс TTileTerrs''' был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. '''Содержит''':104 Класс TTileTerrs был бы простой структурой если бы не имел методы сравнения двух объектов этого типа, поэтому он класс. Собержит: 105 105 * Строки A,B,C,D с именами террейнов в соотв. углах (справа налево, по строкам сверху вниз, A соответствует {Terr1} а D соответствует {Terr4} в имени тайла). Вот табличка расположения углов: 106 106 ||A||B|| … … 122 122 ||2||2|| 123 123 ||1||2|| 124 * Из двух террейнов-2: 124 * Из двух террейнов-2 125 ||1||1|| 126 ||2||1|| 127 * Из двух террейнов-3: 125 128 ||1||1|| 126 129 ||2||2|| … … 134 137 ||1||2|| 135 138 ||3||1|| 139 * Из трех террейнов-4: 140 ||2||2|| 141 ||1||3|| 142 * Из трех террейнов-5: 143 ||2||2|| 144 ||3||1|| 145 * Из трех террейнов-6: 146 ||3||3|| 147 ||1||2|| 148 * Из трех террейнов-7: 149 ||3||3|| 150 ||2||1|| 136 151 * Из четырех террейнов-1: 137 152 ||1||2|| … … 157 172 == Как это все по идее должно работать == 158 173 159 В начале программа создает верхний уровень - объект класса '''TTileSetsCollection'''. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта '''TTileSetsCollection'''когда он станет не нужен.174 В начале программа создает верхний уровень - объект класса TTileSetsCollection. Все остальные уровни создаются конструкторами и прочими методами этого объекта и его вложенными объектами. Освобождение памяти во избежание утечек - там же, деструкторами классов и их методами. Программа должна позаботиться только о правильном удалении объекта TTileSetsCollection когда он станет не нужен. 160 175 161 После создания объекта класса '''TTileSetsCollection'''- программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов.176 После создания объекта класса TTileSetsCollection - программа пробивает в его опции все необходимые пути, если нужно - !CallBack-метод, а затем вызывает нужный метод чтения информации тайлсетов. 162 177 163 Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса '''TTileSet'''. Обращаю внимание, что все вложенные в '''TTileSetsCollection'''объекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов.178 Данный метод - читает имена тайлсетов, их количество - и создает нужное количество подобъектов класса TTileSet. Обращаю внимание, что все вложенные в TTileSetsCollection объекты имеют обратные ссылки на "родительский" объект, т.е. тот объект в который они вложены - что позволяет этим объектам использовать информацию своего владельца и даже своих соседей и вложенных в соседей объектов. 164 179 165 Для каждого объекта '''TTileSet'''вызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром.180 Для каждого объекта TTileSet вызывается метод чтения информации тайлсета. Причем перед запуском чтения тайлсета при необходимости вызывается !CallBack что позволяет индицировать процесс загрузки, например, в окошко с прогрессбаром. 166 181 167 182 Метод чтения информации тайлсетов - для начала читает свой конфиг, если используется svn - читает информацию о ревизии. Если тайлсет сжат - первым делом выполняет синхронизацию с временной, несжатой версией тайлсета. Затем - производит поиск всех файлов с тайлами, подсчитывает их количество, после чего (либо одновременно - смотря как будет реализовано и как оптимальнее работает) выделяет нужное количество объектов в массив с тайлами и загружает в эти объекты информацию по всем найденным тайлам. Обновременно со вбивкой информации в основной массив - создаются объекты террейнов, слоев, в них вбивается соответствующая информация, в т.ч. присваиваются ссылки на объекты тайлов. По завершению всего этого процесса - все объекты террейнов и слоев уже созданы, в них есть массивы со ссылками на тайлы. После этого становится возможным составление списка террейнов по алфавиту и установка приоритета для них. … … 171 186 Затем осуществляется генерация всех возможных тайлов-переходов - если такой переходный тайл уже наличествует, хотя-бы в количестве 1 (адЫн) штука - ничего не происходит, если же ни одного такого тайла найдено не было - создается объект тайла, с пометкой что файла картинки у него нет, ссылка на него добавляется во все соответствующие массивы соответствующих объектов. 172 187 173 Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса '''TTileSetsCollection'''содержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов.188 Собсно это все что касается механизма чтения информации о тайлсете. После его завершения - в объекте класса TTileSetsCollection содержится вся необходимая информация о всех имеющихся тайлсетов, более чем достаточная для вывода любой информации в интерфейс программы, в т.ч. дерева террейнов и тайлов. 174 189 175 190 Кроме этого у всех объектов системы имеются дополнительные методы, которые не вызываются при чтении тайлсетов, и предназначены для непосредственного их вызова программой - например методы удаления\добавления тайлов, генерации переходных тайлов, исправления "неправильных" тайлов и т.д. Подробно расписывать эти методы смысле нет, ибо механизм их действия понятен их простого их описания, а описания же для них наличествуют выше в данном тексте, в списках методов классов.