Flash AS3: замена частей в видеоклипах
У меня есть Movieclip (уровень 1, MC) около 10 кадров. В каждом кадре есть отдельный видеоклип (уровень 2, анимация "Перемещение" и т. Д.). Внутри каждого из видеоклипов уровня 2 имеется около 30 символов видеоклипов (уровень 3, голова и т. Д.), Каждый из которых спамит около 100 кадров с примерно 30-50 ключевыми кадрами. Каждый символ уровня 3 имеет около 10 кадров, на каждом кадре у меня есть определенный рисунок кожи.
У меня есть все экземпляры символов уровня 2 и уровня 3 (одна метка на временной шкале для одного и того же объекта), и у меня есть правильные кадры stop(); и помечены. Я также понимаю, что каждый раз, когда я вхожу в новый кадр не только уровня 1, но и уровня 2, мне приходится сбрасывать все символы уровня 3 в нужный кадр, потому что мои предыдущие настройки будут уничтожены при выходе из кадра.
Я получил его, выполнив level1.gotoAndStop(level2name) ---> level1.level2.level3.gotoAndStop(skintype), а затем перебрал противное количество неприятных поз поз X bodyparts. И этот процесс должен быть выполнен в событии ENTER_FRAME, так как все будет сброшено снова. Само собой разумеется, я действительно не хочу делать это таким образом.
Одна из альтернатив - разбить графику, и в моем видеоклипе MC 1-го уровня есть много разных поз 2-х видеоклипов (маг поражен воином 3-й атаки, воин поражен мошеннической 4-й атакой...). Это то, что я делал раньше. Но для этого проекта простой расчет говорит мне, что мне нужно сделать 200+ анимаций таким образом, что неосуществимо. Я также могу избавиться от MC уровня 1 и сохранить позы в массиве, но части тела по-прежнему необходимо обновлять каждый кадр.
Я надеюсь, что есть относительно быстрое решение этой проблемы, которое мне удалось пропустить, так как это кажется такой базовой функцией, я уверен, что многим флеш-играм придется пройти через это (наряжаться или что-нибудь с настройкой + анимация) действительно). Тем не менее, как-то я искал несколько дней и не могу найти лекарство. Способность автора просто поменять графику внутри символа, чтобы заменить каждый кадр каждой анимации во всем файле, также предполагает, что должен быть более универсальный подход к этой замене. Я надеюсь, что вы можете доказать мне, правильно!
У меня есть 2 вещи, которые я не знаю, стоит ли мне вообще пытаться: 1) Перетащите MC на frame1 (мой единственный кадр), где у меня в данный момент нет ничего, кроме кода. 2) Объявите каждую часть тела индивидуально И объявите MC, затем укажите ссылки частей MC на эти части тела. По сути, мне просто нужен жизнеспособный метод, чтобы эти части тела не сбрасывались каждый раз, когда анимация переходит к новому кадру, моих знаний по флэш-памяти недостаточно, чтобы сказать, возможно ли вообще иметь этот "глобальный графический банк, независимый от кадров".
И да, я знаю, что, вероятно, я делаю это не самым чистым способом, но я просто лучше анимирую с помощью визуальных элементов, поэтому, хотя я МОГУ начать с фигур и анимировать все, используя строго код, я ДЕЙСТВИТЕЛЬНО хочу отойти от этого. Художественный стиль очень важен в этом проекте.
ОБНОВЛЕНИЕ: пока, я пошел по уродливому маршруту. Каждый раз, когда MC меняет анимацию, я делаю:
Мувиклипе (DisplayObjectContainer(MC.getChildByName(MC.move))) Hand.gotoAndStop(MC.skinname).
И повтори это для всех 35 частей тела. Оказывается, вспышка заменяет все кадры руки в MC.move, что значительно облегчает жизнь. Альтернативой является опрос для каждого отдельного кадра, но прямым следствием является НАМНОГО более медленный кадр / с. Вместо этого, сейчас мне нужно переключать графику только тогда, когда есть изменения в ходах.
Это работает, но я знаю, что это немного замедляет производительность. Фактически это может замедлить производительность на ту же величину, что и фактическая векторная визуализация. Ограничение обмена только перемещением изменений на самом деле не является обязательным, но обязательным.
1 ответ
Пожалуйста, посмотрите на это: http://zdg.ru/tmp/animation.swf
Источник можно скачать здесь: http://zdg.ru/tmp/animation.fla
Если я правильно понял ваше описание, я сделал анимацию таким же образом. Основная временная шкала имеет один кадр с символом символа. Символ символа имеет временную шкалу с двумя точками анимации "стоять" и "прыгать". Символ состоит из символов "голова", "тело", "левая рука", "правая рука", "левая рука", "правая рука". Каждый из этих символов анимирован независимо. Временная шкала анимации Charater содержит как ключевые кадры, так и анимацию. Все символы названы последовательно во всех кадрах.
Каждая часть персонажа, в свою очередь, имеет временную шкалу из 2 кадров, соответствующую скину 1 и скину 2.
Как видите, скин не разрушается во время анимации, и нет необходимости исправлять его в каждом кадре.
Код на основной временной шкале:
var char_body_parts:Array = new Array(
mv_char.body, mv_char.head, mv_char.left_hand, mv_char.right_hand,
mv_char.left_leg, mv_char.right_leg
);
var skin_num:int = 1;
mv_char.gotoAndStop("stand");
setSkin(char_body_parts, skin_num);
btn_jump.addEventListener(MouseEvent.CLICK, doJump);
btn_skin.addEventListener(MouseEvent.CLICK, doSkin);
function doJump(evt:MouseEvent):void {
mv_char.gotoAndPlay("jump");
}
function doSkin(evt:MouseEvent):void {
skin_num++;
if (skin_num > 2) skin_num = 1;
setSkin(char_body_parts, skin_num);
}
function setSkin(parts:Array, skin_num:int):void {
for (var i:int = 0; i < parts.length; i++) {
(parts[i] as MovieClip).gotoAndStop(skin_num);
}
}
================== ОБНОВЛЕНИЕ ====================
Это обновленная анимация: http://zdg.ru/tmp/animation3.swf
Источник можно скачать здесь: http://zdg.ru/tmp/animation3.fla
Теперь моя установка идентична вашей.
У меня есть 2-кадровый символ, один кадр содержит мувиклип "stand", а другой кадр содержит мувиклип "jump". Действительно, когда вы переходите к AndStop для любой анимации, скины теряются. Но вам не нужно обновлять их каждый кадр. Их нужно обновлять только в первом кадре анимации, т.е. сразу после gotoAndStop("анимация"). У меня все еще есть список частей тела, которые необходимо назначить для кожи, но теперь они доступны по имени. Итак, основные изменения кода:
var char_body_parts:Array = new Array(
"body", "head", "left_hand", "right_hand",
"left_leg", "right_leg"
);
function setSkin(char:MovieClip, parts:Array, skin_num:int):void {
for (var i:int = 0; i < parts.length; i++) {
char.mv_animation.getChildByName(parts[i]).gotoAndStop(skin_num);
}
}
function setAnimation(char:MovieClip, anim_name:String):void {
char.gotoAndStop(anim_name);
setSkin(char, char_body_parts, skin_num);
}
Есть также еще два решения, я их не кодировал, но их легко описать.
В кадре 1 каждого фрагмента ролика обложки добавьте
gotoAndStop((root as MovieClip).skin_num)
, Он работает следующим образом: всякий раз, когда скин сбрасывается, он начинается с кадра 1. В кадре 1 он будетgotoAndStop
на текущий скин автоматически. Так что вам не нужно больше ничего делать.Разместите анимационные видеоклипы не на временной шкале, а в одном кадре. Назовите каждую анимацию lke "stand", "jump" и т. Д. Переключать анимацию не нужно
gotoAndStop
, но делая выбранную анимацию видимой, а другие невидимой. Скин должен быть установлен один раз для каждого изменения кожи.