MSFD Руководство по созданию объектов для езды
(By MadMax_001)
MadMax поделился своими взглядами на тему, как создавать объекты для езды (например, лодки), особенно тем, какие встают проблемы и как их решать.
В этой главе много интересной информации, которая выходит за рамки обсуждаемой темы.
Вы можете посмотреть его скрипты в модах "Fishing Academy" и "Magic Carpet".
Выбор объектов
Можно использовать практически все объекты (статику/активаторы).
Тем не менее, выбор правильного (типа) объекта очень важен.
Позже это сделает написание скрипта гораздо более легким делом.
Итак, какие же объекты подходят? Предпочтение нужно отдать маленьким и с наименьшей высотой (тонким).
Другой немаловажный фактор — это центральная точка, которая также является точкой, где будет стоять ваш персонаж.
Это также убережет вас от сложного программирования позже.
Если центральная точка не та, которая требуется, тогда это можно исправить, импортировав объект в 3DS и передвинув координаты в ту точку, куда вы планируете поставить ваш персонаж. Здесь я не буду объяснять, как сделать это в 3DS, так как есть множество руководств, в которых уже это все описано.
Создание/Удаление объектов
Я уверен, что большинство моддеров знает, что объект можно двигать через экстерьер на определенные расстояния.
Это происходит потому что игра обновляет и обрабатывает объекты/коды на определенных расстояниях.
Когда ваш персонаж выходит за этот параметр, объект, на самом деле, замораживается или, с точки зрения игрока, объект растворяется в свежем воздухе.
Но, если вы вернетесь назад в ячейку, объект появится вновь.
Значит, чтобы перемещать объект через множество внешних ячеек, нужно создавать новые объекты.
Каждый раз, когда вы перемещаетесь в новую ячейку, функция "CellChanged" возвращает ИСТИНУ в одном кадре.
Это наилучшее время заменить существующий объект новым.
Я столкнулся на этом этапе лишь с одной БОЛЬШОЙ проблемой.
НИКОГДА не создавайте объект из скрипта на объекте. Это не сработает.
Так что вам нужно использовать глобальный скрипт, чтобы создать новый объект взамен старого.
В то же время не забудьте удалить (старый объект), или вы получите все эти объекты (сразу), распределенные по разным ячейкам, что создаст серьезные проблемы в дальнейшем. Всегда держите только один объект. Ниже приведен простой пример, который вы можете использовать:
;----------------
; Скрипт на объекте
;----------------
if ( player->CellChanged == 1 )
Startscript, "Create_obj_script" ; это глобальный скрипт
set obj_count to ( obj_count - 1 ) ; глоб.переменная, считающая сколько объектов существует
Disable
SetDelete, 1
endif
;----------------
; Глобальный скрипт
;----------------
PlaceAtPC "objectname", 1, 0, 0 ; или можно использовать PlaceItem
set obj_count to ( obj_count + 1 )
Stopscript "create_obj_script"
В идеале, описанный выше скрипт должен работать хорошо, но в реальности он принесет вам большие неприятности.
Удаление объекта немедленно после смены ячейки может привести к вылету.
Это особенно часто, когда грузится большая локация.
Чтобы разрешить эту проблему, задержите удаление.
Представляю вам способ задержки времени (лично я нашел, что 1,5 секунд пока вполне хватает).
Вот как теперь выглядит скрипт на объекте.
if ( player->CellChanged == 1 )
Startscript, "Create_obj_script" ; это глобальный скрипт
Disable
set timer_flag to 1
endif
if ( timer_flag == 1 )
set timer to ( timer + GetSecondsPassed )
if ( timer > 1.5 )
set obj_count to ( obj_count - 1 )
SetDelete, 1
else
return ; остановить выполнение кода
endif
endif
Это не все.
Если вы планируете двигать ваш объект с очень высокой скоростью, есть возможность, что объект испытает еще одно изменение ячейки в течение этих 1,5 секунд.
Вы должны быть уверены, что объект удален, пока еще он не вышел из зоны обработки, или он вернется позже и будет мучить вас.
Вот как теперь выглядит скрипт.
if ( player->CellChanged == 1 )
if ( timer_flag == 1 )
SetDelete, 1
return
endif
Startscript, "Create_obj_script"
Disable
set timer_flag to 1
endif
if ( timer_flag == 1 )
set timer to ( timer + GetSecondsPassed )
if ( timer > 1.5 )
SetDelete, 1
else
return
endif
endif
Если вы еще не поняли, когда вы сохраняете вашу игру в движении, координаты объекта обновляются в сохраненной игре теми, которые были при смене ячейки.
Для того, чтобы правильно позиционировать объект, всегда лучше сохранять в глобальных переменных его координаты.
При загрузке сохранения сравнивайте текущие его координаты с теми, которые хранятся в глобальных переменных.
При большом расхождении поставьте объекту глобальные координаты.
Таким образом, при загрузке игры объект окажется там, где и был до сохранения.