Перейти к содержанию

Странное поведение координат


Рекомендуемые сообщения

В общем, уже давно меня мучает один вопрос. Чтобы его описать приведу скрипт:

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. И еще хотелось бы узнать чему равен один попугай (в которых измеряется перемещения) в эквиваленте координат редактора. Значения явно не равны, можете проверить.

Ссылка на комментарий
Поделиться на другие сайты

Это скрипт на лифт. Повести на любой активатор и посмотрите действие. Со временем вы заметите (подергая активатор раз 10), что активатор улетит далеко от начальной позиции, несмотря на то, что ему задано ч0ткое количество перемещений (в моем случае 234).
Хм. То есть у тебя задан цикл в 234 шага, так? И каждый шаг цикла активатор поднимается\опускается на сто едениц?

Быть может, дело как-то связанно со фреймами - ведь скрипт прогоняется один раз за фрейм, то есть в идеале активатор должен передвинуться за 234 фрейма. Но это в идеале, а на практике чорт знает, как, например, перепады ФПС могут на это повлиять...

Попробуй интереса ради реализовать не циклом, а, скажем, проверкой на соответствие координатам. Или циклом типа While.

Ссылка на комментарий
Поделиться на другие сайты

Хм. То есть у тебя задан цикл в 234 шага, так? И каждый шаг цикла активатор поднимается\опускается на сто едениц?

Быть может, дело как-то связанно со фреймами - ведь скрипт прогоняется один раз за фрейм, то есть в идеале активатор должен передвинуться за 234 фрейма. Но это в идеале, а на практике чорт знает, как, например, перепады ФПС могут на это повлиять...

Дык в том то и фишка, что перемещение реализованно именно за 234 фрейма. Перемещения никак не привязаны к времени.

 

Попробуй интереса ради реализовать не циклом, а, скажем, проверкой на соответствие координатам.
С этим тоже билебирда получается, потому-что как я уже сказал, к примеру, если у предмета координата Z = 0 то SetPos Z 100 и Move Z 100 будут иметь совершенно разный эффект.

 

Или циклом типа While.
А цикл исполняется за один фрейм. Т.е лифт мнгновенно уедет в верхнюю позицию. Изменено пользователем NmLs
Ссылка на комментарий
Поделиться на другие сайты

Дык в том то и фишка, что перемещение реализованно именно за 234 фрейма. Перемещения никак не привязаны к времени.
Ко времени не привязаны, а ко фреймам - привязаны.

 

С этим тоже билебирда получается, потому-что как я уже сказал, к примеру, если у предмета координата Z = 0 то SetPos Z 100 и Move Z 100 будут иметь совершенно разный эффект.
Гм, а GetPos что, тоже отрубится, хех?

 

А цикл исполняется за один фрейм. Т.е лифт мнгновенно уедет в верхнюю позицию.
Ага. Но так можно проверить, будет ли он смещаться, или нет.

Если нет - значит, цикл виноват, хех.

Ссылка на комментарий
Поделиться на другие сайты

Ко времени не привязаны, а ко фреймам - привязаны.
Дык ты посмотри еще раз скрипт, хех. Дается 234 фрейма. В каждом фрейме делается одно перемещение.

 

Гм, а GetPos что, тоже отрубится, хех?
Оно иногда тупо проскакивает чекпоинты, хех.

 

Ага. Но так можно проверить, будет ли он смещаться, или нет.

Если нет - значит, цикл виноват, хех.

Проверил - все равно смещается.
Ссылка на комментарий
Поделиться на другие сайты

Дык ты посмотри еще раз скрипт, хех. Дается 234 фрейма. В каждом фрейме делается одно перемещение.
Дак это вижу я. А ты уверен, что он правильно эти перемещения отсчитывает, хех?

 

Проверил - все равно смещается.
Хм, занятно.

Интересно тогда, как он обновляет координаты объекта?..

Ссылка на комментарий
Поделиться на другие сайты

А ты уверен, что он правильно эти перемещения отсчитывает, хех?
По-идее все правильно, с логикой-то. Т.е если счетчик с мессаджбоксом подставить, он будет ровно отсчитывать.

 

Алсо сейчас прочитал в мсфд:

Двигает объект вдоль выбранной оси (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

 

 

Т.е чтоб он двигал его ровно секунду. А вот хрен там - все равно смещается, хоть и не так сильно.

Ссылка на комментарий
Поделиться на другие сайты

Вообще, если кому-то интересно решение, то такое можно сделать через 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 тоже можно, но тогда не будет фиксированных начальных позиций, что не эстетично.

Суть темы-то не в том, чтобы найти решение, а в том, чтобы понять почему происходят смещения.

Пардон за мультипост.

Изменено пользователем NmLs
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...