NmLs Опубликовано 7 июля, 2010 Жалоба Поделиться Опубликовано 7 июля, 2010 В общем, уже давно меня мучает один вопрос. Чтобы его описать приведу скрипт: Begin _nmls_elevatorscript short state short moves short direct if ( MenuMode == 1 ) Return endif if ( OnActivate == 1 ) if ( state == 0 ) set state to 1 set moves to 0 set direct to 0 elseif ( state == 2 ) set state to 1 set moves to 0 set direct to 1 endif endif if ( state == 1 ) if ( moves < 234 ) if ( direct == 0 ) Move Z 100 else Move Z -100 endif disable enable set moves to moves + 1 else if ( direct == 0 ) set state to 2 else set state to 0 endif endif endif End Это скрипт на лифт. Повести на любой активатор и посмотрите действие. Со временем вы заметите (подергая активатор раз 10), что активатор улетит далеко от начальной позиции, несмотря на то, что ему задано ч0ткое количество перемещений (в моем случае 234). Вот тут-то и вопрос: чозанах?Проверял как на Move так и на MoveWorld. И еще хотелось бы узнать чему равен один попугай (в которых измеряется перемещения) в эквиваленте координат редактора. Значения явно не равны, можете проверить. Ссылка на комментарий Поделиться на другие сайты Поделиться
Boma Kuro Опубликовано 7 июля, 2010 Жалоба Поделиться Опубликовано 7 июля, 2010 Это скрипт на лифт. Повести на любой активатор и посмотрите действие. Со временем вы заметите (подергая активатор раз 10), что активатор улетит далеко от начальной позиции, несмотря на то, что ему задано ч0ткое количество перемещений (в моем случае 234).Хм. То есть у тебя задан цикл в 234 шага, так? И каждый шаг цикла активатор поднимается\опускается на сто едениц?Быть может, дело как-то связанно со фреймами - ведь скрипт прогоняется один раз за фрейм, то есть в идеале активатор должен передвинуться за 234 фрейма. Но это в идеале, а на практике чорт знает, как, например, перепады ФПС могут на это повлиять...Попробуй интереса ради реализовать не циклом, а, скажем, проверкой на соответствие координатам. Или циклом типа While. Ссылка на комментарий Поделиться на другие сайты Поделиться
NmLs Опубликовано 7 июля, 2010 Автор Жалоба Поделиться Опубликовано 7 июля, 2010 (изменено) Хм. То есть у тебя задан цикл в 234 шага, так? И каждый шаг цикла активатор поднимается\опускается на сто едениц?Быть может, дело как-то связанно со фреймами - ведь скрипт прогоняется один раз за фрейм, то есть в идеале активатор должен передвинуться за 234 фрейма. Но это в идеале, а на практике чорт знает, как, например, перепады ФПС могут на это повлиять...Дык в том то и фишка, что перемещение реализованно именно за 234 фрейма. Перемещения никак не привязаны к времени. Попробуй интереса ради реализовать не циклом, а, скажем, проверкой на соответствие координатам.С этим тоже билебирда получается, потому-что как я уже сказал, к примеру, если у предмета координата Z = 0 то SetPos Z 100 и Move Z 100 будут иметь совершенно разный эффект. Или циклом типа While. А цикл исполняется за один фрейм. Т.е лифт мнгновенно уедет в верхнюю позицию. Изменено 7 июля, 2010 пользователем NmLs Ссылка на комментарий Поделиться на другие сайты Поделиться
Boma Kuro Опубликовано 7 июля, 2010 Жалоба Поделиться Опубликовано 7 июля, 2010 Дык в том то и фишка, что перемещение реализованно именно за 234 фрейма. Перемещения никак не привязаны к времени.Ко времени не привязаны, а ко фреймам - привязаны. С этим тоже билебирда получается, потому-что как я уже сказал, к примеру, если у предмета координата Z = 0 то SetPos Z 100 и Move Z 100 будут иметь совершенно разный эффект.Гм, а GetPos что, тоже отрубится, хех? А цикл исполняется за один фрейм. Т.е лифт мнгновенно уедет в верхнюю позицию.Ага. Но так можно проверить, будет ли он смещаться, или нет.Если нет - значит, цикл виноват, хех. Ссылка на комментарий Поделиться на другие сайты Поделиться
NmLs Опубликовано 7 июля, 2010 Автор Жалоба Поделиться Опубликовано 7 июля, 2010 Ко времени не привязаны, а ко фреймам - привязаны.Дык ты посмотри еще раз скрипт, хех. Дается 234 фрейма. В каждом фрейме делается одно перемещение. Гм, а GetPos что, тоже отрубится, хех?Оно иногда тупо проскакивает чекпоинты, хех. Ага. Но так можно проверить, будет ли он смещаться, или нет.Если нет - значит, цикл виноват, хех. Проверил - все равно смещается. Ссылка на комментарий Поделиться на другие сайты Поделиться
Boma Kuro Опубликовано 7 июля, 2010 Жалоба Поделиться Опубликовано 7 июля, 2010 Дык ты посмотри еще раз скрипт, хех. Дается 234 фрейма. В каждом фрейме делается одно перемещение.Дак это вижу я. А ты уверен, что он правильно эти перемещения отсчитывает, хех? Проверил - все равно смещается.Хм, занятно.Интересно тогда, как он обновляет координаты объекта?.. Ссылка на комментарий Поделиться на другие сайты Поделиться
NmLs Опубликовано 7 июля, 2010 Автор Жалоба Поделиться Опубликовано 7 июля, 2010 А ты уверен, что он правильно эти перемещения отсчитывает, хех?По-идее все правильно, с логикой-то. Т.е если счетчик с мессаджбоксом подставить, он будет ровно отсчитывать. Алсо сейчас прочитал в мсфд:Двигает объект вдоль выбранной оси (x, y, или z) с выбранной скоростью. Скорость исчисляется в пунктах в секунду (21.3 пункта в футе). Поэтому расстояние, пройденной за фрейм будет зависеть от количества фреймов в секунду, а расстояние, пройденное за единицу времени нет. И решил поставить зависимость от времени: Begin _nmls_elevatorscript short state short direct float timer if ( MenuMode == 1 ) Return endif if ( OnActivate == 1 ) if ( state == 0 ) set state to 1 set direct to 0 set timer to 0 elseif ( state == 2 ) set state to 1 set direct to 1 set timer to 0 endif endif if ( state == 1 ) set timer to ( timer + getsecondspassed ) if ( timer < 1 ) if ( direct == 0 ) MoveWorld Z 100 else MoveWorld Z -100 endif disable enable else if ( direct == 0 ) set state to 2 else set state to 0 endif endif endif End Т.е чтоб он двигал его ровно секунду. А вот хрен там - все равно смещается, хоть и не так сильно. Ссылка на комментарий Поделиться на другие сайты Поделиться
NmLs Опубликовано 7 июля, 2010 Автор Жалоба Поделиться Опубликовано 7 июля, 2010 (изменено) Вообще, если кому-то интересно решение, то такое можно сделать через SetPos, как я и говорил: Begin _nmls_elevatorscript short state short direct short count float pozz float point if ( MenuMode == 1 ) Return endif if ( OnActivate == 1 ) if ( state == 0 ) set state to 1 set direct to 0 set count to 0 elseif ( state == 2 ) set state to 1 set direct to 1 set count to 0 endif endif if ( state == 1 ) if ( count < 234 ) set pozz to getpos z if ( direct == 0 ) set point to ( pozz + 1) SetPos Z point else set point to ( pozz - 1) SetPos Z point endif disable enable set count to count + 1 else if ( direct == 0 ) set state to 2 else set state to 0 endif endif endif End Поднимает и опускает ровно на 234 пункта. В принципе через getpos тоже можно, но тогда не будет фиксированных начальных позиций, что не эстетично.Суть темы-то не в том, чтобы найти решение, а в том, чтобы понять почему происходят смещения.Пардон за мультипост. Изменено 7 июля, 2010 пользователем NmLs Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти