Показать сообщение отдельно
Старый 27.02.2011, 18:11   #5
FireOwl
Бывалый
 
Аватар для FireOwl
 
Регистрация: 16.09.2009
Адрес: Sun system
Сообщений: 831
Написано 442 полезных сообщений
(для 1,836 пользователей)
Ответ: Как взаимодействовать с миром?

1) Почитай про типы (type) - полезная штука. Создавай двери типами, в процессе загрузки уровня, а потом проверяй на расстояние каждую.
2) Я Point'ы тыкаю, но думаю разницы нет.
Вот приблизительно так:
Type door
	Field mesh
	Field state
End Type

door=LoadAnimMesh("door.b3d")
ExtractAnimSeq( mesh,0,50 )  ; sequence 1: дверь открылась    
ExtractAnimSeq( mesh,50,100 ) ; sequence 2: дверь закрылась   (числа зависят от анимации двери)
    ; меш уровня для разбиения на child'ы нужно загружать как animmesh
levelmesh=LoadAnimMesh("level1.b3d")

c=2               ; нужно пропустить первые два child'а, это что-то служебное
While c<CountChildren(levelmesh)
	child=GetChild(levelmesh,c)
	name$=EntityName(child)
	If Left$(name$,4)="Door" Then    ; проверка имени объекта данного в максе
		d.door=new door
		d\mesh=CopyEntity door
		d\state=1                    ; дверь закрыта, ввел на всякий аварийный
	EndIf
	c=c+1
Wend

; ; ; ; ;

Function UpdateDoors(player)         ; можно и в основной цикл влепить, разницы нет
	for d.door=each door
		if EntityDistance(player,d\mesh)<100 then 
			if d\state=1
				Animate d\mesh,3,.4,1    ; открыть если игрок подошел
				d\state=2
			endif
		else 
			if d\state=2 then 
				Animate d\mesh,3,.4,2    ; закрыть если игрок отошел
				d\state=1
			endif
		EndIf
	Next
End Function
Код конечно не безгрешен и в нем наверняка куча мелких ошибок и его можно как то усовершенствовать.
__________________
N"Gasta! Kvata! Kvakis!
Ahkstas so novajxletero (oix jhemile) so Ranetauw.
(Offline)
 
Ответить с цитированием