Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2015
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package animation
  2. {
  3.     import flash.display.MovieClip;
  4.     import flash.display.Sprite;
  5.     import flash.display.BitmapData;
  6.     import flash.display.DisplayObject;
  7.     import flash.utils.getQualifiedClassName;
  8.     import flash.geom.Rectangle;
  9.     import flash.geom.Matrix;
  10.     import flash.geom.Point;
  11.    
  12.     /**
  13.      * AntAnim класс хранящий в себе только набор кадров и смещения для анимации.
  14.      *
  15.      * @langversion ActionScript 3
  16.      * @playerversion Flash 9.0.0
  17.      *
  18.      * @author Anton Karlov (http://www.ant-karlov.ru)
  19.      * @since  01.04.2012
  20.      */
  21.     public class AntAnim extends Object
  22.     {
  23.         //---------------------------------------
  24.         // PUBLIC VARIABLES
  25.         //---------------------------------------
  26.         public var name:String; // Имя анимации по умолчанию.
  27.         public var frames:Array /* of BitmapData */; // Массив кадров.
  28.         public var offsetX:Number; // Смещение кадров по X относительно оси вращения.
  29.         public var offsetY:Number; // Смещение кадров по Y относительно оси вращения.
  30.        
  31.         //---------------------------------------
  32.         // CONSTRUCTOR
  33.         //---------------------------------------
  34.        
  35.         /**
  36.          * @constructor
  37.          */
  38.         public function AntAnim()
  39.         {
  40.             super();
  41.            
  42.             name = "undefined";
  43.             frames = [];
  44.             offsetX = 0;
  45.             offsetY = 0;
  46.         }
  47.        
  48.         //---------------------------------------
  49.         // PUBLIC METHODS
  50.         //---------------------------------------
  51.        
  52.         /**
  53.          * Кэширование клипа из библиотеки.
  54.          *
  55.          * @param   clipName     Имя класса клипа в библиотеки клипов.
  56.          */
  57.         public function cacheFromLib(clipClass:Class):void
  58.         {
  59.             name = getQualifiedClassName(clipClass);
  60.             var object:DisplayObject = new clipClass();
  61.             if(object is MovieClip){
  62.                 cacheFromClip(object);
  63.             }else {
  64.                 cacheFromDisplayObject(object);
  65.             }
  66.             //cacheFromClip(new (getDefinitionByName(clipName)));
  67.         }
  68.        
  69.         /**
  70.          * Кэширование из спрайта и шейпа.
  71.          *
  72.          * @param   clip     Клип который необходимо растеризировать.
  73.          */
  74.         public function cacheFromDisplayObject(object:DisplayObject):void
  75.         {
  76.             var r:Rectangle;
  77.            
  78.             // Если размеры кадра заданы вложенным клипом с именем "e_bounds".
  79.             if (object["e_bounds"])
  80.             {
  81.                 var s:Sprite = object["e_bounds"] as Sprite;
  82.                 r = new Rectangle(s.x, s.y, s.width, s.height);
  83.                 s.visible = false;
  84.             }
  85.             // Иначе определяем размер кадра самостоятельно.
  86.             else
  87.             {
  88.                 //r = clip.getRect(clip); // Старый метод, исходя из размера первого кадра
  89.                 r = getSize(object);
  90.             }
  91.            
  92.             // Если объект пустой
  93.             if (Math.ceil(r.width) == 0 || Math.ceil(r.height) == 0)
  94.             {
  95.                 throw new Error("AntAnim::cacheFromClip() - ERROR: Object \"" + name + "\" is empty.");
  96.                 return;
  97.             }
  98.            
  99.             // Кэшируем
  100.             var m:Matrix = new Matrix();
  101.             var bmpd:BitmapData = new BitmapData(Math.ceil(r.width), Math.ceil(r.height), true, 0x000000);
  102.             m.identity();
  103.             m.translate(-r.x, -r.y);
  104.             m.scale(object.scaleX, object.scaleY);
  105.             bmpd.draw(object, m);
  106.             frames[frames.length] = bmpd;
  107.            
  108.             offsetX = r.x;
  109.             offsetY = r.y;
  110.         }
  111.  
  112.         /**
  113.          * Кэширование из экземпляра клипа.
  114.          *
  115.          * @param   clip     Клип который необходимо растеризировать.
  116.          */
  117.         public function cacheFromClip(clip:MovieClip):void
  118.         {
  119.             var r:Rectangle;
  120.            
  121.             // Если размеры кадров заданы вложенным клипом с именем "e_bounds".
  122.             if (clip["e_bounds"])
  123.             {
  124.                 var s:Sprite = clip["e_bounds"] as Sprite;
  125.                 r = new Rectangle(s.x, s.y, s.width, s.height);
  126.                 s.visible = false;
  127.             }
  128.             // Иначе определяем размер кадров самостоятельно.
  129.             else
  130.             {
  131.                 //r = clip.getRect(clip); // Старый метод, исходя из размера первого кадра
  132.                 r = getFrameSize(clip); // Новый метод, ищет максимальный размер кадра на основе всех кадров
  133.             }
  134.            
  135.             // Если клип пустой
  136.             if (Math.ceil(r.width) == 0 || Math.ceil(r.height) == 0)
  137.             {
  138.                 throw new Error("AntAnim::cacheFromClip() - ERROR: Clip \"" + name + "\" is empty.");
  139.                 return;
  140.             }
  141.            
  142.             // Кэшируем клип
  143.             var m:Matrix = new Matrix();
  144.             var n:int = clip.totalFrames;
  145.             for (var i:int = 1; i <= n; i++)
  146.             {
  147.                 clip.gotoAndStop(i);
  148.                 allChildGotoFrame(clip, i);
  149.                 var bmpd:BitmapData = new BitmapData(Math.ceil(r.width), Math.ceil(r.height), true, 0x000000);
  150.                 m.identity();
  151.                 m.translate(-r.x, -r.y);
  152.                 m.scale(clip.scaleX, clip.scaleY);
  153.                 bmpd.draw(clip, m);
  154.                 frames[frames.length] = bmpd;
  155.             }
  156.            
  157.             offsetX = r.x;
  158.             offsetY = r.y;
  159.         }
  160.        
  161.         /**
  162.          * Создает новый экземпляр анимации эдентичный текущей.
  163.          *
  164.          * @return      Новый экземпляр анимации.
  165.          */
  166.         public function clone():AntAnim
  167.         {
  168.             var anim:AntAnim = new AntAnim();
  169.             anim.name = name;
  170.             anim.frames = frames;
  171.             anim.offsetX = offsetX;
  172.             anim.offsetY = offsetY;
  173.             return anim;
  174.         }
  175.        
  176.         //---------------------------------------
  177.         // PROTECTED METHODS
  178.         //---------------------------------------
  179.        
  180.         /**
  181.          * Рассчитывает максимальный кадра на основе всех кадров клипа.
  182.          *
  183.          * @param   mc   Клип для которого необходимо получить максимальный размер кадра.
  184.          * @return      Возвращает максимальный размер кадра для указанного клипа.
  185.          */
  186.         protected function getFrameSize(mc:MovieClip):Rectangle
  187.         {
  188.             var min:Point = new Point();
  189.             var max:Point = new Point();
  190.             var bounds:Rectangle;
  191.            
  192.             var n:int = mc.totalFrames;
  193.             for (var i:int = 1; i <= n; i++)
  194.             {
  195.                 mc.gotoAndStop(i);
  196.                 allChildGotoFrame(mc, i);
  197.                 bounds = getSize(mc);
  198.                 min.x = Math.min(bounds.topLeft.x, min.x);
  199.                 min.y = Math.min(bounds.topLeft.y, min.y);
  200.                 max.x = Math.max(bounds.bottomRight.x, max.x);
  201.                 max.y = Math.max(bounds.bottomRight.y, max.y);
  202.             }
  203.            
  204.             mc.gotoAndStop(1);
  205.             return new Rectangle(min.x, min.y, max.x - min.x, max.y - min.y);
  206.         }
  207.         protected function getSize(object:DisplayObject):Rectangle
  208.         {
  209.             return object.getBounds(object);
  210.         }
  211.        
  212.         /**
  213.          * Переключает кадры указанного клипа и вложенных в него клипов на заданный кадр.
  214.          *
  215.          * @param   mc   Клип кадры которого необходимо переключить.
  216.          * @param   frame    Номер кадра на которых необходимо переключить.
  217.          */
  218.         protected function allChildGotoFrame(mc:MovieClip, frame:int):void
  219.         {
  220.             var clip:Object;
  221.             var n:int = mc.numChildren;
  222.             for (var i:int = 0; i < n; i++)
  223.             {
  224.                 clip = mc.getChildAt(i);
  225.                 if (clip is MovieClip)
  226.                 {
  227.                     allChildGotoFrame(clip as MovieClip, frame);
  228.                     clip.gotoAndStop(frame);
  229.                 }
  230.             }
  231.         }
  232.  
  233.     }
  234.  
  235. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement