Добавлен Dimmy,
опубликован
Скрипты в MaxEd 2
Содержание:
Ну, вот мы и добрались до кинематографа. Я думаю, нет нужды в подробностях расписывать, как я создавал свой ролик. Лучше я опишу средства и приемы, используемые при создании скриптовых вставок.
В первую очередь нам понадобится камера. Сделайте динамический объект, покройте его текстурой из категории Dummy, придайте соответствующую форму и поставьте Pivot Point как показано на скриншоте. Теперь обратимся к свойствам камеры. ВСЕ галочки должны быть сняты, КРОМЕ Exclude from Lighting и Continuous Update. Камера готова.
В первую очередь нам понадобится камера. Сделайте динамический объект, покройте его текстурой из категории Dummy, придайте соответствующую форму и поставьте Pivot Point как показано на скриншоте. Теперь обратимся к свойствам камеры. ВСЕ галочки должны быть сняты, КРОМЕ Exclude from Lighting и Continuous Update. Камера готова.
Анимация камеры осуществляется точно так же, как и любого динамического объекта. Вот так начинается скриптовый ролик у меня (тип параметров показывается в строке состояния, поэтому не буду на них останавливаться):
player->C_Hide(1);
# скрывает персонажа (выполнение его действий приостанавливается)
MaxPayne_GameMode->GM_SetPlayerControls(0);
# выключает управление
MaxPayne_GameMode->GM_EnableWideScreen(1,0);
# включает широкий экран
MaxPayne_GameMode->GM_ChangeMotionBlur(0.5,0xffffff,0.9,0.1,0);
# добавляет смазывание
this->CAM_AttachToDO(1);
# прикрепляет точку обзора к Pivot Point камеры. Параметр указывает, можно ли
# пропустить ролик, дважды нажав пробел. Для возвращения камеры в обычное
# положение, к игроку, используйте Cam_DetachFromDO();
this->DO_Animate(Zoom);
# начинается анимация камеры
Как вычислить цвет в шестнадцатеричном формате?
В Photoshop перейдите в диалог выбора цвета. Hex-код выбранного цвета пишется справа внизу. Я пользуюсь Adobe Photoshop 6.0, но, я думаю, в новых версиях Color Picker не отличается от моего. Стало быть, столбец справа отвечает за цвет, вертикальное положение ползунка — за яркость, горизонтальное положение — за контрастность. Для MotionBlur, RemapEffect и ChangeFog ситуация обстоит следующим образом: с цветом и яркостью все как обычно, а вот контрастность в данном случае - это насколько данный цвет будет смешиваться со стандартной палитрой игры. В случае с Fade и FlashToColor ситуация немного другая: то что вы видите в Color Picker, то же будет и в игре, но теперь в параметрах цвета добавляются в КОНЦЕ еще два символа на прозрачность, то есть на интенсивность смешивания палитры (как контрастность в первом случае). ff — полностью непрозрачный, 00 — полностью прозрачный. Напоследок напомню: в Photoshop буквы в верхнем регистре, а в редакторе должны быть в нижнем. Помните об этом, ибо MaxEd не проверяет это соответствие, а игра от этого, опять-таки вылетает.
Другие полезные функции для работы с роликами:
MaxPayne_GameMode->GM_ChangeRemapEffect(0.1,0xffffff,0);
# этакий довесок к Motion Blur - управление контрастностью
MaxPayne_GameMode->GM_ChangeGlobalGameSpeed(0.5,0);
# управляет скоростью игры. Множитель отсчитывается от стандартной скорости, а не от
# текущей, т.е. (0.5,0) после (0.5,0) будет 0.5, а не 0.25
MaxPayne_HUDMode->MPHM_FadeToColor(0x000000ff,0x00000000,3);
# цветовой переход - кадр либо проявляется из цвета, либо в него уплывает
this->CAM_AttachToDOWithLookAt( ::Room::Camera_Target, 1 );
# аналогично AttachToDo, но камера следит за объектом или персонажем.
Если нужно, чтобы камера смотрела в определенное место, удобно использовать FSM-точку (на самом деле она называется просто FSM, но я не хочу допустить путаницы между понятиями FSM как скриптового окна и FSM как объекта). Ставится она в F3: N -> FSM. FSM-точка — это объект, состоящий только из FSM. Обычно используется для создания спецэффектов, не привязанных к объектам. То есть, если нужно на пустом месте сделать, например, огонь, туда кладется FSM-точка, и в нужный момент запускается соответствующий спецэффект. Еще FSM-точку можно использовать для создания пули:
this->P_CreateProjectile(BulletDragunov_Player,1);
Пуля будет направлена вдоль оси Z (синей) FSM-точки. При этом на пулю будут действовать случайные факторы, указанные в data\database\shooting.h — BULLETVELOCITY_PLAYERRANDOM (изменение скорости) и BULLETSPREAD (разброс для данного типа оружия). Мне в моем скриптовом ролике потребовалась пуля Беретты, летящая врагу точно в голову. Летела она издалека, поэтому случайности надо было избежать. Я поменял оба вышеописанных параметра на 0, чтобы пуля всегда летела одинаково. Вопреки моим опасениям, на игровой баланс это не повлияло.
Что касается персонажей в скриптовых роликах. Действия им задаются так же, как и обычно — через Add и PushCommand. Если в ролике участвует сам игрок, то лучше использовать не его самого, а его копию. Например, для Макса я использовал персонажа со скином Enemy_MaxPayne.
Напоминаю, что по умолчанию у персонажа включена тактика Idle. В таком мирном режиме персонаж не может выполнять анимацию через Add/Push. А если нужно, например, чтобы персонаж не просто стоял, а прислонившись к стене?
Что касается персонажей в скриптовых роликах. Действия им задаются так же, как и обычно — через Add и PushCommand. Если в ролике участвует сам игрок, то лучше использовать не его самого, а его копию. Например, для Макса я использовал персонажа со скином Enemy_MaxPayne.
Напоминаю, что по умолчанию у персонажа включена тактика Idle. В таком мирном режиме персонаж не может выполнять анимацию через Add/Push. А если нужно, например, чтобы персонаж не просто стоял, а прислонившись к стене?
# функция
this->AI_AddCommand(ANIMATELOOPING,NOTHING,lean);
# не вызовет никакого эффекта. А вот
this->C_SetIdle(lean,1);
# - это именно то, что нужно. Второй параметр - зацикленность анимации,
# то есть можно сделать SetIdle аналогом как ANIMATE, так и ANIMATELOOPING
Если персонаж во время выполнения скрипта увидит врага, то он прервет выполнение и перейдет обратно в тактический режим, то есть начнет атаковать врага. Чтобы этого не произошло, используется функция AI_EnablePercieving. Эта функция управляет получением цели для персонажа. Если выставлено на false, то пока выполняются команды, заданные через Add/Push (то есть, действует скрипт) персонаж не будет обращать внимание на врагов. Но когда скрипт закончится — тут уж не взыщите, он опять-таки вернется в тактический режим. И никаким EnablePercieving вы от него не отмахаетесь.
Так вот, если после выполнения скрипта персонаж не должен проявлять инициативу, а C_Hide в конкретном случае вдруг окажется, неуместна, на помощь придут следующие функции. Они управляют реакцией персонажа на окружающий мир. Вообще, они часто бывают нужны не только при создании роликов.
Так вот, если после выполнения скрипта персонаж не должен проявлять инициативу, а C_Hide в конкретном случае вдруг окажется, неуместна, на помощь придут следующие функции. Они управляют реакцией персонажа на окружающий мир. Вообще, они часто бывают нужны не только при создании роликов.
this->AI_EnableHearing(0);
# слух персонажа
this->AI_EnableSeeing(0);
# зрение персонажа
this->AI_EnableFeeling(0);
# осязание (реакция на ранения)
А если Вам наоборот нужно, чтобы персонаж узнал местонахождение врага, даже если он его не видит и не слышит, используйте AI_RevealTarget.
Заключение:
Скриптинг поначалу кажется сложным и запутанным занятием. Порой начинаешь думать, что все работает совершенно непредсказуемо, и одним разработчикам известно, почему здесь так, а здесь иначе. На самом деле скриптовая система MaxEd очень логична и удобна. Главное — уловить принцип работы FSM, и тогда все, что непонятно, будет легко изучить методом научного тыка.
Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
Комментарии пока отсутcтвуют.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.