Тема: Исходница
Показать сообщение отдельно
Старый 29.06.2010, 18:37   #6
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,370
Написано 2,477 полезных сообщений
(для 6,865 пользователей)
Ответ: Исходница

Рекурсивный пробег по чилдам:
Function SeekChilds(ent
    
Local ichild
    
    
For i=1 To CountChildren(ent
        
child=GetChild(ent,i
        If 
child<>
            
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 ichild
    
    
For i=1 To CountChildren(ent
        
child=GetChild(ent,i
        If 
child<>
            
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 моделирования как игровой редактор карт.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (11.10.2011)