Max Payne: Часть 4. Скриптовые ролики

Скрипты в MaxEd 2
Ну, вот мы и добрались до кинематографа. Я думаю, нет нужды в подробностях расписывать, как я создавал свой ролик. Лучше я опишу средства и приемы, используемые при создании скриптовых вставок.
В первую очередь нам понадобится камера. Сделайте динамический объект, покройте его текстурой из категории 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. А если нужно, например, чтобы персонаж не просто стоял, а прислонившись к стене?
# функция
this->AI_AddCommand(ANIMATELOOPING,NOTHING,lean);
# не вызовет никакого эффекта. А вот
this->C_SetIdle(lean,1);
# - это именно то, что нужно. Второй параметр - зацикленность анимации,
# то есть можно сделать SetIdle аналогом как ANIMATE, так и ANIMATELOOPING
Если персонаж во время выполнения скрипта увидит врага, то он прервет выполнение и перейдет обратно в тактический режим, то есть начнет атаковать врага. Чтобы этого не произошло, используется функция AI_EnablePercieving. Эта функция управляет получением цели для персонажа. Если выставлено на false, то пока выполняются команды, заданные через Add/Push (то есть, действует скрипт) персонаж не будет обращать внимание на врагов. Но когда скрипт закончится — тут уж не взыщите, он опять-таки вернется в тактический режим. И никаким EnablePercieving вы от него не отмахаетесь.
Так вот, если после выполнения скрипта персонаж не должен проявлять инициативу, а C_Hide в конкретном случае вдруг окажется, неуместна, на помощь придут следующие функции. Они управляют реакцией персонажа на окружающий мир. Вообще, они часто бывают нужны не только при создании роликов.
this->AI_EnableHearing(0);
# слух персонажа
this->AI_EnableSeeing(0);
# зрение персонажа
this->AI_EnableFeeling(0);
# осязание (реакция на ранения)
А если Вам наоборот нужно, чтобы персонаж узнал местонахождение врага, даже если он его не видит и не слышит, используйте AI_RevealTarget.

Заключение:

Скриптинг поначалу кажется сложным и запутанным занятием. Порой начинаешь думать, что все работает совершенно непредсказуемо, и одним разработчикам известно, почему здесь так, а здесь иначе. На самом деле скриптовая система MaxEd очень логична и удобна. Главное — уловить принцип работы FSM, и тогда все, что непонятно, будет легко изучить методом научного тыка.

Просмотров: 5 120

Комментарии пока отсутcтвуют