[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]


  • Страница 1 из 1
  • 1
Модератор форума: Spidy, turBO, blitz3d  
Форум мира Blitz3D » Язык Blitz3D » 3D программирование » синхронизация чилдов
синхронизация чилдов
deejexДата: Понедельник, 12.07.2010, 11:11 | Сообщение # 1
заядлый прогер
Группа: Пользователи
Сообщений: 522
Награды: 2
Репутация: 14
Статус: Offline
мне нужна функция синхронизации позиции и ориентации чилдов и чилдов чилдов source entity и dest по именам.
т.е. SyncChilds(source_entity,dest_entity)
естественно, нужно юзать рекурсию, но т.к. проверяются чилды не одной, а двух интити, значит нужно юзать двойную рекурсию, я не совсем понимаю как это реализовать,
кто может, пожалуйста, напишите такую функцию

Добавлено (12.07.2010, 11:11)
---------------------------------------------
вот моя неудачная попытка

Code
Function ChildSyncer(source,dest)
For tmp_i1 = 1 To CountChildren(source)  
For tmp_i2 = 1 To CountChildren(source)
  tmp_c1 = GetChild(source,tmp_i1)
  tmp_c2 = GetChild(dest,tmp_i2)
   If EntityName(tmp_c1)=EntityName(tmp_c2) Then
    PositionEntity tmp_c1,EntityX(tmp_c2),EntityY(tmp_c2),EntityZ(tmp_c2)
    RotateEntity tmp_c1,EntityPitch(tmp_c2),EntityYaw(tmp_c2),EntityRoll(tmp_c2)
   End If
   If CountChildren(tmp_c1) Then ChildSyncer(tmp_c1,dest)
   If CountChildren(tmp_c2) Then ChildSyncer(source,tmp_c2)
Next
Next
End Function




 
ParisHiltonДата: Понедельник, 12.07.2010, 12:20 | Сообщение # 2
прогер
Группа: Пользователи
Сообщений: 197
Награды: 2
Репутация: 5
Статус: Offline
Поясни что у тебя тут происходит
Code
   If CountChildren(tmp_c1) Then ChildSyncer(tmp_c1,dest)
    If CountChildren(tmp_c2) Then ChildSyncer(source,tmp_c2)

когда эти строки должны срабатывать и почему передаются именно такие параметры

А может так:

Code
...
For tmp_i1 = 1 To CountChildren(source)   
For tmp_i2 = 1 To CountChildren( DEST )  
...
    If CountChildren(tmp_c1) Then ChildSyncer(DEST,tmp_c1)
    If CountChildren(tmp_c2) Then ChildSyncer(source,tmp_c2) ...


Мы ищем предмет цели для того чтобы найти результаты его следствия
 
deejexДата: Понедельник, 12.07.2010, 12:43 | Сообщение # 3
заядлый прогер
Группа: Пользователи
Сообщений: 522
Награды: 2
Репутация: 14
Статус: Offline
Quote (ParisHilton)
когда эти строки должны срабатывать и почему передаются именно такие параметры

нужно перебрать всех чилдов у чилдов
если у интити есть чилды, то идет рекурсия уже с этим интити
Quote (ParisHilton)
    If CountChildren(tmp_c1) Then ChildSyncer(DEST,tmp_c1)
    If CountChildren(tmp_c2) Then ChildSyncer(source,tmp_c2)

ни в коем случае,
Source следует за Dest, а не наоборот




 
SpidyДата: Понедельник, 12.07.2010, 22:15 | Сообщение # 4
Полковник
Группа: Модераторы
Сообщений: 339
Награды: 6
Репутация: 13
Статус: Offline
По идее от двойной рекурсии можно отказаться. Должно быть что-то вида:

Code
Function ChildSyncer(source)

For i1 = 1 To CountChildren(source)   
    c1 = GetChild(source,i1)

    If EntityName(c1)=EntityName(source) Then
       PositionEntity с1,EntityX(source),EntityY(source),EntityZ(source)
       RotateEntity с1,EntityPitch(source),EntityYaw(source),EntityRoll(source)
    End If

    If CountChildren(c1) Then ChildSyncer(c1)

Next

End Function

В таком случае все дочерние ветки дерева должны пробегаться. Но не совсем понятно всегда ли у тебя все чилды основного source должны быть задействованы в цикле с рекурсией. Тут еще поломать голову надо


Компьютерная мышь ночью собирает крошки у тебя со стола и прячет их в клавиатуру, делает запасы на зиму
 
deejexДата: Понедельник, 12.07.2010, 22:40 | Сообщение # 5
заядлый прогер
Группа: Пользователи
Сообщений: 522
Награды: 2
Репутация: 14
Статус: Offline
Quote (Spidy)
Function ChildSyncer(source)

For i1 = 1 To CountChildren(source)   
    c1 = GetChild(source,i1)

    If EntityName(c1)=EntityName(source) Then
       PositionEntity с1,EntityX(source),EntityY(source),EntityZ(source)
       RotateEntity с1,EntityPitch(source),EntityYaw(source),EntityRoll(source)
    End If

    If CountChildren(c1) Then ChildSyncer(c1)

Next

End Function


ты кажется не понял смысл - есть два интити, у них равное кол-во чилдов и их чилды так же называются и надо синхронизировать чилды одного интити по чилдам другого интити

p.s.: а слово "интити" вообще какого рода?




 
blitz3dДата: Вторник, 13.07.2010, 09:30 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 203
Награды: 3
Репутация: 7
Статус: Offline
Попробуй с массивами

Code
Function ChildSyncer(source,source2)

For i1 = 1 To CountChildren(source)
     c1(i1) = GetChild(source,i1)
     next

For j1 = 1 To CountChildren(source2)
     c2(j1) = GetChild(source2,j1)
     next

     for i2 = 1 to i1
       for j2 = 1 to j1

         If EntityName(c1(i2))=EntityName(c2(j2)) Then
            PositionEntity с1(i2),EntityX(c2(j2)),EntityY(c2(j2)),EntityZ(c2(j2))
            RotateEntity с1(i2),EntityPitch(c2(j2)),EntityYaw(c2(j2)),EntityRoll(c2(j2))
         End If

     If CountChildren(c2(j2)) Then ChildSyncer(c1(i2),c2(j2))

     Next
     Next

End Function


перед тобой две таблетки - красная и синяя - какую ты выберешь?
 
deejexДата: Четверг, 15.07.2010, 22:10 | Сообщение # 7
заядлый прогер
Группа: Пользователи
Сообщений: 522
Награды: 2
Репутация: 14
Статус: Offline
blitz3d, твой код вылетает вместе с дебагером



 
Форум мира Blitz3D » Язык Blitz3D » 3D программирование » синхронизация чилдов
  • Страница 1 из 1
  • 1
Поиск: