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

Работа со списками

Поводом написания этой статьи было мое личное заблуждение по использованию типов в Blitz-е. Возьмем простой пример - нужен список юнитов игрока. Что обычно делается (ну или я делал) - делаю такой простой код:

 

Type TUnit

Field x,y,id
End Type

Global Units.TUnit  ; создаем переменную юнитов
for i=1 to 10
Units.TUnit = New TUnit
Units\x=i:Units\x=i:Units\id=i
next
; теперь переберем все юниты
for Unit.TUnit=Each TUnit
Print Unit\id

Next

В данном случае все нормально - но если мы захотим списки для каждого игрока, то такой способ не подойдет, т.к. при переборе Each Unit - будут выдаваться все юниты этого типа. Можно конечно ставить всякие условия, но есть способ гораздо лучший. Делаем связанный список используя типы Блица и проблема решается. Вникать в подробности создания списка я не буду (это можно понять самому, т.к. код небольшой), а дам пример использования.

; Переменная списка - может быть сколько угодно разных

Global MyList.TList = New TList
Global MyList2.TList = New TList

For i=1 To 10
Add(MyList,i) ; Добавляет i в список List
Next

For i=1 To 10
Add(MyList2,i+15) ; Добавляет i в список List
Next

Start(MyList) ; Устанавливает список на начало
While Not EofList(MyList) ; Пока список не закончился
NextItem(MyList) ; Следующий элемент
Print Item(MyList)

Wend

Это был код который нужно написать пользователю для использованию списков с предлагаемыми мною функциями. Как видите здесь все просто. И все списки отделены друг от друга! Так же можно создать массив списков. Полный код включаю мои функции:

Type TList

Field Start.TItem,Item.TItem
End Type
Type TItem
Field c% 
Field N.TItem
End Type 

; Переменная списка - может быть сколько угодно разных
Global MyList.TList = New TList
Global MyList2.TList = New TList

For i=1 To 10
Add(MyList,i) ; Добавляет i в список List
Next

For i=1 To 10
Add(MyList2,i+15) ; Добавляет i в список List
Next

Start(MyList) ; Устанавливает список на начало
While Not EofList(MyList) ; Пока список не закончился
NextItem(MyList) ; Следующий элемент
Print Item(MyList)
Wend 

Function Add(List.TList,i)
Local a.TItem
a.TItem = New TItem
a\c=i
If List\Item=Null Then List\Item=New TItem:List\Start=List\Item
List\Item\n=a
List\Item=a
End Function

Function Start(List.TList)
List\Item=List\Start
End Function

Function NextItem(List.TList)
List\Item=List\Item\n
End Function

Function EofList(List.TList)
If List\Item\n=Null Then Return True Else Return False
End Function

Function Item(List.TList)
Return List\Item\c

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