Находка для аниматора - делаем камеру во флэше
10.04.2008, автор: Stormit, рубрики: ActionScript, АнимацияКогда я набрел на мульты Адама Филипса, первое что я сделал после просмотра - начал их декомпилировать. И анимацию можно детально просмотреть, и что-нибуть интересное найти. Интересное нашлось сразу, точнее я не сразу понял как из этого fla-файла, получается такой сказочный swf. Оказалось что Адам, тот еще хитрец - использует секретное оружие, которое разработал его друг Sham Banghal - виртуальную камеру. Посмотреть как она работает и скачать ее можно здесь.
Вещь очень хорошая, а главное нужная и полезная - часто выручает. Однако есть в этой версии некоторые недоработки - она корректно работает только на главной линейке. Почти всегда это не удобно, я например, предпочитаю засовывать анимации в символы - легче потом переносить между сценами. В общем переделал ее под себя, заодно перевел ее на более модные функции. Теперь она работает на любом уровне вложенности, поддерживает все виды трансформации(и цветовую в том числе). Для экстремалов, сделал поддержку фильтров (нужно раскомментировать строку в коде).
Делаем ее так: создаем клип, внутри него делаем 2 слоя. На одном рисуем рамку по размерам флэшки (это важно, иначе могут быть пустые края по сторонам) - это объектив камеры, на другом, в кадре, пишем код:
import flash.geom.Transform; import flash.geom.Matrix; var level = 0;//на сколько клипов вверх компенсировать трансформацию cameraFrame._visible = false;//делаем саму рамку невидимой init(); //================================== //don't tuch this :) function init(){ var oldMode = Stage.scaleMode; Stage.scaleMode = "exactFit"; w = Stage.width; h = Stage.height; Stage.scaleMode = oldMode; recalcParentMatrix(); cameraStep(); onEnterFrame = cameraStep; onUnload = resetStage; } function recalcParentMatrix() { mc = _parent; if(level){ var i = level - 1; } else { var i = 1000; } while (i-- && mc && mc != _root) { var tempTrans = new Transform(mc); if (!parentM) { parentM = tempTrans.matrix; } else { parentM.concat(tempTrans.matrix); } mc = mc._parent; } cameraTrans = new Transform(this); topLevelTrans = new Transform(mc); resetM = topLevelTrans.matrix; resetTopLevelColor = topLevelTrans.colorTransform; } function cameraStep() { topLevelTrans.colorTransform = cameraTrans.colorTransform; curM = cameraTrans.matrix; if (parentM) { curM.concat(parentM); } curM.invert(); curM.translate(w / 2,h / 2); topLevelTrans.matrix = curM; //mc.filters = this.filters; } function resetStage():Void { topLevelTrans.matrix = resetM; topLevelTrans.colorTransform = resetTopLevelColor; }
Использовать камеру очень просто, создайте анимацию, как будто она движется поверх сцены и снимает то что вам нужно. Все трансформации примененные к камере, автоматически пересчитываются на сцену. Чтобы было понятнее, вот пример (здесь анимируется ТОЛЬКО камера): Читать полностью »



