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

Перейдём к опкодам.
  • 0615: define_AS_pack_begin $ActSeq
Создаёт начало экшн-пака. Здесь:
$ActSeq - имя AS-пака
  • 0616: define_AS_pack_end $ActSeq
Создаёт конец экшн-пака. Здесь:
$ActSeq  - имя AS-пака
  • 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 анимации, которые актёр будет выполнять:
Code
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
Здесь:
actor -1 - нужно именовать актёра именно так, так как мы будем передавать указатель актёра опкодом 0618.
"BOM_PLANT_IN" from_file "BOMBER"- определяем анимации, которые будут выполняться.
-1 - последний параметр уже можно редактировать на своё усмотрение. Если нужно более длительно выполнять анимацию, то пишут время в место -1. Например:

Code
0605: actor -1 perform_animation_sequence "BOM_PLANT_LOOP" from_file "BOMBER" 4.0 loop 0 0 0 0 8000
В этот список можно указывать анимации с любых IFP-файлов(даже разных), главное их загрузить перед процессом выполнения.

Перейдём к скриптам. Давайте создадим экшн-пак, и заставим его выполнять актёра:
Code
{$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
В результате наш актёр выполняет указанные анимации:


Если вы искали в поисковике опкодов воспроизведение анимации актёра, то наверняка вы сталкивались с сутуацией, когда находило целый три опкода. Вот эти:
Code
0605: actor $PLAYER_ACTOR perform_animation_sequence "phone_talk" IFP_file "PED" 4.0 loop 0 0 0 0 time 2000 // versionA
 
Code
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
 
Code
0A1A: actor $PLAYER_ACTOR perform_animation "phone_talk" IFP_file "PED" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 2000 ms // versionC
Возникают вопросы: Почему? С какой целью разработчики сделали это? В чем разница?

Я покопался и интернете и, кажется, нашел ответ: эти версии создавались для различных ситуаций с актёрами и вела себя, соответственно, от состояния актёра.
Version AАнимация будет останавливаться, когда актёра ударили, выстрелили в него или когда нужно выполнять анимации, запрограммированных в EXE-шнике.
Version BАнимация будет проигрываться, в независимо от ситуации. Чаще используется в AS-паках. Вообще все опкоды с приставкой AS используются в основном в последовательностях, причем не только анимационные команды.
Version CПозволяет актёру двигаться, выполняя анимацию. Прерывается, когда актёр прыгает, падает, плывёт.
Я, правда, остаюсь верным опкоды 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. Пример использования:
Code
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
  • 061A: get_actor $PLAYER_ACTOR animation "phone_talk" total_time_to 23@
Опкод записывает общее время воспроизведения актёром $PLAYER_ACTOR анимации phone_talk в переменную 23@.
  • 0612: set_actor $PLAYER_ACTOR animation "phone_talk" paused 0
По идеи, опкод должен ставить анимацию на паузу и продолжать воспроизведение, однако он у меня как-то неадекватно ведёт себя, а точнее, вообще никакой реакции smile Что-же, урок подошел к концу. Надеюсь мои находки будут для вас новыми и интересными ;)

SanKing   (01.04.13 10:41)
Огромное спасибо за урок! В SBManual 3 тоже есть про экшн-паки, но у тебя подробнее и лучше объяснено! И спасибо за различия между VersionA, VersionB и VersionC.

Fox1324   (01.10.14 15:54)
Извините, я новичок и хотел бы узнать что означает: 4@ += 180.0, переменная 18@, Откуда они вообще берутся эти переменные? Можете ссылку кинуть на урок?

Fox1324   (01.10.14 16:04)
Дайте ссылку, почитать про все переменные пожалуйста

0
wmysterio   (01.10.14 16:41)

GeniusZ   (29.07.15 10:56)
А как заставить актера куда нибудь пойти или побежать, желательно в AS паке?

0
wmysterio   (29.07.15 19:46)
Код
0615: define_AS_pack_begin 2@  
  05D3: AS_actor -1 goto_point 2500.376 -1685.9846 13.472 mode 4 time -1 ms  
  05D3: AS_actor -1 goto_point 2485.1157 -1686.6415 13.5085 mode 4 time -1 ms  
  // 0643: set_AS_pack 2@ loop 1 // - если нужно зациклить выполнение экшн-пака
  0616: define_AS_pack_end 2@
Вход на сайт

Поиск
Категории раздела
Мини-чат
Наш опрос
Что скажете о новом дизайне?
Всего ответов: 0
Активность на сайте
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили: