Advertisement
terorama

Flash / Examples 9

Apr 1st, 2013
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //-----------------------------------------------------------------------
  2. //-----------------------------------------------------------------------
  3. //-----------------------------------------------------------------------
  4. //-----------------------------------------------------------------------
  5.  
  6. //Импортируем TweenMax.
  7. import gs.*;
  8.  
  9. /*
  10. Устанавливаем точку для  кординаты у.
  11. Когда объект будет далеко его координата у будет равна вот этой точке .
  12. */
  13. var vanishingPointY:Number = stage.stageHeight / 2;
  14.  
  15. //Устанавливаем переменную, которая "отвечает" за перспективу. То есть "дальше-ближе".
  16. var focalLength:Number = 300;
  17.  
  18. //Создаем массив, который будет содержать текст и кружок.
  19. var itemsArray:Array = new Array();
  20.  
  21. //Добавляем текст в массив.
  22. itemsArray.push(myText);
  23.  
  24. //добавляем кружок в массив
  25. itemsArray.push(myCircle);
  26.  
  27. /*Угол. Даже не знаю как подробней обяснить зачем эта переменная.
  28. Вообщем на сколько будет поворачиваться туннель. Вообще можно пооэксперементировать
  29. с этой переменной. Будет еще красиво смотреться если устантовить значение 3. Мне так больше нравиться, но оставлю так, как
  30. в оригинальном уроке*/
  31. var angleSpeed:Number = 0.2;
  32.  
  33. //Скорость движения по горизонтали
  34. var xSpeed:Number = 4;
  35.  
  36. //Что бы туннэль не "врезался" в текст, надо сделать радиус туннэля  равным высоте текста
  37. var yRadius:Number = myText.height;
  38.  
  39. //Высчитываем глубину с помощью yRadius
  40. var zRadius:Number = yRadius * 3;
  41.  
  42. //Устанавливаем 3D y и z координаты
  43. myCircle.ypos3D = 0;
  44. myCircle.zpos3D = 0;
  45.  
  46. //Устанавливаем 3D z позицию для текста
  47. myText.zpos3D = 0;
  48.  
  49. //Initial angle for the circle
  50. myCircle.currentAngle = 0;
  51.  
  52. //Добавляем ENTER_FRAME listener что бы анимировать кружок
  53. myCircle.addEventListener(Event.ENTER_FRAME, moveCircle);
  54.  
  55. /*
  56. Устанавливаем timer для начала движения.
  57. С помощью этого создаем след.
  58. */
  59. var timer:Timer = new Timer(20,0);
  60. timer.addEventListener(TimerEvent.TIMER, createTrail);
  61. timer.start();
  62.  
  63. //Следущая функция двигает наш кружок
  64. function moveCircle(e:Event):void {
  65.  
  66.  //Обновляем укогл кружка
  67.  myCircle.currentAngle += angleSpeed;
  68.  
  69.  //Высчитываем новую 3D y позицию
  70.  myCircle.ypos3D=Math.sin(myCircle.currentAngle)*yRadius;
  71.  
  72.  //Высчитываем новую 3D z позицию
  73.  myCircle.zpos3D=Math.cos(myCircle.currentAngle)*zRadius;
  74.  
  75.  //Высчитываем размеры
  76.  var scaleRatio = focalLength/(focalLength + myCircle.zpos3D);
  77.  
  78.  //Высчитываем размеры кружка следующим соотношением
  79.  myCircle.scaleX=myCircle.scaleY=scaleRatio;
  80.  
  81.  //Обновляем  координату х
  82.  myCircle.x+=xSpeed;
  83.  
  84.  //Обновляем координату у
  85.  myCircle.y=vanishingPointY+myCircle.ypos3D*scaleRatio;
  86.  
  87.  //Если кружок закончил движение, заставляем его повторить
  88.  if (myCircle.x>stage.stageWidth+20) {
  89.   myCircle.x=-20;
  90.  }
  91.  
  92.  //Вызываем функцию, которая сортирует круги, что бы они правильно накладывались
  93.  sortZ();
  94. }
  95.  
  96. //Эта функция создает новый след
  97. function createTrail(e:Event):void {
  98.  
  99.  //Create a new circle
  100.  var newCircle:MyCircle = new MyCircle();
  101.  
  102.  //Устанавливаем z позицию, которая была у "myCircle"
  103.  newCircle.zpos3D=myCircle.zpos3D;
  104.  
  105.  //Устанавливаем одинаковые координаты
  106.  newCircle.x=myCircle.x;
  107.  newCircle.y=myCircle.y;
  108.  
  109.  //Высчитываем размеры
  110.  var scaleRatio = focalLength/(focalLength + newCircle.zpos3D);
  111.  
  112.  //Устанавливаем размеры следующим уравнением
  113.  newCircle.scaleX=newCircle.scaleY=scaleRatio;
  114.  
  115.  //Добавляем в массив новый элемент
  116.  itemsArray.push(newCircle);
  117.  
  118.  //Добавляем новый круг на сцену
  119.  addChild(newCircle);
  120.  
  121.  //Сортируем так, что бы кружки правильно накладывались
  122.  sortZ();
  123.  
  124.  /*
  125.  Используем TweenMax
  126.   */
  127.  TweenMax.to(newCircle, 2, {alpha: 0, scaleX:0, scaleY:0, onComplete: removeCircle, onCompleteParams: [newCircle]});
  128. }
  129.  
  130. //Вызываем йункцию removeCircle когда анимация закончена
  131. function removeCircle(circle:MyCircle):void {
  132.  
  133.  //Удаляем круг из массива
  134.  var i:uint=itemsArray.indexOf(circle);
  135.  itemsArray.splice(i, 1);
  136.  
  137.  //Удаляем со сцены
  138.  removeChild(circle);
  139. }
  140.  
  141. //Эта  функция сортирует круги что бы они накладывались правильно
  142. function sortZ():void {
  143.  
  144.  /*
  145.  Сортируем массив так, что бы круг с наибольшей координатой z был первым
  146.  */
  147.  itemsArray.sortOn("zpos3D", Array.NUMERIC | Array.DESCENDING);
  148.  
  149.  //Устанавливаем новые индексы child indexes для элементов
  150.  for (var i:uint = 0; i < itemsArray.length; i++) {
  151.   setChildIndex(itemsArray[i], i);
  152.  }}
  153.  
  154. //-----------------------------------------------------------------------
  155. //-----------------------------------------------------------------------
  156. //-----------------------------------------------------------------------
  157. //-----------------------------------------------------------------------
  158.  
  159. <?xml version="1.0" encoding="UTF-8"?>
  160. <images>
  161.  <image src="img/01.jpg"/>
  162.  <image src="img/02.jpg"/>
  163.  <image src="img/03.jpg"/>
  164.  <image src="img/04.jpg"/>
  165.  <image src="img/05.jpg"/>
  166.  <image src="img/06.jpg"/>
  167.  <image src="img/07.jpg"/>
  168.  <image src="img/08.jpg"/>
  169.  <image src="img/09.jpg"/>
  170.  <image src="img/10.jpg"/>
  171. </images>
  172.  
  173. //------------------------------------
  174. package {
  175.  //Импортируем нужные классы
  176.  import flash.display.Loader;
  177.  import flash.display.Sprite;
  178.  import flash.events.Event;
  179.  import flash.events.MouseEvent;
  180.  import flash.net.URLLoader;
  181.  import flash.net.URLRequest;
  182.  import com.theflashblog.fp10.*;
  183.  import gs.*;
  184.  import gs.easing.*;
  185.  
  186.  //Создаём наш класс
  187. //------------------------------------
  188.  public class Carousel extends Sprite
  189.  {
  190.     private var container:Sprite; //Здесь будут храниться наши картинки
  191.     private var loader:URLLoader; //Этот URLLoader загрузит наш XML
  192.     private var anglePer:Number;
  193.  
  194.     //------------------------------------
  195.     public function Carousel() //Это функция конструктор и она запуститься самой первой
  196.     {
  197.         createContainer(); //Вызываем функцию, которая создаст наш контейнер для картинок
  198.         loadXml(); //Загружаем наш XML
  199.     }
  200.    //------------------------------------
  201.     private function loadXml():void //Это функция загрузки XML
  202.     {
  203.         loader=new URLLoader(new URLRequest('images.xml')); //Загружаем наш XML
  204.         loader.addEventListener(Event.COMPLETE, createCarousel); //Регистрируем событие когда закончиться загрузка, чтобы создать карусель
  205.     }
  206.  
  207.       //------------------------------------
  208.     private function createCarousel(e:Event):void //Это функция создания карусели
  209.     {
  210.         var xml:XML=new XML(e.target.data); //создаем xml
  211.         var list:XMLList=xml.image; //создаём XMLList, чтобы было удобно брать настройки
  212.         anglePer = (Math.PI*2)/list.length();
  213.         for(var i:int=0;i<list.length();i++) //создаём цикл в котором разместим наши элементы по кругу
  214.         {
  215.             var imc:imCon=new imCon(); //берем наш контейнер из библиотеки
  216.             imc.buttonMode=true; //делаем так, чтобы он был похож на кнопку
  217.             imc.addEventListener(MouseEvent.CLICK, onclickiiiii); //регистрируем событие, чтобы знать когда мышкой кликнут по этой картинке
  218.             var l:Loader=new Loader(); //создаём новый Loader, чтобы загрузить нашу картику
  219.             l.x=-250; //центрируем нашу картинку
  220.             l.y=-187.5;
  221.             l.load(new URLRequest(list[i].@src)); //загружаем картинку, используя наш XMLList
  222.             imc.addChild(l); //добавляем в наш контейнер Loader, чтобы иметь возможность увидеть его на сцене
  223.             imc.scaleX=imc.scaleY=0.5; //немного уменьшаем наш контейнер, чтобы видеть все картинки
  224.             imc.angle=(i*anglePer) - Math.PI/2; //узнаём угол, на который нужно повернуть главный контейнер, чтобы увидеть нашу картинку посередине
  225.             imc.x=Math.cos(imc.angle)*450; //располагаем наш контейнер изображения на нужной координате x
  226.             imc.z=Math.sin(imc.angle)*450; ////располагаем наш контейнер изображения на нужной координате z
  227.             imc.rotationY=36*-i; //поворачиваем наш контейнер изображения в зависимости от расстояния по z
  228.             container.addChild(imc); //добавляем контейнер изображения в главный контейнер
  229.         }
  230.         this.addEventListener(Event.ENTER_FRAME, loop); //регистрируем событие, которое быдет отправляться каждый кадр
  231.     }
  232.  
  233. //------------------------------------
  234.     private function onclickiiiii(e:MouseEvent):void //Эта функция будет поворачивать главный контейнер и увеличивать его, чтобы увидеть нашу картинку посередине
  235.     {
  236.         TweenLite.to(container, 0.8,{rotationY:(e.currentTarget.angle+Math.PI/2)/Math.PI*180,z:100}); //создаём анимацию поворота
  237.     }
  238. //------------------------------------
  239.     private function createContainer():void //Эта функция создаст главный контейнер
  240.     {
  241.         container=new Sprite();
  242.         container.x=350; //центрируем наш контейнер
  243.         container.y=250;
  244.         container.z=400;
  245.         addChild(container); //добавляем наш контейнер на сцену
  246.         cover.addEventListener(MouseEvent.CLICK, stageClick); //регистрируем событие, чтобы знать когда мышкой кликнут по сцене для уменьшения карусели
  247.     }
  248. //------------------------------------
  249.     private function stageClick(e:MouseEvent):void //Эта функция уменьшит главный контейнер
  250.     {
  251.         TweenLite.to(container, 0.8,{z:400}); //создаём анимацию уменьшения
  252.     }
  253. //------------------------------------
  254.     private function loop(e:Event):void //Эта функция отсортирует наши картинки по оси z
  255.     {
  256.         SimpleZSorter.sortClips(container); //сортируем наши картинки по оси z
  257.     }
  258.  }
  259. }
  260.  
  261. //-----------------------------------------------------------------------
  262. //-----------------------------------------------------------------------
  263. //-----------------------------------------------------------------------
  264. //-----------------------------------------------------------------------
  265.  
  266.  
  267. //Практическое применение. Пример:
  268. //var ваша_переменная:Flame = new Flame(значение_п1, значение_п2, значение_п3, значение_п4, значение_п5);
  269.  
  270.     var flame:Flame = new Flame(100, 100, 30, 0.5, 2) //Описание ниже.
  271.     flame.x = 150; //Координата источника пламени по X в родительском контейнере.
  272.     flame.y = 200; //Координата источника пламени по Y в родительском контейнере.
  273.     flame.rotation = 0; /*Угол поворота огня (по часовой стрелке - в градусах).
  274.     При нуле (0) - это свойство можно вообще не изменять. Идет по умолчанию.*/
  275.     addChild(flame);
  276.  
  277. /*
  278. п1. Размер огня в процентах по ширине от 100% (50 - сократит огонь в половину);
  279. п2. Размер огня в процентах по высоте от 100% (200 - увеличит огонь вдвое);
  280. п3. Минимальная граница непрозрачности искр(они же Spark) в процентах от 100%.
  281. Больше 100 ставить значение НЕ имеет смысла. Ничего не изменится. Поскольку 100 -
  282. это 100% непрозрачности. Значение прозрачности выщитывается случайно.
  283. Затем к нему плюсуется минимальная граница;
  284. п4. Коэффициент скалирования. Задает амплитуду возникающих искр.
  285. При больших значениях можно получить одну искру размером с танк,
  286. а вторую - с муравья. Поэтому для равномерности рекомендуется значение держать
  287. на уhовне 0.5 + (само собой) ваши эксперименты.
  288. п5. Плотность частиц. Значения - строго целые положительные(прим.:
  289. 1. для любителей пустых экранов - нуль тоже можно передать;
  290. 2. для программистов - изменив свойство density(например, flame.density = 0),
  291. можно получить эффект потухания огня. Динамически добавив, большую плотность &ndash;
  292. можно получить эффект усиления огня. Эффективность такого подхода - не определена.)
  293. */
  294.  
  295. //--------------------------------------------
  296.  
  297. package
  298.  {
  299.      // импортируем необходимые для работы классы
  300.      import flash.display.MovieClip;
  301.      import flash.utils.Timer;
  302.      import flash.events.TimerEvent;
  303.  
  304.      public class Flame extends MovieClip
  305.      {
  306.          /* устанавливаем таймер, который будет генерировать искры(Spark),
  307.          что сделает огонь независимым от частоты кадров, но несколько осложнит
  308.          работу вашему процессору*/
  309.          public var timer:Timer = new Timer(42, 0)
  310.  
  311.          private var alphaSpark:Number; // минимальная граница непрозрачности.
  312.          private var scaleSpark:Number; // коэффициент скалирования частиц (Spark)
  313.          public var density:uint; // плотность частиц
  314.  
  315.          // функция-конструктор получает параметры:
  316.          function Flame(sF_X:Number, sF_Y:Number, aS:Number, sS:Number, den_y:uint)
  317.          {
  318.              this.scaleX = sF_X/100; //изменяем размер по X для контейнера(Flame) искр(Spark)
  319.              this.scaleY = sF_Y/100; //изменяем размер по Y для контейнера(Flame) искр(Spark)
  320.              alphaSpark = aS/100;
  321.              scaleSpark = sS;
  322.              density = den_y;
  323.  
  324.              //добавляем слушатель к таймеру, который запустит обработчик sparkAdder:
  325.              timer.addEventListener ("timer", sparkAdder, false, 0, true);
  326.              timer.start(); // запускаем таймер
  327.          }
  328.  
  329.          // пишем функцию-обработчик sparkAdder:
  330.          function sparkAdder(e:TimerEvent):void
  331.          {
  332.              // создаем локальные переменные свойств объекта.
  333.              var a = alphaSpark;
  334.              var s = scaleSpark;
  335.              var d = density;
  336.  
  337.              // создаем цикл который "выплевывает" на экран искры(Spark):
  338.              for (var i:uint = 0; i < d; i+=1)
  339.              {
  340.                  var spark:Spark = new Spark(); //создаем экземпляр класса Spark
  341.  
  342.                  spark.x = (Math.random()-0.5)*15; // задаем рандом по X для искр
  343.                  spark.y = Math.random()*20; // задаем рандом по Y для искр
  344.                  spark.alpha = Math.random() + alphaSpark; // прозрачность новой искры
  345.                  spark.scaleY = Math.random()*scaleSpark + 1; // размер новой искры
  346.                  spark.scaleX = spark.scaleY; // сохраняем пропорции
  347.                  addChild(spark); // добавляем искру в список отображения.
  348.              }
  349.          }
  350.      }
  351.  }
  352.  
  353. //--------------------------------------------
  354.  
  355. package
  356.  {
  357.      // импортируем необходимые для работы классы
  358.      import flash.display.MovieClip;
  359.      import flash.events.*;
  360.  
  361.      class SparkMover extends MovieClip
  362.      {
  363.          // создаем пустой контейнер искр класса Object
  364.          private static var sparks:Object = {};
  365.          private static var allSparks:uint = 0; // счетчик последней по порядку искры
  366.  
  367.          private var thisSpark:uint;
  368.  
  369.          function SparkMover()
  370.          {
  371.              /* избавляем особо усидчивых игроков от ошибки,
  372.              возникающей из-за числового ограничения класса uint.
  373.              Не помешает ;)*/
  374.              if (allSparks > 10000)
  375.              {
  376.                  allSparks = 0;
  377.              }
  378.  
  379.              thisSpark = allSparks+=1; // задаем индекс текущей искре
  380.              sparks[thisSpark] = this; /* делаем ссылку экземпляра класса
  381.              SparkMover на самого себя. Нужно для дальнейшей работы */
  382.  
  383.              // добавляем слушатель нового кадра. Ведь класс Spark содержит кадры
  384.              addEventListener(Event.ENTER_FRAME, sparkMover, false, 0, true);
  385.          }
  386.  
  387.          private function sparkMover (e:Event):void
  388.          {
  389.              if (currentFrame == totalFrames) /* проверяем проиграла ли
  390.              искра себя полностью. Т.е. достиг ли текущий кадр конечно.
  391.              Хотя формально totalFrames - общее количество кадров*/
  392.              {
  393.                  // удаляем слушатель
  394.                  removeEventListener(Event.ENTER_FRAME, sparkMover);
  395.                  this.stop (); // останавливаем проигрывание кадров
  396.                  // добавляем слушатель, который удалит искру со сцены
  397.                  addEventListener (Event.ENTER_FRAME, killSpark, false, 0, true);
  398.              }
  399.          }
  400.  
  401.          private function killSpark (e:Event):void
  402.          {
  403.              removeEventListener(Event.ENTER_FRAME, killSpark);
  404.              parent.removeChild(this); //удаляем искру со сцены
  405.              delete sparks[thisSpark]; //удаляем ссылку на искру из нашего контейнера
  406.          }
  407.      }
  408.  }
  409.  
  410. //-----------------------------------------------------------------------
  411. //-----------------------------------------------------------------------
  412. //-----------------------------------------------------------------------
  413. //-----------------------------------------------------------------------
  414.  
  415.  
  416. // Создаем массив для точек (точнее координат)
  417. var pointArray:Array = new Array();
  418.  
  419. // Определяем центр "вселенной" как центр сцены
  420. var centerX:Number = Stage.width / 2;
  421. var centerY:Number = Stage.height / 2;
  422.  
  423. // Определям элементы массива точек как обекты со свойствами pointX и pointY
  424. // и заполняем их значениями нашего центра "вселенной"
  425. for (var i:Number = 0; i < 100; i++) {
  426. pointArray[i] = new Object();
  427. pointArray[i].pointX = centerX;
  428. pointArray[i].pointY = centerY;
  429. }
  430.  
  431. // Ну что ж, приступим. В каждом кадре....
  432. this.onEnterFrame = function() {
  433.  
  434.        // очищаем сцену
  435.        this.clear();
  436.  
  437.        // перемещаемся в точку, которая в массиве стоит первой
  438.        this.moveTo(pointArray[0].pointX, pointArray[0].pointY)
  439.  
  440.        // А теперь перебираем все точки
  441.        for (var i:Number = 1; i < 100; i++) {
  442.  
  443.                // пусть линия у нас начинается от абсолютно черной и "уходит" в небытие,
  444.                // то есть становится белой в конце
  445.                // для этого и следующие две строки.
  446.                // чтоб не вдаваться в подробности, лиш скажу что в переменной RGB мы должны
  447.                // получить цвет оттенка серого в строковом формате "0000"
  448.                var colort = int((100 - i) * 255 / 100);
  449.                var RGB = "0x" + Number(colort + colort * 256 + colort * 256 * 256).toString(16);
  450.  
  451.                // определяем стиль для линии, при этом пусть у начала линия будет тонкой,
  452.                // а в конце - 20
  453.                this.lineStyle(20 - 19 * i / 100, RGB, 100, true, "none", "round", "round", 1);
  454.  
  455.                // непосредственно рисуем линию до текущей точки
  456.                this.lineTo(pointArray[i].pointX, pointArray[i].pointY);
  457.  
  458.                // а теперь немного сместим координаты уже отрисованной точки от центра
  459.                // коэффициент 1.03 регулирует скорость "полета"
  460.                // (предупреждая упреки неиспользования переменной скажу - мне было впадло :)
  461.                pointArray[i].pointX = 1.03 * (pointArray[i].pointX - centerX) + centerX;
  462.                pointArray[i].pointY = 1.03 * (pointArray[i].pointY - centerY) + centerY;
  463.        }
  464.  
  465.        // теперь удаляем координаты первой точки
  466.        pointArray.shift();
  467.        // и добавляем в конец массива координаты курсора
  468.        pointArray.push({pointX:_xmouse, pointY:_ymouse}); }
  469.  
  470. //-----------------------------------------------------------------------
  471. //-----------------------------------------------------------------------
  472. //-----------------------------------------------------------------------
  473. //-----------------------------------------------------------------------
  474.  
  475. var Molnia:MovieClip = new MovieClip;
  476. var timer1:Timer = new Timer(Math.random()*3000 + 2000, 1);
  477. timer1.addEventListener("timer", onTimer1);
  478. timer1.start();
  479.  
  480.  
  481. function onTimer1(event:TimerEvent):void {
  482.     molnia();                                            
  483.     var timer2:Timer = new Timer(500, 1);              
  484.     timer2.addEventListener("timer", onTimer2);
  485.     timer2.start();
  486.     var timer1:Timer = new Timer(Math.random()*6000 + 2000, 1);
  487.     timer1.addEventListener("timer", onTimer1);
  488.     timer1.start();
  489. }
  490.  
  491.  
  492. function molnia():void {
  493.     var startX:Array = new Array;                         //координаты старта
  494.     var startY:Array = new Array;                         //
  495.     var conX:Array = new Array;                            //координаты финиша
  496.     var conY:Array = new Array;                            //
  497.     var col:Number = 10;                                       //кол-во возможных ветвей молнии
  498.     var pix:Number = 1;                                         //ширина пера
  499.     var width_:Number = 10;                                 //длина единичного отрезка
  500.     var curveQuant:Number = 20;                         //количество изгибов
  501.     var dlt:Number = 15;                                       //максимальное отклонение при изгибе
  502.     var remX:Array = new Array;;                        //промежуточные начальные значения участка ломаной
  503.     var remY:Array = new Array;;                        //
  504.     var remX0:Number;
  505.     var i:int;                                                          //счетчики
  506.     var j:int;
  507. ///////////  начальные значения для переменных  ////////////
  508. //задаем х из которого будет расти молния
  509. startX[0] = Math.random()*800;       //800 - это ширина мувиклипа Molnia_mc
  510. startY[0] = 0;
  511. for (j = 1; j <= col-1; j++) {            //обнуляем массивы
  512. startX[j] = startX[0];
  513. startY[j] = startY[0];
  514. }
  515. remX = startX;
  516. remY = startY;
  517.  
  518. ///////////   рисуем молнию      ////////////////
  519.     Molnia.graphics.lineStyle(pix, 0xFFFFFF); // настройка параметров линии которой будем рисовать
  520.     for(i = 1; i <= curveQuant; i++){        //по коленам
  521.         for (j = 1; j <= col; j++) {        //по веткам
  522.             if (j == 1) {                    //основная ветвь
  523.                 conX[0] = remX[0] + (Math.random()*dlt - dlt/2);
  524.                 conY[0] = remY[0] + (width_- Math.random()*dlt/4);
  525.                 Molnia.graphics.moveTo(remX[0], remY[0]);   // ставим перо
  526.                 Molnia.graphics.lineTo(conX[0], conY[0]);     //рисуем черту
  527.                 addChild(Molnia);                 // добавляем на экран
  528.                 remX0 = remX[0];
  529.                 remX[0] = conX[0];
  530.                 remY[0] = conY[0];
  531.             } else {
  532.                 var q:Number = Math.random()*i;
  533.                 if ((q < (i / curveQuant)) || (remX0 !== remX[j-1])) {        //для ответвившейся части
  534.                     conX[j-1] = remX[j-1] + (Math.random()*dlt - dlt/2);      //задаем конечную точку рисования черты
  535.                     conY[j-1] = remY[j-1] + (width_- Math.random()*dlt/4);
  536.                 } else {                                                    //для не ответвившейся
  537.                     conX[j-1] = conX[0];
  538.                     conY[j-1] = conY[0];
  539.                 }
  540.                 Molnia.graphics.moveTo(remX[j-1], remY[j-1]);   //ставим перо
  541.                 Molnia.graphics.lineTo(conX[j-1], conY[j-1]);    //рисуем
  542.                 addChild(Molnia);            //отображаем
  543.                 remX[j-1] = conX[j-1];
  544.                 remY[j-1] = conY[j-1];
  545.             }
  546.         }
  547.     Molnia.filters = [new GlowFilter(0xAAAAFF, 1.0, 6.0, 6.0, 3, 1, false, false)];    //применяем к молнии фильтр
  548.     Nebo_mc.alpha = 100;   //отображаем небо
  549.     }
  550. }
  551.  
  552.  
  553. function onTimer2(event:TimerEvent):void {
  554.     Molnia.graphics.clear();
  555.     Nebo_mc.alpha = 0
  556. }
  557.  
  558. //-----------------------------------------------------------------------
  559. //-----------------------------------------------------------------------
  560. //-----------------------------------------------------------------------
  561. //-----------------------------------------------------------------------
  562.  
  563. <?xml version="1.0" encoding="utf-8"?>
  564. <playlist>
  565.         <url>0.mp3</url>
  566.         <url>1.mp3</url>
  567. </playlist>
  568.  
  569.  
  570.  
  571. var playlist:XML = new XML();                     //создаем объект для работы с нашим плэйлистом XML ...
  572. var loader:URLLoader = new URLLoader();         //этим будем загружать наш XML
  573.  
  574. var setPosition:int = 0;                         //здесь будем хранить позицию воспроизведения при нажатии паузы и т.п.
  575. var soundObj:Sound = new Sound();                 //наш основной объект для работы
  576. var soundCha:SoundChannel = new SoundChannel(); //позволит управлять каналом воспроизведения
  577. var soundTrans:SoundTransform = new SoundTransform(); //для звука и получания данных для аналийзера
  578. var reqUrl:URLRequest = new URLRequest();         //для загрузки mp3 в объект Sound
  579. this.progress_mc.status_mc.width = 0;             //устанавливаем показатель уровня загрузки в 0
  580. this.progress_mc.progressfill_mc.x = -200;         //и показатель воспроизведения в позицию -200 что будет видется тоже как 0
  581. var loaded:Number = 0;                             //для правильного просчитывания отображения места воспроизведения
  582. var soundBytes:ByteArray = new ByteArray();     //для хранения данных о звуке
  583. var arrayUrl:Array = new Array();                  //массив для адресов mp3
  584. var array:Array = new Array();                  //для хранения преобразованных данных о звуке
  585. var volumeP:Number = 1;                         //для хранения уровня громкости звука
  586. var volumeS:Number = 1;                         //тоже
  587. var track:int = 0;                                 //номер текущего трэка для воспроизведения
  588. var offmark:Boolean = false;                     //для кнопки MUTE
  589.  
  590.  
  591. //события и слушатели. основа
  592. function initPlayMp3():void {
  593.     Play_btn.addEventListener(MouseEvent.CLICK, startPlay);             //присвоим реакцию на клик мышки нашим элементам интерфейса
  594.     Pause_btn.addEventListener(MouseEvent.CLICK, stopPlay);
  595.     volume_mc.addEventListener(MouseEvent.CLICK, volumePlay);
  596.     progress_mc.addEventListener(MouseEvent.CLICK, progressPlay);
  597.     offVolume_btn.addEventListener(MouseEvent.CLICK, offvolumePlay);
  598.     onVolume_btn.addEventListener(MouseEvent.CLICK, onvolumePlay);
  599.     Next_btn.addEventListener(MouseEvent.CLICK, nextTrack);
  600.     Prev_btn.addEventListener(MouseEvent.CLICK, prevTrack);
  601.     Stop_btn.addEventListener(MouseEvent.CLICK, fullStop);
  602.  
  603.     loader.addEventListener(Event.COMPLETE, whenLoaded);         //событие вызовется когда XML фал будет загружен
  604.     loader.load(new URLRequest("playlist.xml"));                 //а это адрес того что будем загружать
  605.  
  606.     volume_mc.buttonMode = true;                                //определим свойсто для нужных нам клипов что бы при наведении на них курсор менялся на руку
  607.     progress_mc.buttonMode = true;
  608.  
  609.     offVolume_btn.visible = false;                                //скроем кнопки которые не нужны
  610.     Pause_btn.visible = false;
  611. }
  612.  
  613. //загрузка xml
  614. function whenLoaded(event:Event):void {            //если загрузка XML прошла успешно то в наш массив с адресами запишем все ее содержимое
  615.     playlist = XML(event.target.data);
  616.     for(var i:int = 0; i< playlist.url.length(); i++) {
  617.          arrayUrl[i] = playlist.url[i].text();
  618.     }
  619.     name_txt.text = "0" + "/" +arrayUrl.length + " Исполнитель - Название Песни";    //и обновим тектовое поле добавив туда информацию о колличестве трэков
  620. }
  621.  
  622. //Прогресс загрузки
  623. function LoadProgress(event:ProgressEvent):void{
  624.     var loadedsound:Number;
  625.     loadedsound = Math.round(100 * (event.bytesLoaded / event.bytesTotal));     // просчитываем уровень загрузки
  626.     set_txt.text = "Загруженo: " + loadedsound + "%";                             // обновляем значение в тектовом поле
  627.     progress_mc.status_mc.width = loadedsound*2;                                 // и  увеличиваем полоску загрузки в прогресс баре
  628. }
  629.  
  630. //Следующий трек
  631. function nextTrack(event:MouseEvent):void{             //Запускается когда нажата кнопка СЛЕДУЮЩИЙ ТРЕК
  632.     Play_btn.visible = false;                         // определяем какие кнопки управления должны быть видимыми а какие нет
  633.     Pause_btn.visible = true;
  634.     if((track+1)<arrayUrl.length){                     // определяем на какой трек нам переключаться
  635.          track++;
  636.     } else {
  637.          track = 0;
  638.     }
  639.     try {                                             // пытаемся выполнить стоп и закрытие канала, если канал уже закрыт (загрузка закончилась) то оное вызовет ошибку и выполнение перейдет к catch
  640.          soundCha.stop();
  641.          soundObj.close();
  642.     } catch(e:Error){
  643.          soundCha.stop();                             // просто остановим
  644.     }
  645.     PlaySound();                                    // и запустим воспроизведение нового трека
  646. }
  647.  
  648. //Предыдущий трек
  649. function prevTrack(event:MouseEvent):void{             //Запускается когда нажата кнопка Предыдущий ТРЕК
  650.     Play_btn.visible = false;                         // определяем какие кнопки управления должны быть видимыми а какие нет
  651.     Pause_btn.visible = true;
  652.     if((track-1)>=0){                     // определяем на какой трек нам переключаться
  653.          track--;
  654.     } else {
  655.          track = arrayUrl.length-1;
  656.     }
  657.     try {                                             // пытаемся выполнить стоп и закрытие канала, если канал уже закрыт (загрузка закончилась) то оное вызовет ошибку и выполнение перейдет к catch
  658.          soundCha.stop();
  659.          soundObj.close();
  660.     } catch(e:Error){
  661.          soundCha.stop();                             // просто остановим
  662.     }
  663.     PlaySound();                                    // и запустим воспроизведение нового трека
  664. }
  665.  
  666. function fullTrack(event:Event):void{ // определяет новый трэк и переходит к нему
  667.     Play_btn.visible = false;                         // определяем какие кнопки управления должны быть видимыми а какие нет
  668.     Pause_btn.visible = true;
  669.     if((track+1)<arrayUrl.length){
  670.         track++;
  671.     } else {
  672.         track = 0;
  673.     }
  674.     soundCha.stop();
  675.     PlaySound();
  676. }
  677.  
  678. // полный стоп
  679. function fullStop(event:MouseEvent):void{// останавливает воспроизведение и если звук открыт закрывает загрузку
  680.     setPosition = 0;//позицию воспроизведения в ноль
  681.     try {
  682.         soundCha.stop();
  683.         soundCha = soundObj.play(0);
  684.         soundCha.stop();
  685.         soundObj.close();
  686.     } catch(e:Error){
  687.         soundCha.stop();
  688.         soundCha = soundObj.play(0);
  689.         soundCha.stop();
  690.     }
  691.     Play_btn.visible = true;                        
  692.     Pause_btn.visible = false;
  693. }
  694.  
  695. //чтение тэгов
  696. function id3Handler(event:Event):void {
  697.     name_txt.text=(track+1)+"/"+arrayUrl.length+"  "+soundObj.id3.artist + " - " + soundObj.id3.songName;
  698. }
  699.  
  700. //кнопка ПУСК
  701. function startPlay(event:MouseEvent):void{
  702.     Play_btn.visible = false;                        
  703.     Pause_btn.visible = true;
  704.     PlaySound(); // запускаем основную функцию воспроизведения звука
  705. }
  706.  
  707. //Кнопка ПАУЗА
  708. function stopPlay(event:MouseEvent):void{
  709.     setPosition = soundCha.position; // запоминаем позицию воспроизведения
  710.     volumeS = soundTrans.volume; // и уровень звука
  711.     Play_btn.visible = true;
  712.     Pause_btn.visible = false;
  713.     soundCha.stop(); // останавливаем воспроизведение
  714. }
  715.  
  716. //определение нового места проигрывания
  717. function progressPlay(event:MouseEvent):void{// вызывается когда кликнули на полосе отображающей загрузку и воспроизведение
  718.     volumeS = soundTrans.volume;
  719.     soundCha.stop();
  720.     soundCha = soundObj.play((soundObj.length*loaded) * event.currentTarget.mouseX/200); // определяем координату куда ткнули // и взависимости от этого помещаем точку воспроизведения в нужное нам место
  721.     soundTrans.volume = volumeS;
  722.     soundCha.soundTransform = soundTrans;
  723.     soundCha.addEventListener(Event.SOUND_COMPLETE, fullTrack); // востанавливаем событие реагирующее на конец трэка
  724.     Play_btn.visible = false;                        
  725.     Pause_btn.visible = true;
  726. }
  727.  
  728. //установка уровня звука
  729. function volumePlay(event:MouseEvent):void{
  730.     offmark = false;
  731.     volume_mc.volumefill_mc.width = event.currentTarget.mouseX; // определяем куда ткнули и изменяем размер маски
  732.     soundTrans.volume = (event.currentTarget.mouseX*5)/100; // устанавливаем громкость звука
  733.     volumeP = volumeS = soundTrans.volume;
  734.     soundCha.soundTransform = soundTrans;
  735.     offVolume_btn.visible = false;
  736.     onVolume_btn.visible = true;
  737. }
  738.  
  739. //включение звука
  740. function offvolumePlay(event:MouseEvent):void{
  741.     offmark = false;
  742.     offVolume_btn.visible = false;
  743.     onVolume_btn.visible = true;
  744.     volume_mc.volumefill_mc.width = (volumeP*100)/5;
  745.     soundTrans.volume = volumeP;
  746.     soundCha.soundTransform = soundTrans;
  747. }
  748.  
  749. //Выключение звука
  750. function onvolumePlay(event:MouseEvent):void{
  751.     offmark = true;
  752.     volumeP = soundTrans.volume;
  753.     offVolume_btn.visible = true;
  754.     onVolume_btn.visible = false;
  755.     volume_mc.volumefill_mc.width = 0;
  756.     soundTrans.volume = 0;
  757.     soundCha.soundTransform = soundTrans;
  758. }
  759.  
  760. //основная ПУСК функция
  761. function PlaySound():void{ // основная функция которая воспроизводит звук
  762.     reqUrl.url = arrayUrl[track]; // получаем адрес трека
  763.     var nextTitle:Sound = new Sound(reqUrl);// т.к. в один объект два звука не загрузить то мы создаем промежуточный объект загружаем в него а потом просто приравниваем основной к нему загружаем его
  764.     soundObj = nextTitle;
  765.  
  766.     name_txt.text = (track+1)+"/"+arrayUrl.length+" Не удалось прочитать ID3 тэги"; // делаем стандартную строку (она станется если функция чтения тэгов ее не обновит)
  767.     soundObj.addEventListener(ProgressEvent.PROGRESS, LoadProgress); // создаем слушатель прогреса загрузки
  768.     soundObj.addEventListener(Event.ID3, id3Handler); // и получения тэгов
  769.     addEventListener(Event.ENTER_FRAME, Progress); // и ENTER_FRAME для програсса воспроизведения
  770.  
  771.     soundCha = soundObj.play(setPosition); // запускаем звук в нужном нам канале с определенной позиции
  772.  
  773.     soundTrans.volume = volumeS; // устанавливаем кромкость
  774.     soundCha.soundTransform = soundTrans; // и присваиваем ее каналу нужному
  775.     soundCha.addEventListener(Event.SOUND_COMPLETE, fullTrack); // запустит функцию меняющую трэк при достижении конца трэка текущего
  776.  
  777.     if(offmark){// обработка уровня громкости если включено MUTE
  778.         soundTrans.volume = 0;
  779.         soundCha.soundTransform = soundTrans;
  780.     } else {
  781.      soundTrans.volume = volumeS;
  782.      soundCha.soundTransform = soundTrans;
  783.     }
  784. }
  785.  
  786. //отображение прогреса воспроизведения
  787. function Progress(event:Event):void {
  788.     loaded = soundObj.bytesTotal/soundObj.bytesLoaded;// просчитываем какую часть мы загрузили это нужно для поправики в отображения прогресса
  789.     progress_mc.progressfill_mc.x = Math.round(200*(soundCha.position/(soundObj.length*loaded)))-200;// двигаем полосу прокресса
  790.     var allsec:int = Math.floor(soundCha.position/1000);// и считаем секунды воспроизведения
  791.     var min:int = Math.floor(allsec/60);//
  792.     var sec:int = allsec-(Math.floor(allsec/60)*60);//
  793.     if(sec<10){
  794.          time_txt.text = String(min)+".0"+String(sec);//формируем текстовую строку с итогами посдчетов
  795.     } else {
  796.          time_txt.text = String(min)+"."+String(sec);//формируем текстовую строку с итогами посдчетов
  797.     }
  798. }
  799.  
  800. initPlayMp3();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement