Advertisement
terorama

Flash / Examples 7

Apr 1st, 2013
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. //-----------------------------------------------------------------------
  3. //-----------------------------------------------------------------------
  4. //-----------------------------------------------------------------------
  5. //-----------------------------------------------------------------------
  6. <menu>
  7.  <buttons>
  8.  <button>
  9.  <label>Home</label>
  10.  <linkTo>http://easyflash.org/</linkTo>
  11.  </button>
  12.  <button>
  13.  <label>Tutorials</label>
  14.  <linkTo>http://easyflash.org/flatexttutorials</linkTo>
  15.  </button>
  16.  <button>
  17.  <label>Forum</label>
  18.  <linkTo>http://forum.easyflash.org/</linkTo>
  19.  </button>
  20.  <button>
  21.  <label>About</label>
  22.  <linkTo>http://easyflash.org/aboutus.html</linkTo>
  23.  </button>
  24.  <button>
  25.  <label>Home</label>
  26.  <linkTo>http://easyflash.org/</linkTo>
  27.  </button>
  28.  <button>
  29.  <label>Tutorials</label>
  30.  <linkTo>http://easyflash.org/flatexttutorials</linkTo>
  31.  </button>
  32.  </buttons>
  33. </menu>
  34. //-----------------------------------------
  35.  
  36. //Импортируем TweenMax
  37. import com.greensock.*;
  38.  
  39. //Задаем путь XML файла.
  40. var xmlPath:String = "colorful_menu.xml";
  41.  
  42. //Переменная, в которую поместим дайнные из загруженного XML файла.
  43. var xml:XML;
  44.  
  45. //Создаем загрузчик.
  46. var loader = new URLLoader();
  47. loader.load(new URLRequest(xmlPath));
  48. loader.addEventListener(Event.COMPLETE, xmlLoaded);
  49.  
  50. //Эта функция вызывается, когда файл полностью загружен.
  51. function xmlLoaded(e:Event):void {
  52.  
  53.  //Убедимся, что файл загружен.
  54.  if ((e.target as URLLoader) != null ) {
  55.  
  56.  //Создадим XML объект.
  57.  xml = new XML(loader.data);
  58.  
  59.  //Вызовем функцию создания меню.
  60.  createMenu();
  61.  }
  62. }
  63. //-----------------------------------------
  64.  
  65. //Создаем контейнер, который будет содержать в себе элементы меню.
  66. var menuHolder:MovieClip = new MovieClip();
  67.  
  68. //Добавляем контейнер в список отображения.
  69. addChild(menuHolder);
  70.  
  71. //Сюда будем помещать количество созданных элементов меню.
  72. var count:Number = 0;
  73.  
  74. //-----------------------------------------
  75. function createMenu():void {
  76.  
  77.  //Цикл проходит через все элементы <button></button> в XML файле.
  78.  for each (var button:XML in xml.buttons.button) {
  79.  
  80.  //Зодаем новый элемент меню.
  81.  var menuItem:MenuItem = new MenuItem();
  82.  
  83.  //Позиционируем элемент меню.
  84.  menuItem.x = 0;
  85.  menuItem.y = count * menuItem.height;
  86.  
  87.  //Добавляем текст элемента меню.
  88.  menuItem.itemText.text = button.label.toString();
  89.  
  90.  //Задаем ссылку элементу меню.
  91.  menuItem.linkTo = button.linkTo.toString();
  92.  
  93.  //Отключаем реакцию на события мыши у подобъектов мувиклипа элемента меню.
  94.  menuItem.mouseChildren = false;
  95.  
  96.  //Добавляем слушатели событий для элемента меню.
  97.  menuItem.addEventListener(MouseEvent.MOUSE_OVER, mouseOverItem);
  98.  menuItem.addEventListener(MouseEvent.MOUSE_OUT, mouseOutItem);
  99.  menuItem.addEventListener(MouseEvent.CLICK, itemClicked);
  100.  
  101.  //Добавляем элемент меню в контейнер.
  102.  menuHolder.addChild(menuItem);
  103.  
  104.  
  105.  //Обновляем счетчик элементов меню.
  106.  count++;
  107.  }
  108.  
  109.  //Вызываем функцию, которая назначает слушатели всему меню.
  110.  addMenuListeners();
  111. }
  112. //-----------------------------------------
  113.  
  114. //Функция наведения мышью на элемент меню.
  115. function mouseOverItem(e:Event):void {
  116.  
  117.  //Получим элемент меню, который получил это событие мыши.
  118.  var item:MenuItem = e.target as MenuItem;
  119.  
  120.  //Изменим цвет этого элемента меню.
  121.  TweenMax.to(item.itemBackground, 0.5, {tint: Math.random()*0xffffff});
  122. }
  123.  
  124. //-----------------------------------------
  125. //Функция отведения мыши от элемента меню.
  126. function mouseOutItem(e:Event):void {
  127.  
  128.  //Получим элемент меню, который получил это событие мыши.
  129.  var item:MenuItem = e.target as MenuItem;
  130.  
  131.  //Изменим цвет этого элемента меню.
  132.  TweenMax.to(item.itemBackground, 1.5, {tint: 0xffffff});
  133. }
  134.  
  135. //-----------------------------------------
  136. //Функция клика по элементу меню.
  137. function itemClicked(e:Event):void {
  138.  
  139.  //Получим элемент меню, который получил это событие мыши.
  140.  var item:MenuItem = e.target as MenuItem;
  141.  
  142.  //Перейдем по заданной ссылке.
  143.  var urlRequest:URLRequest = new URLRequest(item.linkTo);
  144.  navigateToURL(urlRequest);
  145. }
  146.  
  147. //-----------------------------------------
  148. //Функция назначает слушатели всему меню.
  149.  
  150. function addMenuListeners():void {
  151.  
  152. //Слушатели наведения.
  153. menuHolder.addEventListener(MouseEvent.MOUSE_OVER, mouseOverMenuF);
  154. menuHolder.addEventListener(MouseEvent.MOUSE_OUT, mouseOutMenuF);
  155.  
  156. //Слушатель ENTER_FRAME для анимации.
  157. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  158.  
  159. }
  160.  
  161. //Мы должны знать, когда мышь была наведена.
  162. var mouseOverMenu:Boolean = false;
  163.  
  164. //-----------------------------------------
  165. //Эта функция вызывается, когда мышь наводится на меню.
  166. function mouseOverMenuF(e:Event):void {
  167.  
  168. //Задаем переменной значение true.
  169. mouseOverMenu = true;
  170. }
  171. //-----------------------------------------
  172. //Эта функция вызывается, когда мышь отведена.
  173. function mouseOutMenuF(e:Event):void {
  174.  
  175. //Задаем переменной значение false.
  176. mouseOverMenu = false;
  177. }
  178.  
  179. //-----------------------------------------
  180. //Эта функция вызывается каждый кадр.
  181. function enterFrameHandler(e:Event):void {
  182.  
  183.  //Проверяем, наведена ли мышь на меню.
  184.  if (mouseOverMenu) {
  185.  
  186.  //Узнаем расстояние от верха сцены до мыши.
  187.  var distance:Number = mouseY;
  188.  
  189.  //Высчитываем процент.
  190.  var percentage:Number = distance / stage.stageHeight;
  191.  
  192.  //Высчитываем новую координату y (Помните, y изменяется, когда мы перемещаемся по меню.)
  193.  var targetY:Number = -((menuHolder.height - stage.stageHeight) * percentage);
  194.  
  195.  //Анимируем переход меню в новую координату.
  196.  TweenMax.to(menuHolder, 0.2, {y: Math.round(targetY)});
  197.  }
  198. }
  199.  
  200. //-----------------------------------------------------------------------
  201. //-----------------------------------------------------------------------
  202. //-----------------------------------------------------------------------
  203. //-----------------------------------------------------------------------
  204.  
  205.  
  206. import flash.display.Sprite;
  207. import flash.display.BitmapData;
  208. import flash.display.Bitmap;
  209.  
  210. var speed:Number = 0.3;
  211. var radius:Number = 0;
  212. var angle:Number = 0;
  213. var xpos:Number;
  214. var ypos:Number;
  215.  
  216.  
  217. var centerX:Number = stage.stageWidth / 2;
  218. var centerY:Number = stage.stageHeight / 2;
  219.  
  220. //Задаем черный задний фон.
  221.  
  222. var back:Sprite = new Sprite();
  223. back.graphics.beginFill(0x000000);
  224. back.graphics.drawRect(0, 0, 2*centerX, 2*centerY);
  225. back.graphics.endFill();
  226. addChild (back);
  227.  
  228. //Наша спираль будет содержаться в контейнере.
  229. var container:Sprite = new Sprite();
  230.  
  231. //Помещаем наш контейнер в центр сцены.
  232. container.x = centerX;
  233. container.y = centerY;
  234. addChild (container);
  235.  
  236. //Задаем в контейнере стиль линии в 4 пикселя и белого цвета.
  237. container.graphics.lineStyle (4, 0xffffff);
  238.  
  239. //Начальная точка будет в центре сцены. (это левый верхний угол контейнера)
  240. container.graphics.moveTo (0, 0);
  241.  
  242. addEventListener (Event.ENTER_FRAME, onEnterFrame);
  243.  
  244. function onEnterFrame (event:Event):void {
  245.  
  246. /*
  247. Мы останавливаем рисование спирали после того, как ее радиус достигает 100 пикселей.
  248. Но вращение спирали продолжаем.
  249. */
  250. if (radius > 100) {
  251. speed = 0;
  252. container.rotation += 10;
  253. }
  254. else {
  255. //Увеличиваем радиус каждый кадр.
  256. radius += 0.5;
  257.  
  258. //Новые х и у координаты.
  259. xpos = Math.cos(angle) * radius;
  260. ypos = Math.sin(angle) * radius;
  261.  
  262. //Рисуем линию по новым координатам.
  263. container.graphics.lineTo (xpos,ypos);
  264.  
  265. //Вращаем контейнер.
  266. container.rotation += 10;
  267.  
  268. //Чем больше скорость, тем быстрее рисуем спираль.
  269. angle += speed;
  270. }
  271. }
  272.  
  273. //-----------------------------------------------------------------------
  274. //-----------------------------------------------------------------------
  275. //-----------------------------------------------------------------------
  276. //-----------------------------------------------------------------------
  277.  
  278. <?xml version="1.0" encoding="utf-8"?>
  279.  
  280. <menus>
  281.  
  282.  <menu id="1">
  283.  <item>1.1</item>
  284.  <item>1.2</item>
  285.  </menu>
  286.  
  287.  <menu id="2">
  288.  <item>2.1</item>
  289.  <item>2.2</item>
  290.  <item>2.3</item>
  291.  <item>2.4</item>
  292.  </menu>
  293.  
  294.  <menu id="3">
  295.  <item>3.1</item>
  296.  <item>3.2</item>
  297.  <item>3.3</item>
  298.  <item>3.4</item>
  299.  </menu>
  300.  
  301.  <menu id="4">
  302.  <item>4.1</item>
  303.  <item>4.2</item>
  304.  <item>4.3</item>
  305.  </menu>
  306.  
  307. </menus>
  308.  
  309.  
  310.  
  311. //Импортируем ТвинМакс для анимации.
  312. import com.greensock.*;
  313. import com.greensock.easing.*;
  314. import com.greensock.plugins.*;
  315. TweenPlugin.activate([GlowFilterPlugin]);
  316.  
  317. //Сохраняем высоту элемента меню в константе.
  318. const ITEM_HEIGHT:Number = 40;
  319.  
  320. //Сохраняем путь до XML файла.
  321. var xmlPath:String = "flash_menu.xml";
  322.  
  323. //The XML data will be inserted into this variable
  324. var xml:XML;
  325.  
  326. //Задаем расположение меню по Y.
  327. var floor:Number = 280;
  328.  
  329. //Здесь будет храниться массив текущего выбранного меню.
  330. var selectedMenu:Array;
  331.  
  332. //Здесб будет храниться чисто созданных меню.
  333. var menuCounter:uint = 0;
  334.  
  335. // Загружаем XML файл.
  336. var loader = new URLLoader();
  337. loader.load(new URLRequest(xmlPath));
  338. loader.addEventListener(Event.COMPLETE, xmlLoaded);
  339.  
  340. //Эта функция вызывается, когда XML файл полностью загружен.
  341. function xmlLoaded(e:Event):void {
  342.  
  343.  //Убедимся, что мы не работаем с нулевым загрузчиком.
  344.  if ((e.target as URLLoader) != null ) {
  345.  
  346.  //Поместим загруженные данные в XML переменную.
  347.  xml = new XML(loader.data);
  348.  
  349.  //Вызываем функцию, которая создает все меню.
  350.  createMenus();
  351.  }
  352. }
  353.  
  354. //Эта функция создаем все меню.
  355. function createMenus():void {
  356.  
  357.  //Цикл ищет список меню в XML файле
  358.  for each (var menu:XML in xml.menu) {
  359.  
  360.  //Мы создаем пункт меню каждый раз, как цикл находит пункт меню в XML файле.
  361.  //Мы отправляем "menu" данные xml как параметр функции создания меню..
  362.  var menuItems:Array = createMenu(menu);
  363.  
  364.  //Расставляем элементы меню, которые находятся у нас в массиве.
  365.  for (var i= 0; i< menuItems.length; i++) {
  366.  
  367.  //Задаем координаты.
  368.  menuItems[i].y = floor;
  369.  menuItems[i].x = -30 + menuCounter * 80;
  370.  
  371.  //Добавляем в список отображения.
  372.  addChild(menuItems[i]);
  373.  }
  374.  }
  375. }
  376.  
  377. //Эта функция создает один подпункт меню.
  378. function createMenu(menu:XML):Array {
  379.  
  380.  //Создаем массив, который содержит все подпункты одного меню.
  381.  var menuItems:Array = new Array();
  382.  
  383.  //Цикл ищет все подпункты одного меню.
  384.  for each (var item:XML in menu.item) {
  385.  
  386.  //Создает новый подпункт меню.
  387.  var menuItem:MenuItem = new MenuItem();
  388.  
  389.  //Задает текст подпункта меню.
  390.  menuItem.menuText.text = item.toString();
  391.  
  392.  //Отключаем реакцию потомков мувиклипа на мышь.
  393.  menuItem.mouseChildren = false;
  394.  
  395.  //Добавляем подпункт меню в массив.
  396.  menuItems.push(menuItem);
  397.  }
  398.  
  399.  //Теперь создаем главный пункт меню.
  400.  var mainItem:MenuItem = new MenuItem();
  401.  
  402.  //Отключаем реакцию потомков мувиклипа на мышь.
  403.  mainItem.mouseChildren = false;
  404.  
  405.  //Добавляем главный пункт меню в массив.
  406.  menuItems.push(mainItem);
  407.  
  408.  //Сохраняем массив, к которому принадлежит этот главный пункт меню.
  409.  //Это нам понадобиться для анимации.
  410.  mainItem.belongsToMenu = menuItems;
  411.  
  412.  //Задаем id  атрибут в качестве текста в пункте меню.
  413.  mainItem.menuText.text = menu. @ id;
  414.  
  415.  //Назначаем слушатель события на главные пункты меню.
  416.  mainItem.addEventListener(MouseEvent.CLICK, mainItemClicked);
  417.  
  418.  //Обновляем счетчик.
  419.  menuCounter++;
  420.  
  421.  //Возвращаем массив, который содержит все элементы одного меню.
  422.  return menuItems;
  423. }
  424.  
  425. //Эта функция вызывается, когда кликаем по пункту меню.
  426. function mainItemClicked(e:Event):void {
  427.  
  428.  //Анимируем предыдущее меню вниз (сворачиваем).
  429.  if (selectedMenu) {
  430.  for (var i =0; i<  selectedMenu.length-1; i++) {
  431.  TweenMax.to(selectedMenu[i], 0.5 , {y:floor, glowFilter:{color:0x324df, alpha:0, blurX:0, blurY:0}});
  432.  }
  433.  }
  434.  
  435.  //Узнаем, к какому меню принадлежит выбранный элемент.
  436.  var clickedMenu:Array = e.target.belongsToMenu;
  437.  
  438.  //Делаем текущим выбранным меню тот, по которому мы кликнули.
  439.  selectedMenu = clickedMenu;
  440.  
  441.  //Цикл проходит по элементам меню, кроме главного. Главный элемент не анимируется.
  442.  for (var j =0; j<  selectedMenu.length-1; j++) {
  443.  
  444.  //Сохраняем элемент в локальной переменной.
  445.  var item = selectedMenu[j];
  446.  
  447.  //Расчитываем координаты анимации элемента.
  448.  var targetY:Number = floor - ITEM_HEIGHT*1.2*(1 + j);
  449.  
  450.  //Анимируем элемент.
  451.  TweenMax.to(item, 0.5 , {y:targetY, glowFilter:{color:0xffffff, alpha:1, blurX:20, blurY:20}});
  452.  }
  453. }
  454.  
  455. //-----------------------------------------------------------------------
  456. //-----------------------------------------------------------------------
  457. //-----------------------------------------------------------------------
  458. //-----------------------------------------------------------------------
  459.  
  460. package
  461. {
  462.  import flash.display.MovieClip;
  463.  
  464.  public class Particle extends MovieClip
  465.  {
  466.  /*
  467.  Добавляем два свойства класса - скорость передвижения шарика по оси х и по оси у.
  468.  Эти свойства будут доступны из главной сцены, так как имеют атрибут public (публичный).
  469.  */
  470.  public var speedX:Number = undefined;
  471.  public var speedY:Number = undefined;
  472.  
  473.  //Пустой конструктор шарика.
  474.  public function Particle()
  475.  {
  476.  
  477.  }
  478.  }
  479. }
  480.  
  481. //----------------------------------------
  482. //Задаем количество шариков и массив, в котором шарики будут храниться.
  483. var numberOfParticles:Number = 30;
  484. var particlesArray:Array = new Array();
  485.  
  486. //Этот цикл создает 30 шариков и рандомно размещает их на сцене.
  487. //Так же мы добавили несколько эффектов.
  488. for (var i=0; i < numberOfParticles; i++)
  489. {
  490.  
  491.  var particle:Particle = new Particle();
  492.  
  493.  //Задаем шарикам рандомные скорости по х и у.
  494.  //Math.random возвращает рандомное число n, где 0 <= n < 1.
  495.  particle.speedX = 2 + Math.random();
  496.  particle.speedY = 2 + Math.random();
  497.  
  498.  //Задаем начальные координаты.
  499.  particle.y = Math.random() * stage.stageHeight;
  500.  particle.x = Math.random() * stage.stageWidth;
  501.  
  502.  //Зададим рандомный оттенок для шариков, в результате они будут разного цвета.
  503.  var ct:Color = new Color();
  504.  ct.setTint(0xFFFFFF * Math.random(), 0.5);
  505.  particle.transform.colorTransform = ct;
  506.  
  507.  //Зададим рандомный размер шариков.
  508.  particle.scaleX = 0.5 + Math.random();
  509.  particle.scaleY = particle.scaleX;
  510.  
  511.  //Этот массив будет содержать все используемые фильтры.
  512.  var particleFilters:Array = new Array();
  513.  
  514.  //Создадим различный blur-эффект (размытие) для шариков.
  515.  var tempBlurAmount = Math.random() * 4;
  516.  var blur:BlurFilter = new BlurFilter(tempBlurAmount,tempBlurAmount,1);
  517.  particleFilters.push(blur);
  518.  
  519.  //Создадим различный glow-эффект (свечение).;
  520.  var color:Number = 0x000000;
  521.  var alphaValue:Number = 0.5;
  522.  var blurX:Number = 20;
  523.  var blurY:Number = 20;
  524.  var strength:Number = 5;
  525.  var glow:GlowFilter = new GlowFilter(color,
  526.  alphaValue,
  527.  blurX,
  528.  blurY,
  529.  strength);
  530.  
  531.  particleFilters.push(glow);
  532.  
  533.  //Назначим созданные фильтры шарикам (blur и glow);
  534.  particle.filters = particleFilters;
  535.  
  536.  //Добавим шарики в список отображения сцены и в массив.
  537.  addChild(particle);
  538.  particlesArray.push(particle);
  539. }
  540.  
  541. //----------------------------------------
  542.  
  543.  
  544. //Добавляем слушатель на событие смены кадров ролика.
  545. addEventListener(Event.ENTER_FRAME, enterFrameHandler);
  546.  
  547.  
  548. //Эта функция вызывается каждый кадр и анимирует шарики.
  549. function enterFrameHandler(e:Event):void
  550. {
  551.  //Очищаем предыдущие линии.
  552.  graphics.clear();
  553.  
  554.  //Цикл проходит по всем созданным шарикам.
  555.  for (i=0; i < particlesArray.length; i++)
  556.  {
  557.  //Помещаем текущий шарик в локальную переменную.
  558.  var particleOne:Particle = particlesArray[i];
  559.  //Перемещаем шарик в новые координаты.
  560.  particleOne.x +=  particleOne.speedX;
  561.  particleOne.y +=  particleOne.speedY;
  562.  
  563.  //Проверяем столкновение с границами.
  564.  //Если шарик сталкивается с границей, то его скорость должна быть умножена на -1 для смены направления движения.
  565.  
  566.  //Правая граница.
  567.  if (particleOne.x > stage.stageWidth)
  568.  {
  569.  particleOne.x = stage.stageWidth - particleOne.width / 2;
  570.  particleOne.speedX *=  -1;
  571.  }
  572.  //Левая граница.
  573.  else if (particleOne.x < 0)
  574.  {
  575.  particleOne.x = particleOne.width / 2;
  576.  particleOne.speedX *=  -1;
  577.  }
  578.  //Нижняя граница.
  579.  if (particleOne.y > stage.stageHeight)
  580.  {
  581.  particleOne.y = stage.stageHeight - particleOne.width / 2;
  582.  particleOne.speedY *=  -1;
  583.  }
  584.  //Верхняя граница.
  585.  else if (particleOne.y < 0)
  586.  {
  587.  particleOne.y = particleOne.width / 2;
  588.  particleOne.speedY *=  -1;
  589.  }
  590.  
  591.  //Пройдем циклом по оставшимся шарикам, чтобы вычислить дистанцию между ними.
  592.  for (var j:uint = i + 1; j < particlesArray.length; j++) {
  593.  
  594.  var particleTwo:Particle = particlesArray[j];
  595.  
  596.  var distanceX:Number = particleOne.x - particleTwo.x;
  597.  var distanceY:Number = particleOne.y - particleTwo.y;
  598.  //Используем теорему Пифагора (a^2 + b^2 = c^2),
  599.  //чтобы вычислить дистанцию между двумя шариками.
  600.  var distance:Number = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
  601.  
  602.  //Если дистанция меньше 80 пикселей, то рисуем линию между шариками.
  603.  if (distance < 80) {
  604.  drawLine (particleOne, particleTwo);
  605.  }
  606.  }
  607.  }
  608. }
  609.  
  610. //----------------------------------------
  611.  
  612. //Эта функция рисует черные линии между шариками.
  613. function drawLine (particleOne:Particle, particleTwo:Particle):void
  614. {
  615.  graphics.lineStyle (1, 0x000000);
  616.  graphics.moveTo (particleOne.x, particleOne.y);
  617.  graphics.lineTo (particleTwo.x, particleTwo.y);
  618. }
  619.  
  620. //-----------------------------------------------------------------------
  621. //-----------------------------------------------------------------------
  622. //-----------------------------------------------------------------------
  623. //-----------------------------------------------------------------------
  624.  
  625. //Импортируем библиотеку с эффектами переходов.
  626. import fl.transitions.*;
  627. import fl.transitions.easing.*;
  628.  
  629. //Этот массив будет содержать все эффекты переходов.
  630. var transitions:Array = new Array();
  631.  
  632. //Назначаем слушатель на событие мыши MOUSE_OVER для каждого квадрата.
  633. box1.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  634. box2.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  635. box3.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  636. box4.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  637. box5.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  638. box6.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  639. box7.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  640. box8.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  641. box9.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  642. box10.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  643.  
  644. //Задаем каждому квадрату свой эффект перехода.
  645. box1.transition = Blinds;
  646. box2.transition = Fade;
  647. box3.transition = Fly;
  648. box4.transition = Iris;
  649. box5.transition = Photo;
  650. box6.transition = PixelDissolve;
  651. box7.transition = Rotate;
  652. box8.transition = Squeeze;
  653. box9.transition = Wipe;
  654. box10.transition = Zoom;
  655.  
  656. //Эта функция вызывается каждый раз при наведение мышью на какой-либо квадрат.
  657. function mouseOverBox(e:Event):void
  658. {
  659.  //Квадрат, на который была наведена мышь, сохраняем в локальной переменной.
  660.  var selectedBox:MovieClip = MovieClip(e.target);
  661.  
  662.  /*
  663.  Удаляем слушатель события, чтобы пользователь не смог остановить
  664.  анимацию до того, как она закончится.
  665.  */
  666.  selectedBox.removeEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  667.  
  668.  /*
  669.  Начинаем новый переход со следующими параметрами:
  670.  type: Мы используем тот тип эффекта перехода, который был назначен выбранному квадрату.
  671.  direction: Направление анимации (Transition.OUT это второй параметр)
  672.  duration: Продолжительность анимации в секундах.
  673.  easing: Тип ослабления (сглаживания) анимации.
  674.  shape: Форма маски. Назначается только когда используется "Iris" переход.
  675.  */
  676.  var myTransitionManager:TransitionManager = new TransitionManager(selectedBox);
  677.  myTransitionManager.startTransition({type:selectedBox.transition,
  678.  direction:Transition.IN, duration:1, easing:Regular.easeOut, shape:Iris.CIRCLE});
  679.  
  680.  //Добавляем переход в массив, теперь он не попадет в процесс сборки мусора;
  681.  transitions.push(myTransitionManager);
  682.  
  683.  //Добавляем слушатель на окончание анимации перехода.
  684.  myTransitionManager.addEventListener("allTransitionsInDone", animationComplete);
  685. }
  686.  
  687. //Эта функция вызывается, когда анимация перехода завершена.
  688. function animationComplete(e:Event):void
  689. {
  690.  //Вновь назначаем слушатель на событие наведения мышью.
  691.  e.target.content.addEventListener(MouseEvent.MOUSE_OVER, mouseOverBox);
  692. }
  693.  
  694. //-----------------------------------------------------------------------
  695. //-----------------------------------------------------------------------
  696. //-----------------------------------------------------------------------
  697. //-----------------------------------------------------------------------
  698.  
  699.  
  700. //Скорость анимации по оси х.
  701. var speedX:Number = 1;
  702. //Скорость анимации по оси у.
  703. var speedAngle:Number = 0.1;
  704. //Амплитуда волны.
  705. var range:Number = 100;
  706. //Математический угол.
  707. var angle:Number = 0;
  708. //Координаты покадрового рисования.
  709. var xpos:Number = 0;
  710. var ypos:Number = 0;
  711. //Координата начальной точки волны по оси у.
  712. var centerY:Number = stage.stageHeight / 2;
  713. //Задаем стиль линии: толщина 2 пикселя, цвет "красный".
  714. graphics.lineStyle(2, 0xff0000);
  715. //Задаем начальную позицию рисования.;
  716. graphics.moveTo(0, centerY);
  717. //Назначаем слушатель на событие смены кадра.;
  718. addEventListener(Event.ENTER_FRAME, onEnterFrame);
  719.  
  720. //Эта функция выполняется каждый кадр и рисует окружность.
  721. function onEnterFrame(event:Event):void
  722. {
  723.  //Задаем координаты следующей точки.
  724.  xpos +=  speedX;
  725.  ypos = centerY + Math.sin(angle) * range;
  726.  //Задаем угол в следующем кадре.
  727.  angle +=  speedAngle;
  728.  //Рисуем окружность до следующей точки.
  729.  graphics.lineTo(xpos,ypos);
  730. }
  731.  
  732. //-----------------------------------------------------------------------
  733. //-----------------------------------------------------------------------
  734. //-----------------------------------------------------------------------
  735. //-----------------------------------------------------------------------
  736.  
  737.  
  738. //Максимальная глубина шариков.
  739. const MAXIMUM_Z:Number = 1500;
  740.  
  741. //Этот массив будет содержать шарики.
  742. var circles:Array = new Array();
  743.  
  744. //Задаем фокусное расстояние.
  745. var focalLength:Number = 500;
  746.  
  747. //Задаем точку схода перспективы в центре сцены.
  748. var vanishingPointX:Number = stage.stageWidth / 2;
  749. var vanishingPointY:Number = stage.stageHeight / 2;
  750.  
  751. //Радиус туннеля.
  752. var radius:Number = 40;
  753.  
  754. //Начальная глубина для первого шарика.
  755. var startingDepth:Number = MAXIMUM_Z;
  756.  
  757. //Начальный угол для шариков.
  758. var startingAngle = 0;
  759.  
  760. //Скорость врашения шариков.
  761. var angleSpeed:Number = 0.07;
  762.  
  763. //Создадим таймер, который срабатывает каждые 0.15 секунд.
  764. var timer:Timer = new Timer(150,0);
  765. timer.addEventListener(TimerEvent.TIMER, createCircle);
  766. timer.start();
  767.  
  768. //Функция создания шарика.
  769. function Ball():MovieClip
  770. {
  771.  var ball:MovieClip = new MovieClip();
  772.  ball.graphics.beginFill( 0xcc0000 );
  773.  ball.graphics.lineStyle( 2, 0x000000 );
  774.  ball.graphics.drawCircle( 0, 0, 20 );
  775.  addChild( ball );
  776.  return ball;
  777. }
  778.  
  779. function createCircle(e:Event):void
  780. {
  781.  
  782.  //Создаем новый шарик.
  783.  var circle:MovieClip = Ball();
  784.  
  785.  //Задаем z-позицию шарика.
  786.  circle.zpos3D = MAXIMUM_Z;
  787.  
  788.  //Сохраняем угол шарика.
  789.  circle.currentAngle = startingAngle;
  790.  
  791.  //Задаем начальную альфа, равную нулю.
  792.  circle.alpha = 0;
  793.  
  794.  //Помешаем шарик на нижнуюю позицию в списке отображения сцены.
  795.  addChildAt(circle, 0);
  796.  
  797.  //Назначаем слушатель ENTER_FRAME для анимации.
  798.  circle.addEventListener(Event.ENTER_FRAME, moveCircle);
  799. }
  800.  
  801. //Эта функция вызывается каждый кадр.
  802. function moveCircle(e:Event):void
  803. {
  804.  
  805.  //Помещаем шарик в локальную переменную.
  806.  var circle:MovieClip = (MovieClip)(e.target);
  807.  
  808.  //Уменьшаем глубину шарика. Приближаем шарик.
  809.  circle.zpos3D -=  5;
  810.  
  811.  //Если zpos3D <=-focalLength, то удаляем шарик.
  812.  if (circle.zpos3D <=  -  focalLength)
  813.  {
  814.  
  815.  //Удаляем слушатель.
  816.  circle.removeEventListener(Event.ENTER_FRAME, moveCircle);
  817.  
  818.  //Удаляем шарик из сцены.
  819.  removeChild(circle);
  820.  }
  821.  
  822.  //Обновляем текущий угол.
  823.  circle.currentAngle +=  angleSpeed;
  824.  
  825.  //Расчитываем новыю 3D x позицию.
  826.  circle.xpos3D = Math.cos(circle.currentAngle) * radius;
  827.  
  828.  //Расчитываем новую 3D y позицию.
  829.  circle.ypos3D = Math.sin(circle.currentAngle) * radius;
  830.  
  831.  //Расчитываем размер шарика.
  832.  var scaleRatio = focalLength/(focalLength + circle.zpos3D);
  833.  
  834.  //Задаем размер шарика.
  835.  circle.scaleX = circle.scaleY = scaleRatio;
  836.  
  837.  //Увеличиваем прозрачность.
  838.  if (circle.alpha < 1)
  839.  {
  840.  circle.alpha +=  0.01;
  841.  }
  842.  //Размещаем шарик в сцене. (Переводим 3Д координаты в 2Д)
  843.  circle.x = vanishingPointX + circle.xpos3D * scaleRatio;
  844.  circle.y = vanishingPointY + circle.ypos3D * scaleRatio;
  845. }
  846.  
  847. //-----------------------------------------------------------------------
  848. //-----------------------------------------------------------------------
  849. //-----------------------------------------------------------------------
  850. //-----------------------------------------------------------------------
  851.  
  852. //Задаем ширину и высоту наших кнопок(эти значения равны размерам ваших картинок для кнопок)
  853. const IMAGE_WIDTH:uint = 50;
  854. const IMAGE_HEIGHT:uint = 50;
  855.  
  856. //Задаем фокусное расстояние.
  857. var focalLength:Number = 500;
  858.  
  859. //Задаем точку схода перспективы в центре сцены.
  860. var vanishingPointX:Number = stage.stageWidth / 2;
  861. var vanishingPointY:Number = stage.stageHeight / 2;
  862.  
  863. //Задаем 3Д пол для картинок.
  864. var floor:Number = 40;
  865.  
  866. //Мы будем расчитывать angleSpeed в ENTER_FRAME слушателе.
  867. var angleSpeed:Number = 0;
  868.  
  869. //Задаем радиус 3Д карусели.
  870. var radius:Number = 200;
  871.  
  872. //Задаем путь к XML файлу. Вы здесь можете прописать свой путь.
  873. var xmlFilePath:String = "3D-carousel-settings.xml";
  874.  
  875. //Мы сохраняем загруженный XML файл в переменной.
  876. var xml:XML;
  877.  
  878. //Этот массив будет содержать наши картинки.
  879. var imageHolders:Array = new Array();
  880.  
  881. //Мы хотим знать, сколько изображений было загружено.
  882. var numberOfLoadedImages:uint = 0;
  883.  
  884. //Полное количество загруженых картинок. Значение будет задаваться через XML файл.
  885. var numberOfImages:uint = 0;
  886.  
  887. //Загружаем XML файл.
  888. var loader = new URLLoader();
  889. loader.load(new URLRequest(xmlFilePath));
  890.  
  891. //Назначаем слушатель на завершение загрузки XML файла.
  892. loader.addEventListener(Event.COMPLETE, xmlLoaded);
  893.  
  894. //Эта функция вызывается, когда XML полностью загружен.
  895. function xmlLoaded(e:Event):void {
  896.  
  897.  //Создаем новый XML объект.
  898.  xml = new XML(loader.data);
  899.  xml.ignoreWhitespace = true;
  900.  
  901.  //Вызываем функцию загрузки картинок.
  902.  loadImages();
  903. }
  904.  
  905. //Эта функция загружает картинки и создает кнопки карусели.
  906. function loadImages():void {
  907.  
  908.  //Количестко загружаемых картинок. Значение берется из XML.
  909.  numberOfImages = xml.number_of_images;
  910.  
  911.  //Цикл находит картинки в XML файле.
  912.  for each (var image:XML in xml.images.image) {
  913.  
  914.  //Создает кнопку, в которую будет помещена картинка.
  915.  var imageHolder:MovieClip = new MovieClip();
  916.  
  917.  //Создается загружчик картинок.
  918.  var imageLoader = new Loader();
  919.  
  920.  //Добавляем загрузчик в кнопку.
  921.  imageHolder.addChild(imageLoader);
  922.  
  923.  //Отключаем события мыши от загрузчика.
  924.  imageHolder.mouseChildren = false;
  925.  
  926.  //Размещаем картинку в центре кнопки.
  927.  imageLoader.x = - (IMAGE_WIDTH / 2);
  928.  imageLoader.y = - (IMAGE_HEIGHT / 2);
  929.  
  930.  //Назначаем ссылки для кнопок.
  931.  imageHolder.linkTo = image.link_to;
  932.  
  933.  //Помещаем кнопки в массив.
  934.  imageHolders.push(imageHolder);
  935.  
  936.  //загружаем картинки.
  937.  imageLoader.load(new URLRequest(image.url));
  938.  
  939.  //Слушатель на завершение загрузки.
  940.  imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoaded);
  941.  }
  942. }
  943.  
  944. //Эта функция вызывается, когда картинка полностью загружена.
  945. function imageLoaded(e:Event):void {
  946.  
  947.  //Обновляем число загруженных картинок.
  948.  numberOfLoadedImages++;
  949.  
  950.  //Сглаживаем загруженные картинки (Мы знаем, что загрузчик содержит картинку).
  951.  e.target.content.smoothing = true;
  952.  
  953.  //Проверяем, все ли картинки загруженны.
  954.  if (numberOfLoadedImages == numberOfImages) {
  955.  
  956.  //Инициализируем 3Д карусель.
  957.  initializeCarousel();
  958.  }
  959. }
  960.  
  961. //----------------------------------------------
  962. function initializeCarousel():void {
  963.  
  964.  //Расчитываем угол отступа между кнопками карусели
  965.  var angleDifference:Number = Math.PI * (360 / numberOfImages) / 180;
  966.  
  967.  //Цикл по массиву кнопок.
  968.  for (var i:uint = 0; i < imageHolders.length; i++) {
  969.  
  970.  //Передаем кнопку в локальную переменную.
  971.  var imageHolder:MovieClip = (MovieClip)(imageHolders[i]);
  972.  
  973.  //Получаем угол размещения для картинки.
  974.  var startingAngle:Number = angleDifference * i;
  975.  
  976.  //Размещаем картинку.
  977.  imageHolder.xpos3D = radius * Math.cos(startingAngle);
  978.  imageHolder.zpos3D = radius * Math.sin(startingAngle);
  979.  imageHolder.ypos3D = floor;
  980.  
  981.  //сохраняем угол размещения во внутренней переменной кнопки.
  982.  imageHolder.currentAngle = startingAngle;
  983.  
  984.  //Расчитываем размер кнопки относительно ее удаленности от зрителя.
  985.  var scaleRatio = focalLength/(focalLength + imageHolder.zpos3D);
  986.  
  987.  //Изменяем размер кнопки.
  988.  imageHolder.scaleX = imageHolder.scaleY = scaleRatio;
  989.  
  990.  //Задаем прозрачность кнопки.
  991.  imageHolder.alpha = 0.3;
  992.  
  993.  //Назначаем слушатели на события наведения мыши.
  994.  imageHolder.addEventListener(MouseEvent.MOUSE_OVER, mouseOverImage);
  995.  imageHolder.addEventListener(MouseEvent.MOUSE_OUT, mouseOutImage);
  996.  
  997.  //Назначаем слушатели на клик мыши.
  998.  imageHolder.addEventListener(MouseEvent.CLICK, imageClicked);
  999.  
  1000.  //Размещаем кнопки в сцене (Переводим 3Д координаты в 2Д)
  1001.  imageHolder.x = vanishingPointX + imageHolder.xpos3D * scaleRatio;
  1002.  imageHolder.y = vanishingPointY + imageHolder.ypos3D * scaleRatio;
  1003.  
  1004.  //Добавляем кнопки в список отображения сцены.
  1005.  addChild(imageHolder);
  1006.  }
  1007.  
  1008.  //Назначаем слушатель ENTER_FRAME для поворота карусели.
  1009.  addEventListener(Event.ENTER_FRAME, rotateCarousel);
  1010. }
  1011.  
  1012.  
  1013. //Функция вращения карусели.
  1014. function rotateCarousel(e:Event):void {
  1015.  
  1016.  //Расчитываем скорость вращения карусели относительно положения мыши.
  1017.  angleSpeed = (mouseX - vanishingPointX) / 4096;
  1018.  
  1019.  //Цикл по массиву кнопок.
  1020.  for (var i:uint = 0; i < imageHolders.length; i++) {
  1021.  
  1022.  //Передаем кнопку в локальную переменную.
  1023.  var imageHolder:MovieClip = (MovieClip)(imageHolders[i]);
  1024.  
  1025.  //Обновляем угол размещения кнопки.
  1026.  imageHolder.currentAngle += angleSpeed;
  1027.  
  1028.  //Задаем новые 3Д координы кнопки.
  1029.  imageHolder.xpos3D=radius*Math.cos(imageHolder.currentAngle);
  1030.  imageHolder.zpos3D=radius*Math.sin(imageHolder.currentAngle);
  1031.  
  1032.  //Расчитываем размеры кнопок.
  1033.  var scaleRatio = focalLength/(focalLength + imageHolder.zpos3D);
  1034.  
  1035.  //Задаем размер кнопок.
  1036.  imageHolder.scaleX=imageHolder.scaleY=scaleRatio;
  1037.  
  1038.  //Обновляем 2Д координаты кнопок.
  1039.  imageHolder.x=vanishingPointX+imageHolder.xpos3D*scaleRatio;
  1040.  imageHolder.y=vanishingPointY+imageHolder.ypos3D*scaleRatio;
  1041.  }
  1042.  
  1043.  //Сортируем кнопки по оси Z.
  1044.  sortZ();
  1045. }
  1046.  
  1047. //Эта функия сортирует кнопки по Z для правильного наложения друг на друга.
  1048. function sortZ():void {
  1049.  
  1050.  //Кнопка с бОльшим значением Z всегда первая в массиве.
  1051.  imageHolders.sortOn("zpos3D", Array.NUMERIC | Array.DESCENDING);
  1052.  
  1053.  //Задаем новые индексы кнопок в массиве.
  1054.  for (var i:uint = 0; i < imageHolders.length; i++) {
  1055.  setChildIndex(imageHolders[i], i);
  1056.  }
  1057. }
  1058.  
  1059. //Функция наведения мышью.
  1060. function mouseOverImage(e:Event):void {
  1061.  
  1062.  //Задаем альфа.
  1063.  e.target.alpha=1;
  1064. }
  1065.  
  1066. //Функция отведения мыши.
  1067. function mouseOutImage(e:Event):void {
  1068.  
  1069.  //Задаем альфа.
  1070.  e.target.alpha=0.3;
  1071. }
  1072.  
  1073. //Функция клика по кнопке.
  1074. function imageClicked(e:Event):void {
  1075.  
  1076.  //Переход по нужной ссылке.
  1077.  navigateToURL(new URLRequest(e.target.linkTo));
  1078. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement