Связанные списки в Blitz3DМатериал из Blitz Et Cetera
ВведениеПервое что встает на пути новичков, судя по вопросам на форумах, это типы. Итак, для начала, что же это такое? Представьте себе базу данных, где каждая запись представляет собой несколько полей (имя, фамилия итд). Создать шаблон записи можно так: Type TestType
Field name$ Что бы создать запись и присвоить переменной адрес этой записи, делаем так: Test.TestType=New TestType
Запись помещается в конец связанного списка. Для каждого типа создается свой список. Теперь мы можем заполнять поля записи Test\name$="Артур"
Test\Age=20 Итд. Для чего мы можем использовать типы? Представьте, что вы делаете систему частиц. Для каждой частицы необходимо указать скорость движения, координаты, текстуру итд. Ну, тут без типов не обойтись. Массивы в типахДля того чтоб хранить векторы в типе удобно использовать специальный массив. Он не динамический и одномерный. От обычного массива отличается квадратными скобками. Например - Vector[3]. Пример использования: Type Player
Field X%[10],Y%[10] Массив типов создается точно так же как и обычный, естественно он также является частью связанного списка. Пример: Type Player
Field Number% Типы внутри типовЗачастую вам нужно будет создавать поля в новом типе какого-нибудь другого типа. Вот небольшой пример для иллюстрации: Type Parent
Field Name$ Теперь смотрите в дебуге: Все должно быть предельно понятно за исключением слова Each. С его помощью мы пробегаем по всему связанному списку записей одного типа. Так же существуют команды Last, First, After и Before. Т.е. если вы хотите получить первую запись из списка вам необходимо сделать так: FirstParentRecord.parent = First parent
Следующую запись: SecondParentRecord=After(FirstParentRecord)
Итд, думаю с этим все понятно... Ах да, чуть не забыл про команду Insert: Insert SecondParentRecord Before First parent
Перемещает нашу вторую запись в начало списка. Все просто. Для удаления записи используйте Delete SecondParentRecord, а для очистки всего списка Delete Each parent. Команды Object() и Handle()Команды эти не документированы, но всем давно известны, и широко используются. Handle(Type.something)
Возвращает адрес в памяти указанного типа Object.Something(Handle%)
Возвращает тип по указанному адресу в памяти. Если тип не существует, то вы получите ошибку при попытке обратиться к нему. Пример: Type Player
Field X%,Y% Что первое приходит в голову при виде этих команд? Конечно же быстрый доступ к отдельным записям, читайте игровым объектам. Graphics3D 640,480,0,2
Type info Таким образом, мы избавляемся от перебора всех записей в поисках нужной через Each. Создание своих собственных связанных списковИтак мы наконец подошли к связанным спискам! При создании записей они, как я уже упоминал, помещаются в список. А что если нам нужно несколько списков? Скажем у нас есть куча юнитов. Некоторые из них активны, некоторые нет: Можно задать поле Active и смотреть активный обьект или нет, если активный то обновлять, но в таком случае нам придется перебирать все время всех юнитов. А можно создать отдельный список и помещать туда только тех юнитов которые в данный момент активны и работать уже с этим списком. Для этого создайте файл BList.bb. Заинклудим его в проект и можем использовать списки: Type Ball
Field id Чуть короче: Type Ball
Field id Полный список команд для работы со списком: userTypePtr% = AddFront%( list.Blist, userTypePtr% )
userTypePtr% = AddBack%( list.Blist, userTypePtr% ) Небольшой пример: Include "BList.bb"
Type Ball Ну вот и все. Удачи! Автор: Остапенко "@rtur" Артур (e-mail: vd_arthur |

