Главная » Статьи » Играем Blitz » Blitz3D

Связанные списки в Blitz3D. Часть 2

Создание своих собственных связанных списков

Итак мы наконец подошли к связанным спискам! При создании записей они, как я уже упоминал, помещаются в список. А что если нам нужно несколько списков? Скажем у нас есть куча юнитов. Некоторые из них активны, некоторые нет: Можно задать поле 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

Ну вот и все. Удачи!

Категория: Blitz3D | Добавил: AD77Root (31 Июля 2015)
Просмотров: 78 | Рейтинг: 0.0/0
Всего комментариев: 0
class="uForm uComForm">
avatar