Главная
Форум
Баннеры
ТОП Сайтов
Мониторинг серверов
Банлист Сервера
Статистика Сервера
Наши отзывы
Новые сообщения · Участники · Правила форума · Поиск · RSS
  • Страница 1 из 1
  • 1
Эффект смены картинок
DooDLeZДата: Воскресенье, 28.03.2010, 20:14 | Сообщение # 1

WebMaster
Сообщений: 485
[ ]
:-(
Доброе время всем!
Попробую рассказать, как можно сделать такой вот эффект

Для работы необходим 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' и biggrin.gif
ЗЫ. Этот вариант кода, специально для облегченного восприятия материала, сделан для работы с библиотечными символами. У меня он работает с, подгружаемыми по XML списку, картинками. Предлагаю вам, друзья, в качестве домашнего задания smile.gif сделать это. Выкладывайте ваш РАБОЧИЙ код в эту ветку. Думаю, будет интересно!


  • Страница 1 из 1
  • 1
Поиск:


Все права принадлежат PainKiller.Net.Ru 2009-2010. Дизайн сайта разработан - PainKiller.Net.Ru
Внимание! Рип шаблона запрещен "Нарушение авторского права"! Design bY PainKiller.Net.Ru
Тиц и pr сайта