Ролики. Урок1

    Вступление

    Данные уроки предназначены для тех, кто, как и я годом раньше, думал, что не сможет осилить редактор ОФП. Создание же видеороликов представлялось чем-то из разряда фантастики. Данное ощущение не пропало даже после прочтения нескольких туториалов по скриптописанию. В данных темах я попытаюсь на примерах простых и сложных объяснить основы создания игровых роликов. Я намеренно не подразделяю ролики на вступительные (intro), промежуточные (проигрываемые в любом месте миссии) и финальные (outro), поскольку отсутствует разница в их создании. Кроме того, я не буду объяснять значение команд, с помощью которых функционирует камера (слава богу, об этом можно прочитать в любом русскоязычном туториале) – добавлю лишь то, до чего мне пришлось доходить самому. Вам необходима версия ОФП 1.75, так как она содержит более продвинутую анимацию и некоторые другие фишки.

    Создание роликов. Урок I - Лирика.

    Что же нужно, чтобы оживить свою миссию? Минимум: сюжет, умение работать с координатами (x,y,z), знать команды swithmove и playmove (особенно какие анимации с какими командами работают), и терпение для многократного просмотра своего вторения на предмет исправлений. Желательно также и понимание возможностей движка ОФП. Для начала определитесь с сюжетом своего ролика. При отсутствии оного, даже совершенный с технической точки зрения ролик не найдет своего зрителя или, как минимум, испортит впечатление обо всей миссии. Координаты в ОФП задаются непосредственно на объекте camsetpos [x,y,z] либо относительно этого объекта camsetrelpos [0,+1,2.5]. Тут все ясно, надо только добавить, что второй способ я чаще всего применяю, если надо нацелить камеру на бойца или объект под конкретным углом на конкретном расстоянии. Теперь об анимации. Немой ролик с неподвижными объектами не привлечет внимание аудитории. Техника должна двигаться, самолеты должны пролетать над головой, бойцы должны отжиматься, приседать и разговаривать, стрелять и вовремя умирать, солнце должно заходить и всходить тогда, когда вы ему прикажете. Для этого, помимо вышеуказанных команд нужно знать следующие: setacctime (замедляет время от 0 до1: позволяет не только создавать эффекты а’ля Макс Пэйн, но чаще всего эффектно отобразить анимацию. Напрbмер, удар кулаком, падение убитого бойца, посадка за стол и т.д.); domove, dotarget, dofire, setbehaviour, setspeedmode, setformdir, dowatch; а также команды, формирующие световые эффекты (затемнение и т.д.) и выводящие текст на экран – titletext и titlecut. Эти команды применяются при создании роликов чаще всего. Используются они как непосредственно в скрипте, так и на карте в триггерах и вэйпойнтах. Знание данных команд превратит любую немую сцену в художественный фильм. С чего же конкретно начать Вам?
    Возьмите любую миссию, содержащую видеоролики интересные на Ваш взгляд. Распакуйте миссию в директорию OFP/User/Mission. Запустите редактор и найдите эту миссию. Теперь переключаясь Alt-Tab’ом и глядя на скрипты и карту, попытайтесь проследить чью-то творческую мысль. Далее, заглядываем в файл intro.sqs (он может называться и по-другому), отвечающий за вступительный ролик. Попробуйте поменять координаты камер, время их работы camcommit, время их существования (обычно обозначается ~, например ~5 после строчки @camCommitted _cam), а также степень увеличения/уменьшения фокуса камеры (команда camSetFOV, 0,7 – норма; <0,7 – приближаем; >0,7 – удаляем камеру от объекта, на который она нацелена командой camsettarget). Немного поиграв с этими параметрами, Вы не только поймете их глубокий смысл, но и ощие: setacctime (замедляет время от 0 до1: позволяет не только создавать эффекты а’ля Макс Пэйн, но чаще всего эффектно отобразить анимацию. Напрbмер, удар кулаком, падение убитого бойца, посадка за стол и т.д.); domove, dotarget, dofire, setbehaviour, setspeedmode, setformdir, dowatch; а также команды, формирующие световые эффекты (затемнение и т.д.) и выводящие текст на экран – titletext и titlecut. Эти команды применяются при создании роликов чаще всего. Используются они как непосредственно в скрипте, так и на карте в триггерах и вэйпойнтах. Знание данных команд превратит любую немую сцену в художественный фильм. С чего же конкретно начать Вам? Возьмите любую миссию, содержащую видеоролики интересные на Ваш взгляд. Распакуйте миссию в директорию OFP/User/Mission. Запустите редактор и найдите эту миссию. Теперь переключаясь Alt-Tab’ом и глядя на скрипты и карту, попытайтесь проследить чью-то творческую мысль. Далее, заглядываем в файл intro.sqs (он может называться и по-другому), отвечающий за вступительный ролик. Попробуйте поменять координаты камер, время их работы camcommit, время их существования (обычно обозначается ~, например ~5 после строчки @camCommitted _cam), а также степень увеличения/уменьшения фокуса камеры (команда camSetFOV, 0,7 – норма; <0,7 – приближаем; >0,7 – удаляем камеру от объекта, на который она нацелена командой camsettarget). Немного поиграв с этими параметрами, Вы не только поймете их глубокий смысл, но и осознаете, как важны временные интервалы (~), нарушая которые, вы не увидите то, что задумывал автор. Таким образом, самый быстрый способ проникнуть в тайну создания ролика – взять и переделать чужой.

Ролики. Урок 2

Создание роликов. Урок II - Поехали.

Теперь о технической стороне процесса: как переделать чужой ролик под свою миссию. Вот мы и добрались до чужого ролика (дабы не обижать авторов, я в качестве примера выложу свой Login15Eng.Noe.pbo). Потрудитесь создать в папке со своей миссией файл INIT.SQS со строкой titleCut ["","BLACK IN", 3]. Этот файл проигрывается автоматически движком ОФП и в данном случае начинает проигрывать ролик с выходом из затемнения. На карте, вдали от места основного действия ставим игрока в строке инициализации которого прописываем [] exec “intro.sqs” – он нам запустит наш вступительный ролик. Далее, на карте (см. рисунок) создаем бойца s3 (в строке инит которого напишите this setbehaviour “SAFE”) и поблизости от него три лоджика (game logic): gl1, gl2, gl3. При создании лоджиков и иных объектов следите (F2), чтобы они не образовывали группы, иначе они изменять свое, т.е. Вами установленное, первоначальное положение. Также ставим триггер с типом end#1 (финал-победа1) и в поле Condition вместо this прописываем end. Далее, в любом месте скрипта, когда мы скажем, что end = true, он завершится. Теперь берете файл INTRO.SQS (выложен ниже) и из всего имеющегося оставляйте только следующее (измените в Notepad и не забудьте сохранить и закрыть скрипт перед просмотром):

;----------------------------------------------------------------------------------------------------------
; This script is made by LOGIN (all rights reserved :)
; ----------------------------------------------------------------------------------------------------------

; создаем дефолтную камеру
mycam = "camera" camcreate [0,0,0]
mycam cameraeffect ["internal", "back"]
; устанавливаем замедление времени ( в данном случае – отсутствует)
setacctime 1.0
; устанавливаем видимость в игре (влияет на производительность
;прохождение)
setviewdistance 900
; начинаем проигрывание музыки (можно без нее, также можно вставить в
;любом другом месте ниже)
playmusic ["track5",1]

; Первый вариант – нацеливаем камеру на солдата s3, которого
;предварительно ставим на карте (см. рисунок)Нацеливание происходит
;через
;относительное задание координат и посредством создания камеры в
;лоджике (game logic), которые, как известно, в игре невидимы.
;Cоздаем бойца s3 (в строке инит которого напишите this
;setbehaviour “SAFE”) и поблизости от него три лоджика (game logic):
;gl1, gl2, gl3. При создании лоджиков и иных объектов следите (F2),
;чтобы они не образовывали группы, иначе они изменять свое, т.е. Вами
;установленное, первоначальное положение. Также ставим триггер с
;типом end#1 (финал-победа1) и в поле Condition вместо this
;прописываем end. Далее, в любом месте скрипта, когда мы скажем, что
;end = true, он завершится. Теперь берете файл INTRO.SQS (выложен
;ниже) и из всего имеющегося оставляйте только следующее (измените в
;Notepad и не забудьте сохранить и закрыть скрипт перед просмотром):

mycam = "camera" camCreate getPos s3
mycam camsetTarget s3
mycam cameraEffect ["INTERNAL", "BACK"]
; устанавливаем камеру относительно солдата [ влево от него, назад
;от него, высота]
mycam camSetRelPos [2, -1.5, 1]
; немного приблизим к нему камеру 0,65 (можете сделать меньше или
;больше)
mycam CamSetFOV 0.65
; камера появляется мгновенно
mycam camCommit 0
; здесь можно написать какой-либо текст сообщения либо удалить эту
;строчку
titlecut ["Здесь пишем какой хотим текст","plain down",1]
; текст продержится на экране примерно 4 секунды
~4
; камера проверяет исполнение всех действий и завершает свое
;существование через 3
; секунды (сначала Вы можете увеличит время, чтобы внимательно все
;осмотреть)
@camcommitted mycam
~3

; камера занимает положение лоджика (game logic) gl1, который вы
;предварительно
; установили поблизости от бойца s3 в любом месте
mycam camsetpos getpos gl1
glcoords = getpos gl1
x = glcoords select 0
y = glcoords select 1
z = glcoords select 2
; задаем высоту расположения камеры z+1 (можно поставит и 5 метров и
;больше)
mycam camsetpos [x,y,z+1]
; камера нацеливается непосредственно на бойца s3
mycam camsettarget s3
mycam camSetFOV 0.70
; камера занимает новую позицию в gl1 не мгновенно, а через 7 секунд
mycam camcommit 7
; здесь можно вставить любую анимацию бойца s3
s3 playmove "FXShow5"
; и дать время на ее завершение
~3
@camcommitted mycam
~3

; теперь камера, находясь в лоджике gl1 и не перемещаясь, будет
;нацелена на лоджик gl2,
; который вы предварительно установили в любом месте, например, на
;доме, на дереве и
; другом месте
mycam camsetpos getpos gl1
glcoords = getpos gl1
x = glcoords select 0
y = glcoords select 1
z = glcoords select 2
mycam camsetpos [x,y,z+1]
; нацеливаем камеру на лоджик gl2
mycam camsettarget gl2
mycam camSetFOV 0.70
; камера переведет объектив на лоджик gl2 за 8 секунд
mycam camcommit 8
; и закончит свою работу после нацеливания на gl2 через 2 секунды
@camcommitted mycam
~2

; теперь, переместим камеру в лоджик gl3, одновременно меняя цель.
;Теперь камера снова
; будет нацелена на бойца s3, причем сразу приблизим камеру к бойцу.
mycam camsetpos getpos gl3
glcoords = getpos gl3
x = glcoords select 0
y = glcoords select 1
z = glcoords select 2
; поставим камеру в 5 метрах от земли
mycam camsetpos [x,y,z+5]
mycam camsettarget s3
; приблизим камеру к бойцу
mycam camSetFOV 0.350
; изменения произойдут через 7 секунд
mycam camcommit 7
; заставим бойца присесть
s3 playmove “FXtoKneel”
@camcommitted mycam
~5

; теперь все остается на своих местах, но вы поменяете фокус камеры –
;отдали ее от бойца
mycam camsetpos getpos gl3
glcoords = getpos gl3
x = glcoords select 0
y = glcoords select 1
z = glcoords select 2
mycam camsetpos [x,y,z+5]
mycam camsettarget s3
; зумимся в сторону уменьшения
mycam camSetFOV 0.700
; уменьшение будет проходить на протяжении 5 секунд
mycam camcommit 5
@camcommitted mycam
~5

; громкость музыки уменьшаем до 0 в течении 4 секунд (если она не
;кончилась раьше)
4 fademusic 0

; теперь заканчиваем свое творение затемнением и автоматически
;выходом в редактор
: или в миссию при окончательной запаковке готового изделия
titleCut ["","BLACK OUT", 3]
~1
titletext ["здесь можно тоже написать какой-нибудь текст","plain"]
~2
mycam CameraEffect ["TERMINATE", "BACK"]
camDestroy myCam
cutText["","BLACK IN",1]
; условие end = правда и срабатывает триггер END#1, завершая Интро
end = ture
; собственно выход из скрипта - не пренебрегайте этой командой.
exit

; -----------------------------------------------------------------------------------------------------------------