Доброе время всем! Попробую рассказать, как можно сделать такой вот эффект
Для работы необходим Flash и player не ниже 8 версии. Найдите у себя на харде несколько картинок и скопируйте их в одну папку (несущественно, но удобнее работать). Создайте новый флэш файл. С помощью "Ctrl+J" установите размеры фильма, превышающими размер самой большой вашей картинки. Частоту кадров поставьте 25. Выберите в меню File -> Import -> ImportToStage или нажмите ' Ctrl+R'. Укажите путь к вашей папке, выделите все картинки и жмякните ОК. После удалите картинки с рабочей области документа. Проверьте: они должны остаться в библиотеке. Вызывается Windows -> Library или 'Ctrl+L'. Теперь правый клик по каждой картинке в библиотеке, затем 'Linkage' Ставим галку на Export for ActionScript и в Identifier пишем порядковый номер картинки 0,1,2,3.... Теперь откроем панель Actions 'F9' и скопируем туда этот код
Code
// Импортируем классы, необходимые для работы import flash.display.BitmapData; import flash.geom.*; //Инициализация главных переменных и констант var bmps:Array = [];//В этом массиве будут храниться все битмапы var oldBd:BitmapData;//Битмапы контейнеры var newBd:BitmapData;//с текущей и следующей картинкой var width:Number = 0, height:Number = 0;// общий максимальный размер var intID:Number, effID:Number;//Объявим 2 таймера. 1 обрабатывает, непосредственно, эффект // 2 - промежуток времени между соседними эффектами var imgCounter:Number = 0;// Указатель на следующую картинку var delay:Number = 3000; // Пауза между эффектами смены картинок (милиСекунды) var effectDuration:Number = 1000; // Длительность эффекта (милиСекунды) var speed:Number = 10; // Скорость рекурсии эффекта (милиСекунды) //Поиграйтесь с этими 3-мя константами, для достижения необходимого результата /*********************/ // Служебные переменные var totalPixels:Number, totalDissolved:Number, pixToDissolve:Number; //Команда "ПУСК!" init(); /********************** Процедура подготовки анимации к запуску. Ее, условно, можно раделить на 3 части. 1. Циклично копируем картинки из библиотеки в новую битмапдату (далее бд). Запоминаем ее в массиве и, заодно, вычисляем максимальный совокупный размер картинок. 2. Создаем и ставим сразу на место контейнер анимации. 3. Делаем пустую бд. и визуализируем ее. Это необходимо для логичного старта анимации Запускаем анимацию вызовом функции смены картинки */ function init():Void { for (var i:Number = 0; i<4; i++) { var bmp:BitmapData = BitmapData.loadBitmap(i.toString()); width = Math.max(width, bmp.width); height = Math.max(height, bmp.height); bmps.push(bmp); } var container:MovieClip = this.createEmptyMovieClip('container', this.getNextHighestDepth()); container._x = (Stage.width-width)/2; container._y = (Stage.height-height)/2; oldBd = new BitmapData(width, height, true, 0); container.attachBitmap(oldBd, 1); pictureChange(); } /********************** Процедура цикличной замены картинки на следующую, по завершении анимации. При вызове ее, в обеих бд. содержится одна и та-же картинка, поскольку она "анимированно" скопировалась из бд. - источника (newBd) в бд. - приемник (oldBd). Необходимо заменить, в бд. - источнике, картинку на следующую и вновь запустить анимацию. 1. Убиваем таймеры, шоб не мешались. 2. Очищаем бд. - источник. 3. Копируем следующую картинку из массива в бд. - источник, сразу ее центрируя. 4. Передвигаем указатель картинок на следующую картинку. 5. Подготовим служебные переменные 6. Запуск анимации */ function pictureChange():Void { if (effID)clearInterval(effID); if (intID)clearInterval(intID); newBd.dispose(); newBd = new BitmapData(width, height, true, 0); var dx:Number = int((width-bmps[imgCounter].width)/2), dy:Number = int((height-bmps[imgCounter].height)/2); newBd.copyPixels(bmps[imgCounter], bmps[imgCounter].rectangle, new Point(dx, dy)); imgCounter++; imgCounter %= bmps.length; var randNum:Number = Math.floor(Math.random()*10); totalPixels = newBd.width*newBd.height; totalDissolved = 0; pixToDissolve = Math.floor(totalPixels*speed/effectDuration); dissolve(randNum); } /***************************************** Процедура анимациионной замены картинок. Сердцем ее является метод "pixelDissolve" класса "BitmapData". Этот метод копирует порцию рандомных пикселов из бд. - источника в бд. - приемник. Подробнее о ней написано в хелпе. Сама же процедура вызывает этот метод по таймеру с частотой = speed. Когда все пикселы заменятся, то, по истечении времени, определенного в переменной delay, вызовется функция pictureChange() и так по кольцу. */ function dissolve(arg:Number):Void { clearInterval(intID); var newNum:Number = oldBd.pixelDissolve(newBd, newBd.rectangle, new Point(0, 0), arg, pixToDissolve, 0x00FF0000); updateAfterEvent(); if (totalDissolved<totalPixels) { intID = setInterval(dissolve, speed, newNum); } else { effID = setInterval(pictureChange, delay); } totalDissolved += pixToDissolve; }
Жмем 'Ctrl+Enter' и ЗЫ. Этот вариант кода, специально для облегченного восприятия материала, сделан для работы с библиотечными символами. У меня он работает с, подгружаемыми по XML списку, картинками. Предлагаю вам, друзья, в качестве домашнего задания сделать это. Выкладывайте ваш РАБОЧИЙ код в эту ветку. Думаю, будет интересно!
Все права принадлежат PainKiller.Net.Ru 2009-2010. Дизайн сайта разработан - PainKiller.Net.Ru
Внимание! Рип шаблона запрещен "Нарушение авторского права"!
Design bY PainKiller.Net.Ru