Показать сообщение отдельно
Старый 30.01.2013, 12:07   #34
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Искуственный интеллект

Сообщение от burovalex Посмотреть сообщение
Чет я не понял, с трудом разобрался, так что получается.
Если в типе добавить еще один тип - то у них всё равно связи не будет?? 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
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (30.01.2013)