3D карусель с использованием XML и ActionScript 3.0

3D карусель с использованием XML и ActionScript 3.0

В этом уроке мы будем создавать 3D карусель, используя XML и ActionScript 3.0. В данной карусели Вы сможете легко менять число вращающихся кнопок, если Вам это будет нужно.

Создаем XML файл:
Приступим к созданию XML файла.В XML файле мы определим три важные вещи:
1. Количество кнопок в 3D карусели.
2. Ссылки на картинки для кнопок карусели.
3. Ссылки сайтов, на которые будет переходить браузер по клику на кнопки.
В любом текстовом или XML редакторе напишите следующее:

<?xml version="1.0" encoding="utf-8"?>
<carousel>
 
<number_of_images>5</number_of_images>
 
<images>
 
<image>
<url>Images/image1.png</url>
<link_to>https://www.google.ru</link_to>
</image>
 
<image>
<url>Images/image2.png</url>
<link_to>https://www.yandex.ru</link_to>
</image>
 
<image>
<url>Images/image3.png</url>
<link_to>/</link_to>
</image>
 
<image>
<url>Images/image4.png</url>
<link_to>https://www.adobe.com</link_to>
</image>
 
<image>
<url>Images/image5.png</url>
<link_to>https://help.adobe.com/ru_RU/Flash/10.0_Welcome/index.html</link_to>
</image>
 
</images>
 
</carousel><code>
 
Сохраните данный файл под именем "3D-carousel-settings.xml".
Наш XML файл готов.Теперь приготовьте свои картинки для кнопок и разместите их в той дирректории, которую вы указали в XML файле.
Открываем Adobe Flash:
Создаем новый *.fla документ размером 550х250. В первом кадре документа вставляем следующий код:
 
<actionscript3>//Задаем ширину и высоту наших кнопок(эти значения равны размерам ваших картинок для кнопок)
const IMAGE_WIDTH:uint = 50;
const IMAGE_HEIGHT:uint = 50;
 
//Задаем фокусное расстояние.
var focalLength:Number = 500;
 
//Задаем точку схода перспективы в центре сцены.
var vanishingPointX:Number = stage.stageWidth / 2;
var vanishingPointY:Number = stage.stageHeight / 2;
 
//Задаем 3Д пол для картинок.
var floor:Number = 40;
 
//Мы будем расчитывать angleSpeed в ENTER_FRAME слушателе.
var angleSpeed:Number = 0;
 
//Задаем радиус 3Д карусели.
var radius:Number = 200;
 
//Задаем путь к XML файлу. Вы здесь можете прописать свой путь.
var xmlFilePath:String = "3D-carousel-settings.xml";
 
//Мы сохраняем загруженный XML файл в переменной.
var xml:XML;
 
//Этот массив будет содержать наши картинки.
var imageHolders:Array = new Array();
 
//Мы хотим знать, сколько изображений было загружено.
var numberOfLoadedImages:uint = 0;
 
//Полное количество загруженых картинок. Значение будет задаваться через XML файл.
var numberOfImages:uint = 0;
 
//Загружаем XML файл.
var loader = new URLLoader();
loader.load(new URLRequest(xmlFilePath));
 
//Назначаем слушатель на завершение загрузки XML файла.
loader.addEventListener(Event.COMPLETE, xmlLoaded);
 
//Эта функция вызывается, когда XML полностью загружен.
function xmlLoaded(e:Event):void {
 
 //Создаем новый XML объект.
 xml = new XML(loader.data);
 xml.ignoreWhitespace = true;
 
 //Вызываем функцию загрузки картинок.
 loadImages();
}
 
//Эта функция загружает картинки и создает кнопки карусели.
function loadImages():void {
 
 //Количестко загружаемых картинок. Значение берется из XML.
 numberOfImages = xml.number_of_images;
 
 //Цикл находит картинки в XML файле.
 for each (var image:XML in xml.images.image) {
 
 //Создает кнопку, в которую будет помещена картинка.
 var imageHolder:MovieClip = new MovieClip();
 
 //Создается загружчик картинок.
 var imageLoader = new Loader();
 
 //Добавляем загрузчик в кнопку.
 imageHolder.addChild(imageLoader);
 
 //Отключаем события мыши от загрузчика.
 imageHolder.mouseChildren = false;
 
 //Размещаем картинку в центре кнопки.
 imageLoader.x = - (IMAGE_WIDTH / 2);
 imageLoader.y = - (IMAGE_HEIGHT / 2);
 
 //Назначаем ссылки для кнопок.
 imageHolder.linkTo = image.link_to;
 
 //Помещаем кнопки в массив.
 imageHolders.push(imageHolder);
 
 //загружаем картинки.
 imageLoader.load(new URLRequest(image.url));
 
 //Слушатель на завершение загрузки.
 imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
 }
}
 
//Эта функция вызывается, когда картинка полностью загружена.
function imageLoaded(e:Event):void {
 
 //Обновляем число загруженных картинок.
 numberOfLoadedImages++;
 
 //Сглаживаем загруженные картинки (Мы знаем, что загрузчик содержит картинку).
 e.target.content.smoothing = true;
 
 //Проверяем, все ли картинки загруженны.
 if (numberOfLoadedImages == numberOfImages) {
 
 //Инициализируем 3Д карусель.
 initializeCarousel();
 }
}</actionscript3>
 
Как Вы уже заметили, мы сначала задаем все необходимые переменные, затем загружаем XML файл. Как только XML загружен, мы загружаем картинки, которые мы прописали в XML файле. Наконец, мы вызываем функцию initializeCarousel (), которая создает 3Д карусель. Вот код этой функции:
 
<actionscript3>//Эта функция вызывается после того, как все картинки загружены.
//Функция создаем 3Д карусель.
function initializeCarousel():void {
 
 //Расчитываем угол отступа между кнопками карусели
 var angleDifference:Number = Math.PI * (360 / numberOfImages) / 180;
 
 //Цикл по массиву кнопок.
 for (var i:uint = 0; i < imageHolders.length; i++) {
 
 //Передаем кнопку в локальную переменную.
 var imageHolder:MovieClip = (MovieClip)(imageHolders[i]);
 
 //Получаем угол размещения для картинки.
 var startingAngle:Number = angleDifference * i;
 
 //Размещаем картинку.
 imageHolder.xpos3D = radius * Math.cos(startingAngle);
 imageHolder.zpos3D = radius * Math.sin(startingAngle);
 imageHolder.ypos3D = floor;
 
 //сохраняем угол размещения во внутренней переменной кнопки.
 imageHolder.currentAngle = startingAngle;
 
 //Расчитываем размер кнопки относительно ее удаленности от зрителя.
 var scaleRatio = focalLength/(focalLength + imageHolder.zpos3D);
 
 //Изменяем размер кнопки.
 imageHolder.scaleX = imageHolder.scaleY = scaleRatio;
 
 //Задаем прозрачность кнопки.
 imageHolder.alpha = 0.3;
 
 //Назначаем слушатели на события наведения мыши.
 imageHolder.addEventListener(MouseEvent.MOUSE_OVER, mouseOverImage);
 imageHolder.addEventListener(MouseEvent.MOUSE_OUT, mouseOutImage);
 
 //Назначаем слушатели на клик мыши.
 imageHolder.addEventListener(MouseEvent.CLICK, imageClicked);
 
 //Размещаем кнопки в сцене (Переводим 3Д координаты в 2Д)
 imageHolder.x = vanishingPointX + imageHolder.xpos3D * scaleRatio;
 imageHolder.y = vanishingPointY + imageHolder.ypos3D * scaleRatio;
 
 //Добавляем кнопки в список отображения сцены.
 addChild(imageHolder);
 }
 
 //Назначаем слушатель ENTER_FRAME для поворота карусели.
 addEventListener(Event.ENTER_FRAME, rotateCarousel);
}</actionscript3>
 
Теперь напишем код для функции вращения карусели:
 
<actionscript3>//Функция вращения карусели.
function rotateCarousel(e:Event):void {
 
 //Расчитываем скорость вращения карусели относительно положения мыши.
 angleSpeed = (mouseX - vanishingPointX) / 4096;
 
 //Цикл по массиву кнопок.
 for (var i:uint = 0; i < imageHolders.length; i++) {
 
 //Передаем кнопку в локальную переменную.
 var imageHolder:MovieClip = (MovieClip)(imageHolders[i]);
 
 //Обновляем угол размещения кнопки.
 imageHolder.currentAngle += angleSpeed;
 
 //Задаем новые 3Д координы кнопки.
 imageHolder.xpos3D=radius*Math.cos(imageHolder.currentAngle);
 imageHolder.zpos3D=radius*Math.sin(imageHolder.currentAngle);
 
 //Расчитываем размеры кнопок.
 var scaleRatio = focalLength/(focalLength + imageHolder.zpos3D);
 
 //Задаем размер кнопок.
 imageHolder.scaleX=imageHolder.scaleY=scaleRatio;
 
 //Обновляем 2Д координаты кнопок.
 imageHolder.x=vanishingPointX+imageHolder.xpos3D*scaleRatio;
 imageHolder.y=vanishingPointY+imageHolder.ypos3D*scaleRatio;
 }
 
 //Сортируем кнопки по оси Z.
 sortZ();
}
 
//Эта функия сортирует кнопки по Z для правильного наложения друг на друга.
function sortZ():void {
 
 //Кнопка с бОльшим значением Z всегда первая в массиве.
 imageHolders.sortOn("zpos3D", Array.NUMERIC | Array.DESCENDING);
 
 //Задаем новые индексы кнопок в массиве.
 for (var i:uint = 0; i < imageHolders.length; i++) {
 setChildIndex(imageHolders[i], i);
 }
}
 
//Функция наведения мышью.
function mouseOverImage(e:Event):void {
 
 //Задаем альфа.
 e.target.alpha=1;
}
 
//Функция отведения мыши.
function mouseOutImage(e:Event):void {
 
 //Задаем альфа.
 e.target.alpha=0.3;
}
 
//Функция клика по кнопке.
function imageClicked(e:Event):void {
 
 //Переход по нужной ссылке.
 navigateToURL(new URLRequest(e.target.linkTo));
}</actionscript3>
 
Готово! :)
Исходник: 

Похожие записи

Комментарии

Аватар пользователя miemi

Спасибо за труды
Щас буду пробовать

Аватар пользователя Gordon

Спасибо щас попробую!

Аватар пользователя Grandee

 

спасибо большое очень нужная вещь. А не подскажете как сделать чтобы вращалась карусель только при зажатой ЛКМ?

 

 addEventListener(MouseEvent, rotateCarousel);
}
//Функция вращения карусели.
function rotateCarousel(e:MouseEvent):void {

 

 

У меня вот такой слушатель вместо ENTER_FRAME, но проблема в том что он реагирует только на 1 клик. Помогите пожалуйста нубу)))

 

Аватар пользователя firuz

Grandee,
не совсем понятно какое событие мыши Вы отслеживаете в 

addEventListener(MouseEvent, rotateCarousel); 

Там ведь надо дописать (выбрать тип события).
Но даже если вы выберете событие, действительно функция  rotateCarousel вызовется 1 раз, тогда когда произойдет указанное событие. 

Слушатель ENTER_FRAME необходим для вызова нужной функции каждый кадр Это событие среда flash выполняет столько раз в секунду, сколько Вы указали в файле или коде. Почитайте про это событие в документации, чтобы Вам стало понятней. Я плохо рассказыаю. :) Возможно, внимательно прочитав, Вы сразу сделаете так, как Вам нужно. 
Удачи

 Автору спасибо за урок! Есть полезные приемы!

Аватар пользователя orlan15091988

у меня не получается открыть urok6 флеш :(

Аватар пользователя Fly
Цитата: orlan15091988

у меня не получается открыть urok6 флеш :(

Рискну предположить, что он сделан был с помощью CS5

1) Админ всегда прав
2) Если админ не прав, смотри пункт 1

Мы в контакте - https://vkontakte.ru/club9573247
Не отвечаю на вопросы в личку касаемо Flash, у нас для этого есть форум