00098. Последовательность в анимации

Последовательность в анимации|Всем привет! С вами wmysterio! Сейчас поговорим детальнее об анимации. Существует целый ряд опоков, связанных с ними, но остановлюсь я на последовательностях или так называемых AS-паках ( action sequences ).|wmysterio|wmysterio||||Перейдём к опкодам.

0615: define_AS_pack_begin $ActSeq // Создаёт начало экшн-пака
0616: define_AS_pack_end $ActSeq // Создаёт конец экшн-пака

Заставить выполнять актёра последовательность анимации можно с помощью опкода:

0618: assign_actor $0@ to_AS_pack $ActSeq

Здесь: 0@ - хендл, актёра $ActSeq - естественно имя AS-пака

Заставить выполнять последовательность анимации целую группу можно с помощью опкода:

087D: assign_group $PLAYER_GROUP to_AS_pack $ActSeq

Здесь: $PLAYER_GROUP - группа, что будет вкалывать :) $ActSeq - имя AS-пака

Следующий опкод выгружает последовательность:

061B: remove_references_to_AS_pack $ActSeq

Между опкодами "0615" и "0616" пишутся списки анимаций, которые будут выполняться последовательно. Для примера, я взял "3" анимации, которые актёр будет выполнять:

0605: actor -1 perform_animation_sequence "BOM_PLANT_IN" from_file "BOMBER" 4.0 loop 0 0 0 1 -1
0605: actor -1 perform_animation_sequence "BOM_PLANT_LOOP" from_file "BOMBER" 4.0 loop 0 0 0 0 -1
0605: actor -1 perform_animation_sequence "BOM_Plant_2Idle" from_file "BOMBER" 4.0 loop 0 0 0 0 -1

× **Примечание:** нужно именовать актёра именно как -1, так как мы будем передавать указатель актёра опкодом 0618. Если нужно более длительно выполнять анимацию, то пишут время в место -1

В этот список можно указывать анимации с любых IFP-файлов ( даже разных ), главное их загрузить перед процессом выполнения. Перейдём к скриптам. Давайте создадим экшн-пак, и заставим актёра выполнять его:

{$CLEO}
0000:

:SEQ
thread 'SEQ'
wait 5000
04ED: load_animation "BOMBER"
model.Load(#WMYDRUG)
038B: load_requested_models

:SEQ_1
wait 0
if and
04EE: animation "BOMBER" loaded
model.Available(#WMYDRUG)
jf @SEQ_1

0615: define_AS_pack_begin $ActSeq
0605: actor -1 perform_animation_sequence "BOM_PLANT_IN" from_file "BOMBER" 4.0 loop 0 0 0 1 -1
0605: actor -1 perform_animation_sequence "BOM_PLANT_LOOP" from_file "BOMBER" 4.0 loop 0 0 0 0 8000
0605: actor -1 perform_animation_sequence "BOM_Plant_2Idle" from_file "BOMBER" 4.0 loop 0 0 0 0 -1
0616: define_AS_pack_end $ActSeq

04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 5.0 -1.0
4@ = actor.Angle($PLAYER_ACTOR)
4@ += 180.0
0@ = actor.Create(5, #WMYDRUG, 1@, 2@, 3@)
model.destroy(#WMYDRUG)
actor.Angle(0@) = 4@
0618: assign_actor $0@ to_AS_pack $ActSeq
0AD0: show_formatted_text_lowpriority "ežo¢ek ¢¨£ož®¬e¦ £ocžešo¢a¦ež©®oc¦© a®œ¯a œœ." time 4000
wait 4000
0AD0: show_formatted_text_lowpriority "­eže™ko e¯y :)" time 4000
wait 4000
061B: remove_references_to_AS_pack $ActSeq
04EF: release_animation "BOMBER"
0A93: end_custom_thread

В результате наш актёр выполняет указанные анимации:

Если вы искали в поисковике опкодов воспроизведение анимации актёра, то наверняка вы сталкивались с сутуацией, когда находило целых три опкода. Вот эти:

0605: actor $PLAYER_ACTOR perform_animation_sequence "phone_talk" IFP_file "PED" 4.0 loop 0 0 0 0 time 2000 // versionA
0812: AS_actor $PLAYER_ACTOR perform_animation "phone_talk" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time 2000 // versionB
0A1A: actor $PLAYER_ACTOR perform_animation "phone_talk" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 2000 ms // versionC

Возникают вопросы: Почему? С какой целью разработчики сделали это? В чем разница? Я покопался и интернете и, кажется, нашел ответ: эти версии создавались для различных ситуаций с актёрами и вела себя, соответственно, от состояния актёра.

Я, правда, остаюсь верным опкоду "0605" :)

Рассмотрим так же опкоды, которые привлекли моё внимание:

0611: actor $PLAYER_ACTOR performing_animation "phone_talk"

Проверка: "Выполняет ли актёр $PLAYER_ACTOR анимацию 'phone_talk'?".

0613: 26@ = actor $PLAYER_ACTOR animation "phone_talk" time

Заносит в переменную "26@" время выполнения актёром "$PLAYER_ACTOR" анимации "phone_talk".

0614: set_actor $PLAYER_ACTOR animation "phone_talk" progress_to 2@ // 0.0 to 1.0

Устанавливает прогресс выполения актёром "$PLAYER_ACTOR" анимации "phone_talk".

Здесь: 2@ - дробное число от 0.0 до 1.0. Например, если нам нужно, что бы актёр начал выполнять анимацию не сначала а с середины, то устанавливают анимации прогресс в 0.5.

Пример использования:

0605: actor $PLAYER_ACTOR perform_animation_sequence "phone_talk" IFP_file "PED" 4.0 loop 0 0 0 0 time 2000 // versionA
0614: set_actor $PLAYER_ACTOR animation "phone_talk" progress_to 0.5

Опкод записывает общее время воспроизведения актёром "$PLAYER_ACTOR" анимации "phone_talk" в переменную "23@":

061A: get_actor $PLAYER_ACTOR animation "phone_talk" total_time_to 23@

Есть ещё этот:

0612: set_actor $PLAYER_ACTOR animation "phone_talk" paused 0

По-идеи, опкод должен ставить анимацию на паузу и продолжать воспроизведение, однако он у меня как-то неадекватно ведёт себя, а точнее, вообще никакой реакции :) Что-же, урок подошел к концу. Надеюсь мои находки будут для вас новыми и интересными ;)|2170|1|0|64667491png600337400`224``||posledovatelnost_v_animacii|1504463144

Last updated