Создание своих собственных связанных списков
Итак мы наконец подошли к связанным спискам! При создании записей они, как я уже упоминал, помещаются в список. А что если нам нужно несколько списков? Скажем у нас есть куча юнитов. Некоторые из них активны, некоторые нет: Можно задать поле Active и смотреть активный обьект или нет, если активный то обновлять, но в таком случае нам придется перебирать все время всех юнитов. А можно создать отдельный список и помещать туда только тех юнитов которые в данный момент активны и работать уже с этим списком. Для этого создайте файл BList.bb. Заинклудим его в проект и можем использовать списки:
Type Ball
Field id
End Type
list.BList = New BList
b.Ball = New Ball
AddFront(list,Handle(b))
ptr% = FirstItem(list)
b = Object.Ball (ptr )
Чуть короче:
Type Ball
Field id
End Type
list.BList = New BList
AddFront(list,Handle(New Ball))
b.Ball = Object.Ball (FirstItem (list ))
Полный список команд для работы со списком:
userTypePtr% = AddFront% ( list.Blist, userTypePtr% )
userTypePtr% = AddBack%( list.Blist, userTypePtr% )
trueFalse% = ResetList%( list.BList )
userTypePtr% = NextItem%( list.BList )
userTypePtr% = FirstItem%( list.BList )
userTypePtr% = LastItem%( list.BList )
userTypePtr% = CurrentItem%( list.BList )
userTypePtr% = MoveItem%( fromList.BList, toList.BList )
userTypePtr% = KillItem%( list.BList, node.BNode )
node.BNode = CurrentNode.BNode( list.Blist )
totalItems% = TotalItems% ( list.BList )
Небольшой пример:
Include "BList.bb"
Type Ball
Field id
Field x#
Field y#
End Type
; создаем 2 списка
list1.BList = New BList
list2.BList = New BList
;Создаем 6 объектов в первом списке
For i = 0 To 5
b.Ball = Object.Ball(AddFront(list1,Handle(New Ball)))
b\id = i
Next
Print "Список 1:" : printlist(list1)
;Обрабатываем первый список
ResetList(list1)
While NextItem(list1)
b.Ball = Object.Ball(CurrentItem(list1))
;Перемещаем четвертую запись во второй список
If b\id = 4 Then MoveItem(list1,list2)
; удаляем 3-ю запись, только позже, после обработки списка
If b\id = 3 Then tmp.BNode = CurrentNode(list1)
; удаляем вторую запись
If b\id = 2 Then Delete Object.Ball(KillItem(list1,Null))
Wend
Delete Object.Ball(KillItem(list1,tmp))
Print "Список 1: (удалены - 2,3, перемещена- 4)" : printlist(list1)
Print "Список 2:" : printlist(list2)
;очищаем весь первый список
While FirstItem(list1)
Delete Object.Ball(KillItem(list1,Null))
Wend
Print "Список 1:" : printlist(list1)
WaitKey
Function printlist(list.BList)
ResetList(list)
While NextItem(list)
b.Ball = Object.Ball(CurrentItem(list))
Print b\id
Wend
End Function
Ну вот и все. Удачи!
|