Ответ: Искуственный интеллект
Цитата:
Сообщение от burovalex
(Сообщение 251162)
Чет я не понял, с трудом разобрался, так что получается.
Если в типе добавить еще один тип - то у них всё равно связи не будет?? 0_о
Получается в любом случае придётся проходить по всему списку и делать выборку?
|
Может ты все-таки в справку заглянешь? В блиц-бейсике для структурных типов Type создается один глобальный список, поэтому обьявляя там поле с таким типом, ты будешь иметь лишь указатель (ссылка) на экземпляр, а все создаваемые оператором New экземпляры будут автоматически помещаться в этот глобальный список. Поэтому надо делать свой список, т.е. в твоем случае тип Waypoints должен иметь ссылку на следующий в списке, а тип npc иметь ссылку на начало списка. Гугли односвязный и\или двусвязный список чтобы понять как его строить. По сути список - та же очередь в действительности, где каждый элемент помнит того кто впереди него ( за кем занял ), и того кто позади ( кто за ним занял ). К слову в BlitzMax, который уже ближе к "взрослым" ЯП, есть такой механизм. По-моему тебе стоит бросить блиц-бейсик и юзать блиц-макс, к тому-же, раз ты юзаешь Xors3D, юзать его из BlitzMax будет правильно, все-таки блиц-бейсик намертво связан с блиц3д, и юзать один движок из другого - извращение, имхо.
ЗЫ
вот примерно как можно очередь сделать
Код:
; элемент очереди
Type Element
; сзади по очереди
Field BackElement.Element
; впереди по очереди
Field FrontElement.Element
End Type
; очередь
Type Queue
; первый в очереди
Field FirstElement.Element
; последний в очереди
Field LastElement.Element
End Type
;
; функция входа в очередь
;
Function EnterQueue ( Queue.Queue, Element.Element )
;
; спрашиваешь кто последний
;
If Queue\LastElement <> Null Then
;
; последний запоминает что ты за ним занял
;
Queue\LastElement\BackElement = Element
;
; раз ты последний, за тобой никого нет
;
Element\BackElement = Null
;
; запоминаешь того, кто перед тобой
;
Element\FrontElement = Queue\LastElement
;
; последнего нет - нет и очереди
;
Else
;
; раз очереди нет, ты первый в очереди
;
Queue\FirstElement = Element
End If
;
; занял очередь, теперь ты последний в очереди
;
Queue\LastElement = Element
End Function
;
; функция выхода из очереди
;
Function LeaveQueue ( Queue.Queue, Element.Element )
;
; сзади тебя кто-то есть, ты не последний в очереди
;
If Element\BackElement <> Null Then
;
; сообщаешь тому, кто занимал за тобой, что он теперь стоит
; за тем, кто впереди нас
;
Element\BackElement\FrontElement = Element\FrontElement
;
; сзади тебя никого нет, ты последний в очереди
;
Else
;
; сообщаешь тому, кто впереди нас, что он становится последним
; в очереди
;
Queue\LastElement = Element\FrontElement
End If
;
; впереди тебя кто-то есть, ты не первый в очереди
;
If Element\FrontElement <> Null Then
;
; сообщаешь тому, за кем ты занимал,
; что за ним теперь не ты, а тот, кто занимал за тобой
;
Element\FrontElement\BackElement = Element\BackElement
;
; впереди тебя никого нет, ты первый в очереди
;
Else
;
; сообщаешь тому, кто сзади тебя, что он теперь первый в очереди
;
Queue\FirstElement = Element\BackElement
End If
End Function
|