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
Код конечно не безгрешен и в нем наверняка куча мелких ошибок и его можно как то усовершенствовать.