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

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

Введение

Первое что встает на пути новичков, судя по вопросам на форумах, это типы. Итак, для начала, что же это такое? Представьте себе базу данных, где каждая запись представляет собой несколько полей (имя, фамилия итд). Создать шаблон записи можно так:

Type TestType

 Field name$
 Field age

End Type

Что бы создать запись и присвоить переменной адрес этой записи, делаем так:

Test.TestType=New TestType

Запись помещается в конец связанного списка. Для каждого типа создается свой список. Теперь мы можем заполнять поля записи

Test\name$="Артур"
Test\Age=20

Итд. Для чего мы можем использовать типы? Представьте, что вы делаете систему частиц. Для каждой частицы необходимо указать скорость движения, координаты, текстуру итд. Ну, тут без типов не обойтись.

Массивы в типах

Для того чтоб хранить векторы в типе удобно использовать специальный массив. Он не динамический и одномерный. От обычного массива отличается квадратными скобками. Например - Vector[3]. Пример использования:

Type Player

 Field X%[10],Y%[10]
 Field Bullet%[5]
End Type

p.Player=New Player
p\x[1]=320
p\y[1]=240

p\bullet[4]=32

Массив типов создается точно так же как и обычный, естественно он также является частью связанного списка. Пример:

Type Player

 Field Number%
End Type

Dim GoodPlayer.Player(50)
Dim BadPlayer.Player(100)

For i=0 To 50
 GoodPlayer(i)=New Player
 GoodPlayer(i)\number=i
Next

For i=0 To 100
 BadPlayer(i)=New Player
 BadPlayer(i)\number=i

Next

Типы внутри типов

Зачастую вам нужно будет создавать поля в новом типе какого-нибудь другого типа. Вот небольшой пример для иллюстрации:

Type Parent 

 Field Name$ 
 Field kid.child 
 Field spouse.parent 
End Type 
 
Type Child 
 Field Name$ 
 Field mom.parent,dad.parent 
End Type 
 
papa.parent=New parent 
mama.parent=New parent 
lamer.child=New child 
 
papa\name="papa" 
papa\spouse.parent=mama.parent 
papa\kid.child=lamer.child 
 
mama\name="mama" 
mama\spouse.parent=papa.parent 
mama\kid.child=lamer.child 
 
lamer\name="lamer" 
lamer\mom.parent=mama.parent 
lamer\dad.parent=papa.parent 
 
For c.child=Each child 
 DebugLog c\name+"'s dad is "+c\dad\name 
 DebugLog c\name+"'s mom is "+c\mom\name 
Next 
For p.parent=Each parent 
 DebugLog p\name+" is married to "+p\spouse\name+" ("+p\kid\name+" is there child)" 

Next

Теперь смотрите в дебуге: Все должно быть предельно понятно за исключением слова 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%
End Type
p1.player=New player
 p1\x=128
 p1\y=64
p2.player=New player
 p1\x=256
 p1\y=128

address1%=Handle(p1.player)
address2%=Handle(p2.player)
copy1.player=Object.Player(address1)
copy2.player=Object.Player(address2)

Delete copy1; удаляется оригинал, так как это просто указатель

Что первое приходит в голову при виде этих команд? Конечно же быстрый доступ к отдельным записям, читайте игровым объектам.

Graphics3D 640,480,0,2

Type info
 Field name$,a,b,c,stuff,mass#,physics,etc
End Type
;Создаем шарик 
a.info=New info
a\name$="bowling ball"
a\mass#=0.9
ball=CreateSphere()
NameEntity ball,Handle(a) ; Записываем адрес в имя объекта 
;Теперь, когда вы к примеру получили объект используя  LinePicks, коллизии итд 
ent = EntityCollided(bat,collisiontype_ball)
If ent
 a.info = Object.info(EntityName(ent)) ; получаем нужный нам тип 
 Print a\name$ ; и читаем все параметры J 
 Print a\mass#

End If

Таким образом, мы избавляемся от перебора всех записей в поисках нужной через Each.

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