синхронизация чилдов
| |
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, твой код вылетает вместе с дебагером
|
|
| |
|