Рекурсивный пробег по чилдам:
Function SeekChilds(ent)
Local i, child
For i=1 To CountChildren(ent)
child=GetChild(ent,i)
If child<>0
If CountChildren(child)>0 Then SeekChilds(child)
;---> Put code here <---;
EndIf
Next
End Function
У чилдов тоже есть чилды. Данная ф-ция прбегает по всей иерархии.
Не раз писалось, но думаю пусть будет и тут тоже.
Область применения:
Например у вас вся игровая локация сделана одной сценой в формате B3d.
Вы хотите поставить точку старта в особом месте или расставить NPC прямо в 3dsmax (или другом пакете 3d моделирования)
Имя каждого чилда вполне подходит для хранения такой информации.
Для обработки каждого чилда можно завести вспомогательную ф-цию:
допустим ApplyChild(
child)
где
child - хендл чилда.
;---> Put code here <---; в ф-ции SeekChilds(ent) заменим на ApplyChild(child)
У нас получился такой код:
Local LevelMesh = LoadAnimMesh("Level.B3D") ; Загружаем уровень
SeekChilds(LevelMesh)
Function SeekChilds(ent)
Local i, child
For i=1 To CountChildren(ent)
child=GetChild(ent,i)
If child<>0
If CountChildren(child)>0 Then SeekChilds(child)
ApplyChild(child)
EndIf
Next
End Function
Function ApplyChild(child)
Local name$=Lower(EntityName(child))
If Instr(name$,"start")>0 Then
; Перемещаем игрока в точку старта
EndIf
If Instr(name$,"shield")>0 Then
; ставим броню в месте этого чилда
EndIf
If Instr(name$,"enemy")>0 Then
; ставим врага в месте этого чилда
EndIf
End Function
Позволяет секономить время и использовать пакет 3d моделирования как игровой редактор карт.